登录一台不熟悉的服务器,或者看别人甩来的一句「我这内核是 5.15」,第一件要做的事往往是核对版本。这次换个角度,从「远程和批量场景下怎么一把问明白」来讲。

一条命令看全:/etc/os-release

uname 只能看内核,要看发行版和版本号,os-release 文件最可靠,几乎所有主流发行版都有这个文件:

cat /etc/os-release

输出里的 PRETTY_NAME 就是给人看的那句话,比如 Ubuntu 22.04.3 LTS。老系统可能只有 /etc/issue,格式五花八门,参数化解析容易翻车。

自己用的速查命令

cat /etc/redhat-release   # CentOS、Rocky、Alma
cat /etc/debian_version   # Debian
lsb_release -a            # 装了 lsb 包才可用
uname -r                  # 只看内核版本

红帽系的 redhat-release 一出就够,Debian 系有时候只有 debian_version,所以实际排障里用「先 os-release,没有就逐个试」的写法最稳。

脚本中怎么判断

判断发行版别去解析 Pretty Name 那串中文、英文混合的字符串,直接用 ID 和 VERSION_ID 两个变量,它们是稳定的机器可读字段:

source /etc/os-release
echo "$ID $VERSION_ID"   # ubuntu 22.04

再把 ID_LIKE 一起考虑,Rocky、Alma 的值是 rhel fedora,写兼容逻辑时用 ID_LIKE 做兜底比穷举发行版名省事。

批量排查的玩法

手上有几十台机器,可以用 SSH 循环执行,把结果按主机名输出成一张表:

for h in $(cat hosts.txt); do
  echo -n "$h  "
  ssh -o ConnectTimeout=3 $h 'grep ^PRETTY_NAME /etc/os-release'
done

加上超时参数很关键,一台连不通不会卡住整轮。收集完再横向看:有没有还是 CentOS 7 的老机器、内核是不是低于要求版本,补丁计划要不要排。

两个容易搞混的地方

  • 发行版版本和内核版本是两条线:Ubuntu 22.04 的内核是 5.15,升级内核不会改变发行版号。
  • 容器里看到的往往是宿主内核:在 Docker 里执行 uname -r 得到的是宿主机的,os-release 才是镜像的基础系统。

一句话:查发行版看 os-release,查内核看 uname -r,脚本里只认 ID 和 VERSION_ID。