前几天帮同事写部署脚本,他问「怎么在脚本里判断系统版本」。我说 uname 一行就行,他回我「uname 输出 5.15,我要的是 Ubuntu 22.04」。这就是很多人卡住的地方:Linux 的版本有两层,内核一层,发行版一层,查法完全不同。
内核和发行版不是一回事
uname -r 看到的是内核版本,比如 5.15.0-91-generic。这个数字和 Ubuntu、CentOS 的版本号没有对应关系,同一个 Ubuntu 22.04 既能跑 5.15 也能跑 6.2。所以问「系统什么版本」,得先确认问的是哪一个。
uname -r # 5.15.0-91-generic
uname -m # x86_64查发行版认准 os-release
systemd 系的发行版基本都有 /etc/os-release,内容是键值对,写脚本时直接 source 最省事。
cat /etc/os-release
# NAME="Ubuntu"
# VERSION="22.04.4 LTS (Jammy Jellyfish)"
# VERSION_ID="22.04"老系统可能只有 /etc/redhat-release 或 /etc/debian_version,格式各不相同,能用 os-release 就别用它们。
版本号每段什么意思
- Ubuntu 22.04.4:22 是年份,04 是月份,最后一位是修订版。
- CentOS 7.9.2009:7 是大版本,2009 表示 2020 年 9 月。
- Debian 12.5:12 是 Bookworm 大版本,5 是稳定版更新次数。
记住这个规律,看到一串数字大概就能判断新旧,不用每次都去搜。
LTS 和滚动更新的区别
Ubuntu 偶数年 4 月发布的是 LTS,维护 5 年;奇数年的普通版只维护 9 个月,生产环境基本只上 LTS。Arch、Tumbleweed 属于滚动更新,没有版本号,天天最新,适合桌面折腾,不适合跑数据库。还要留意 EOL,CentOS 7 已经在 2024 年 6 月停止维护,很多机器 yum 源全部 404 就是这个原因。
脚本里怎么判断
别用 lsb_release,精简镜像经常没装,直接读文件最稳。
. /etc/os-release
if [ "$ID" = "ubuntu" ] && [ "${VERSION_ID%%.*}" -ge 22 ]; then
echo "可用新版源"
fi${VERSION_ID%%.*} 是把小数点后面的截掉,只留主版本号做比较。注意 VERSION_ID 是字符串,用 -ge 之前最好确认是纯数字。
排查问题要版本信息时,内核、发行版、架构三个一次给全,能省好几轮来回。