uname -a
表示“内核版本”为3.10.0
[root@iZbp16uggk8lf3x949ewxiZ ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@iZbp16uggk8lf3x949ewxiZ ~]# uname -a
Linux iZbp16uggk8lf3x949ewxiZ 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
LINUX_VERSION_CODE
还表示当前内核版本为3.10.0
[root@iZbp16uggk8lf3x949ewxiZ ~]# grep -rni "LINUX_VERSION_CODE" /usr/include/
/usr/include/linux/version.h:1:#define LINUX_VERSION_CODE 199168
但是当我发现一个核函数tcp_rtx_synack
存在时
[root@iZbp16uggk8lf3x949ewxiZ ~]# cat /proc/kallsyms | grep tcp_rtx_synack
ffffffff952a0700 t tcp_rtx_synack.part.26
ffffffff952a0730 T tcp_rtx_synack
ffffffff95721f90 r __ksymtab_tcp_rtx_synack
ffffffff95739e78 r __kcrctab_tcp_rtx_synack
ffffffff95765c36 r __kstrtab_tcp_rtx_synack
3.17存在https://elixir.bootlin.com/linux/v3.17/A/ident/tcp_rtx_synack函数tcp_rtx_synack
3.16 https://elixir.bootlin.com/linux/v3.17/A/ident/tcp_rtx_synack函数tcp_rtx_synack
不存在
这意味着我的centos内核版本至少是3.17
,而不是3.10
我正在编写eBPF,它需要更准确的内核版本信息,因为每个内核版本的函数和数据结构都不同。
我在不同的云配置程序上购买了两个虚拟机,两个虚拟机都显示如上。
1条答案
按热度按时间llmtgqce1#
CentOS与RHEL一样,包含对旧内核版本的各种补丁(特性、修复等)的后向移植。因此,您不能依赖内核版本来了解哪些特性或功能可用。
相反,您可以从用户空间探测可用的特性(例如,使用
bpftool feature probe
),或者使用CO-RE通过BTF检测它。