接手一台别人装的服务器,第一件事是确认它到底是什么系统、什么版本。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 进去看。