리눅스 버전을 확인하는 방법 (개발자 버전)
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 ¤t->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
#어떤 커널 버전인지 기억이 안난다
[퍼옴] 만화로 나누는 자유/오픈소스 소프트웨어 이야기 (0) | 2023.01.26 |
---|---|
특정 driver 소스코드 찾기 (0) | 2022.06.11 |
[팁] 루트 파일시스템 종류 찾기 (mount, tree) (0) | 2022.01.18 |
Makefile의 MRPROPER의 의미 (0) | 2022.01.12 |