接手一台别人装的服务器,第一件事是确认它到底是什么系统、什么版本。Linux 发行版太多,命令也不统一,CentOS 用 yum、Ubuntu 用 apt,装错包会白折腾半天。

命令一:cat /etc/os-release

这是目前最通用、最推荐的方式,几乎所有现代发行版都有这个文件:

cat /etc/os-release

输出里 NAME 是发行版名,VERSION_ID 是版本号,PRETTY_NAME 是给人看的完整名称,比如「Ubuntu 22.04.3 LTS」。脚本里判断系统时优先读这个文件。

命令二:lsb_release -a

输出整齐,字段清楚:

lsb_release -a

缺点是有些精简镜像没装这个命令,会提示 command not found。Debian 系需要先装 lsb-release 包。

命令三:hostnamectl

systemd 系统上可以直接用:

hostnamectl

它会一并给出主机名、内核版本、架构和操作系统名称,信息最全,一条命令看全。缺点是老版本 CentOS 6 这类没有 systemd 的系统用不了。

命令四:cat /etc/issue

这个文件通常是登录前显示的那行欢迎语,内容可能是「CentOS Linux release 7.9.2009 (Core)」。优点是几乎所有系统都有,缺点是内容可以被人手动改,不一定可靠。

Debian 系的 /etc/debian_version 只给一个数字,适合快速判断版本号。

命令五:uname -a

注意,这个命令查的是内核,不是发行版。输出里的 Linux 5.15.0-91-generic 是内核版本,和 Ubuntu 22.04 这种发行版版本是两回事。排查驱动、内核模块问题时才看它。

怎么组合使用

最稳的做法是先 os-release,没有再看 issue,两者都拿不到再试 lsb_release。要写跨发行版的脚本,可以这样判断:

. /etc/os-release
case "$ID" in
  ubuntu|debian) echo "Debian 系" ;;
  centos|rhel|rocky) echo "RedHat 系" ;;
esac

还有个容易踩的点:容器里跑的系统,os-release 显示的是容器基础镜像,不是宿主机。查宿主机信息得在宿主机上执行,或者挂载宿主机的 /etc 进去看。