有人问服务器装的是什么系统,运维回了句CentOS 7,对方敲uname -a看到3.10.0-1160,又疑惑内核怎么才3.10。这两个数字说的不是一回事,一个指发行版,一个指内核。分不清的时候,装软件包特别容易下错rpm。

内核版本和发行版版本是两条线

uname -r输出的是内核版本,3.10.0-1160.el7.x86_64里,3.10.0是主线版本,1160是Red Hat打的补丁号,el7表示给RHEL 7系编译,最后是架构。CentOS 7整个生命周期内核都停在3.10,但补丁号一直往上涨。所以看到3.10别急着说系统老,它可能上周刚打完最新补丁。真正决定软件兼容性的是发行版主版本,不是内核号。

/etc/os-release 每个字段的含义

cat /etc/os-release  uname -m  hostnamectl

NAME是完整名称,ID是给脚本判断用的短名,比如centos、ubuntu、debian、rocky。VERSION_ID是主版本号,脚本里做分支判断基本靠它。PRETTY_NAME是给人看的一整行,各个小版本都改过措辞,别拿它做匹配。ID_LIKE说明跟哪个发行版同源,Rocky和AlmaLinux都写着rhel,所以同一套rpm能装。VERSION_CODENAME是代号,Debian系常用,比如bookworm。

老系统上可能没有这个文件

CentOS 6及更早没有os-release,得看/etc/redhat-release或者/etc/issue。Debian系老版本用lsb_release -a,但这个命令要先装lsb-release包,最小化安装的系统上根本没有,敲下去提示command not found。还有一个坑:/etc/issue里那行字是可以被人改的,登录前显示的欢迎语不代表真实系统,别拿它当依据。

容器里为什么看到的是宿主内核

Docker容器共享宿主机的内核。namespace隔离的是进程、网络、挂载点、用户,内核本身不隔离,也没法隔离。所以在容器里uname -r看到的是宿主版本,cat /etc/os-release看到的却是镜像里的发行版,两个信息对不上完全正常。想在容器里确认底层,看/proc/version里的编译信息,或者直接去宿主机上跑uname -a。

  • 装包前:先看ID和VERSION_ID,再用uname -m确认是x86_64还是aarch64。
  • 报障时:把os-release整段贴出来,比说一句我这是Linux有用得多。