登录一台不熟悉的服务器,或者看别人甩来的一句「我这内核是 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。