优先用 /etc/os-release,因其最可靠、标准化、跨发行版通用,字段清晰且脚本友好;它由 systemd 生态统一维护,Ubuntu 16.04+、CentOS 7+等现代发行版均支持,不依赖额外包,而 lsb_release 可能未安装,uname -r 仅显示内核版本。

直接看 /etc/os-release,它是最可靠、最标准化的来源,字段清晰、脚本友好、跨发行版通用。
为什么优先用 cat /etc/os-release
这个文件由 systemd 生态统一维护,几乎所有现代发行版(Ubuntu 16.04+、CentOS 7+、Debian 8+、Fedora、Alpine 3.9+)都写入了结构化字段。不像 lsb_release 可能未预装,也不像 /etc/redhat-release 或 /etc/debian_version 那样只对特定发行版有效。
-
NAME和PRETTY_NAME告诉你实际用的是什么系统(比如 “Ubuntu” 还是 “Ubuntu Server”) -
VERSION_ID是机器可读的纯数字版本号(如"22.04"),适合脚本做条件判断 -
ID字段小写且稳定(ubuntu、centos、rocky),比lsb_release -i的输出更一致 - 不依赖额外包,无需安装
lsb-core或redhat-lsb-core
lsb_release -a 用之前先确认是否已安装
它输出人类可读性强,但不是所有系统默认带 —— 尤其是精简镜像、容器或最小化安装的系统。运行后提示 command not found 很常见。
- Ubuntu/Debian:用
sudo apt install lsb-release(注意不是lsb-core,后者是旧包) - RHEL/CentOS/Rocky:用
sudo dnf install redhat-lsb-core或sudo yum install redhat-lsb-core - 输出里的
Codename(如focal)对查文档有用,但脚本中不如/etc/os-release的VERSION_CODENAME字段稳定 - 某些定制版(如 Amazon Linux、Oracle Linux)可能返回空或不完整信息
hostnamectl 适合快速扫一眼,别当唯一依据
它调用 systemd 的 D-Bus 接口读取系统信息,输出简洁,但字段少、格式不固定,且仅限于使用 systemd 的系统(即排除 Alpine、Devuan、旧版 CentOS 6 等)。
- 执行
hostnamectl后找Operating System:行,它通常拼接了NAME和VERSION,但没单独暴露VERSION_ID - 在 CI/CD 或容器里常被禁用 D-Bus,此时命令会卡住或报错
Failed to get properties: No such interface - 它不显示
ID_LIKE这类关键兼容性字段,不利于判断发行版谱系(比如区分 Rocky 和 AlmaLinux)
别把 uname -r 当系统版本用
uname -r 输出的是内核版本(如 5.15.0-101-generic),不是发行版版本。混用会导致部署失败 —— 比如误以为 Ubuntu 20.04 和 22.04 内核相同就能跑同款 deb 包,其实 libc、glibc、systemd 版本全不同。
- 真正需要内核信息时才用:
uname -r(精简)、uname -a(含架构和主机名) -
/proc/version内容冗长,含编译器信息,日常排查几乎不用 - 看到
x86_64或aarch64别误判为系统版本,那是硬件架构
真要写自动化脚本,只依赖 /etc/os-release 并用 source /etc/os-release 加载变量;人工查就 cat /etc/os-release | grep -E "^(NAME|VERSION_ID|ID)" 三行足够。其他方法都是备选,且得先判断环境是否支持。


















