상세 컨텐츠

본문 제목

Linux Version check (개발자 버전)

KERNEL

by 이를루 2022. 1. 4. 20:57

본문

리눅스 버전을 확인하는 방법 (개발자 버전)

 

1. 리눅스 버전을 확인하는 방법 (사용자 버전)

/proc/version에서 확인한다~

$ cat /proc/version
username@servername:~$ cat /proc/version
Linux version 5.4.0-80-generic (buildd@lcy01-amd64-028) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #90~18.04.1-Ubuntu SMP Tue Jul 13 11:43:01 UTC 2019
$



2. 리눅스 버전을 확인하는 방법 (개발자 버전)
 관련 소스 코드로 확인한다.

/kernel/fs/proc/version.c
- proc_version_init
 .open  = version_proc_open
- version_proc_open()
  \-- version_proc_show()
      \- utsname->sysname, release, version


위의 예로 보면 3가지가 보인다.   sysname :  release :  version : 

/kernel/include/linux/utsname.h

static inline struct new_utsname *utsname(void)
{
return &current->nsproxy->uts_ns->name;
}

 

/kernel/arch/arm/linux/asm/thread_info.h

struct thread_info {
~~~
struct task_struct *task; /* main task structure */
~~~
}
/kernel/arch/arm/linux/asm/thread_info.h

struct thread_info {
~~~
struct task_struct *task; /* main task structure */
~~~
/kernel/include/linux/sched.h

~~~
/* Namespaces: */
struct nsproxy *nsproxy;
~~~
}

 

/kernel/include/linux/nsproxy.h

struct nsproxy {
~~~
struct uts_namespace *uts_ns;
~~~

 

/kernel/include/linux/utsname.h

struct uts_namespace {
~~~
struct new_utsname name;
~~~

struct new_utsname {
char sysname[__NEW_UTS_LEN + 1];
char nodename[__NEW_UTS_LEN + 1];
char release[__NEW_UTS_LEN + 1];
char version[__NEW_UTS_LEN + 1];
char machine[__NEW_UTS_LEN + 1];
char domainname[__NEW_UTS_LEN + 1];
};




/kernel/init/version.c 가 핵심임..

/kernel/init/version.c

struct uts_namespace init_uts_ns = {
	.kref = KREF_INIT(2),
	.name = {
	.sysname = UTS_SYSNAME,
	.nodename = UTS_NODENAME,
	.release = UTS_RELEASE,
	.version = UTS_VERSION,
	.machine = UTS_MACHINE,
	.domainname = UTS_DOMAINNAME,
	},
	.user_ns = &init_user_ns,
	.ns.inum = PROC_UTS_INIT_INO,
#ifdef CONFIG_UTS_NS
	.ns.ops = &utsns_operations,
#endif
};
EXPORT_SYMBOL_GPL(init_uts_ns);

==> 여기 구조체 선언이 다 있다.  우리는 UTS_RELEASE, UTS_VERSION을 찾으면 된다.


이 내용은 mkcompile_h에서 채워짐 (Makefile에서 호출~)

mkcompile.h

UTS_VERSION="#$VERSION"
UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP"



Makefile 예제

include/generated/compile.h: FORCE
@$($(quiet)chk_compile.h)
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \
"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)"

<--- 즉, 여기서 사용자가 보는 version을 보여주는 header들을 모아서 정리해줌.

 

개발자버전
==> /kernel/generated/compile.h

 

 

 

#어떤 커널 버전인지 기억이 안난다

관련글 더보기