在 Linux 运维和开发日常中,快速准确判断系统版本是基础中的基础。CentOS 和 Ubuntu 虽然都是基于 Debian/RedHat 体系的主流发行版,但它们的版本标识文件结构和命令习惯有所不同。
下面分两类给出最常用、最可靠的命令行方法,并附带一些“避坑”指南。
一、CentOS / RHEL / Rocky Linux / AlmaLinux 系列
这类系统属于 Red Hat 系,核心识别依据是 /etc/os-release 和 /etc/redhat-release。
✅ 推荐方法:使用 cat 或 source 读取 os-release
cat /etc/os-release
输出示例:
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
...
优点:这是 freedesktop.org 标准格式,几乎所有现代 Linux 发行版都支持,信息最全(包括版本号、ID、变体等)。
✅ 快捷方法:只查看主版本号
如果你只需要知道大版本(如 7、8、9),可以用:
cat /etc/redhat-release
输出示例:
CentOS Linux release 7.9.2009 (Core)
或者更简洁地提取数字:
rpm -q centos-release
输出示例:
centos-release-7-9.2009.1.el7.centos.x86_64
⚠️ 注意:
lsb_release -a在 CentOS 上默认可能未安装redhat-lsb-core包,需手动安装才能用,不推荐作为首选。
二、Ubuntu / Debian 系列
Debian 系系统同样支持 /etc/os-release,但也有自己的传统方式。
✅ 推荐方法:同样使用 cat /etc/os-release
cat /etc/os-release
输出示例:
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
...
优点:与 CentOS 统一,便于写跨发行版的脚本。
✅ 经典方法:lsb_release
Ubuntu 通常预装了 lsb_release 工具:
lsb_release -a
输出示例:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy
💡 小技巧:如果只想看版本号,可以简化为:
lsb_release -rs输出:
22.04
✅ 备用方法:hostnamectl
hostnamectl
输出中包含 OS 字段,适合 systemd 环境:
Static hostname: ubuntu-server
Icon name: computer-vm
Chassis: vm
Machine ID: xxxxxxxx
Boot ID: yyyyyyyy
Operating System: Ubuntu 22.04.3 LTS
Kernel: Linux 5.15.0-91-generic
Architecture: x86-64
三、通用技巧 & 脚本写法建议
1. 编写跨发行版兼容脚本时,优先使用 /etc/os-release
因为它是标准化文件,且内容结构化,易于解析:
# 获取操作系统名称
OS_NAME=$(grep "^NAME=" /etc/os-release | cut -d'"' -f2)
# 获取版本号
OS_VERSION=$(grep "^VERSION_ID=" /etc/os-release | cut -d'"' -f2)
echo "System: $OS_NAME, Version: $OS_VERSION"
2. 避免使用不可靠的方法
- ❌
uname -a:只显示内核版本,不是发行版版本。 - ❌
cat /etc/issue:可能被修改,且信息不完整。 - ❌
cat /etc/system-release:非标准路径,不同发行版不一致。
3. 容器环境下的特殊情况
如果你在 Docker 容器内,可能没有完整的 /etc/os-release 或 lsb_release。此时可尝试:
cat /etc/os-release 2>/dev/null || cat /etc/debian_version 2>/dev/null || echo "Unknown"
四、总结对比表
| 方法 | CentOS/RHEL | Ubuntu/Debian | 可靠性 | 备注 |
|---|---|---|---|---|
cat /etc/os-release |
✅ 支持 | ✅ 支持 | ⭐⭐⭐⭐⭐ | 最推荐,标准化 |
cat /etc/redhat-release |
✅ 支持 | ❌ 无此文件 | ⭐⭐⭐⭐ | 仅适用于 Red Hat 系 |
lsb_release -a |
⚠️ 需安装 | ✅ 通常自带 | ⭐⭐⭐⭐ | 信息清晰,但依赖包 |
hostnamectl |
✅ 支持 | ✅ 支持 | ⭐⭐⭐⭐ | 需 systemd,适合服务管理场景 |
uname -r |
✅ 显示内核 | ✅ 显示内核 | ⭐⭐ | 不是发行版版本 |
最后提醒
在实际生产环境中,尤其是涉及软件兼容性、安全补丁时,务必以 /etc/os-release 中的 VERSION_ID 为准。不要仅凭 lsb_release 或 uname 做判断,以免因环境差异导致部署失败。
如有特定场景(如自动化脚本、容器镜像构建),欢迎进一步说明,我可以提供对应的代码片段。
云技术博客