在 Linux 世界里,版本查看其实是个“基本功”,但不同发行版(尤其是 CentOS 和 Ubuntu)因为底层架构和历史沿革不同,命令确实有差异。下面我按系统分类,把最常用、最稳妥的方法列出来,顺便解释一下背后的逻辑,方便你理解而不是死记硬背。
一、CentOS / RHEL 系列(基于 Red Hat)
CentOS 7 之前主要用 lsb_release 或 /etc/redhat-release,CentOS 8/Stream 之后更推荐看 /etc/os-release。
1. 最通用、最推荐:cat /etc/os-release
这是目前几乎所有现代 Linux 发行版都遵循的标准文件,信息最全且格式统一。
cat /etc/os-release
输出示例:
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
...
PRETTY_NAME="CentOS Linux 7 (Core)"
你看 PRETTY_NAME 这一行,直接就能知道是 CentOS 7。如果是 CentOS Stream 8,这里会显示 Stream。
2. 传统方法:cat /etc/redhat-release
这是老派运维人员最爱用的,简单粗暴。
cat /etc/redhat-release
输出示例:
CentOS Linux release 7.9.2009 (Core)
注意:这个方法在较新的 CentOS Stream 或某些精简版系统中可能不存在或不准确,但在 CentOS 7/6 上非常稳。
3. LSB 标准方法:lsb_release -a
需要安装 redhat-lsb-core 包才能用(很多最小化安装的服务器默认没装)。
lsb_release -a
输出示例:
Distributor ID: CentOS
Description: CentOS Linux release 7.9.2009 (Core)
Release: 7.9.2009
Codename: Core
如果提示 command not found,别慌,说明你没装这个工具,直接用上面两个方法就行。
4. 内核版本:uname -r
很多人混淆“操作系统版本”和“内核版本”。如果你只想知道内核是多少:
uname -r
输出示例:
3.10.0-1160.el7.x86_64
这代表内核是 3.10,el7 表示它是为 RHEL/CentOS 7 编译的。
二、Ubuntu / Debian 系列
Ubuntu 基于 Debian,所以有些命令是通用的,但也有自己的特色。
1. 最推荐:cat /etc/os-release
和 CentOS 一样,这是现代 Linux 的标准做法。
cat /etc/os-release
输出示例:
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
...
PRETTY_NAME="Ubuntu 20.04.5 LTS"
一眼就能看到是 20.04 LTS。
2. Ubuntu 专属:lsb_release -a
Ubuntu 默认就装了 lsb-release 包,所以这个命令在 Ubuntu 上几乎必能用,而且输出非常清晰。
lsb_release -a
输出示例:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.5 LTS
Release: 20.04
Codename: focal
注意:第一行“No LSB modules…”可以忽略,不影响判断。重点看 Description 和 Release。
3. 旧版习惯:cat /etc/lsb-release
这个文件内容比 /etc/os-release 少一点,但也很直观。
cat /etc/lsb-release
输出示例:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
4. 内核版本:uname -r
同样适用:
uname -r
输出示例:
5.4.0-142-generic
三、避坑指南 & 实用技巧
-
不要只看
uname -v或uname -a
uname -a会打印所有内核信息,包括主机名、CPU 架构等,虽然能看到内核版本,但看不出是 CentOS 还是 Ubuntu。比如:uname -a # Linux server1 3.10.0-1160.el7.x86_64 #1 SMP ... x86_64 GNU/Linux这里只有
el7暗示了可能是 RHEL/CentOS 7,但不能 100% 确定是 CentOS(也可能是 Rocky、Alma 等兼容系统)。 -
容器环境(Docker/K8s)里的特殊情况
如果你在 Docker 容器里运行这些命令,看到的可能不是宿主机的版本,而是容器镜像的版本。例如一个 Ubuntu 容器里跑lsb_release -a,显示的是容器基础镜像的版本,而不是宿主机 Ubuntu 的版本。要查宿主机版本,得从宿主机操作。 -
一键判断脚本(适合自动化)
如果你写脚本需要判断系统类型和版本,可以用这个组合:#!/bin/bash if [ -f /etc/os-release ]; then . /etc/os-release echo "ID: $ID, VERSION: $VERSION_ID" elif [ -f /etc/redhat-release ]; then cat /etc/redhat-release else echo "Unknown OS" fi
总结
| 系统 | 最推荐命令 | 备选命令 | 备注 |
|---|---|---|---|
| CentOS 7/8/Stream | cat /etc/os-release |
cat /etc/redhat-release |
/etc/redhat-release 在新版中可能缺失 |
| Ubuntu 16.04+ | cat /etc/os-release |
lsb_release -a |
lsb_release 在 Ubuntu 上默认可用,输出友好 |
| 所有 Linux | uname -r |
— | 仅查内核版本,不区分发行版 |
日常工作中,我基本只用 cat /etc/os-release 这一个命令,因为它跨发行版兼容性最好,信息也最标准化。
云技术博客