在 Linux 世界中,每个发行版都有其独特的特性和配置方式。对于系统管理员、开发者或自动化脚本来说,准确地识别当前运行的操作系统类型和版本是一项基本且关键的需求。传统上,不同发行版使用各自的文件(如 /etc/redhat-release、/etc/debian_version 等)来存储系统信息,这导致了碎片化且缺乏统一标准。
为了解决这一问题,systemd 项目引入了 /etc/os-release 文件,作为 Linux 发行版标识的标准化接口。该文件提供了一个统一、简洁且易于解析的方式来获取操作系统信息,极大地简化了跨发行版的兼容性处理。
本文将深入解析 /etc/os-release 文件的规范、字段含义、使用场景及最佳实践,帮助您全面掌握这一重要工具。
/etc/os-release?/etc/os-release 是一个由 systemd 项目定义的、用于标识 Linux 发行版的标准文件。它采用简单的 键值对(key=value) 格式,提供了关于操作系统名称、版本、ID、支持状态等关键信息。
该文件最初由 systemd 引入,但现在已被广泛接受,成为 Linux 标准基础(LSB, Linux Standard Base) 的一部分。几乎所有现代 Linux 发行版(如 Ubuntu、Debian、CentOS、RHEL、Fedora、Arch、openSUSE 等)都支持该文件。
根据规范,/etc/os-release 文件应优先存在于以下两个位置之一:
/etc/os-release(推荐位置)
这是系统管理员和软件包最常修改的位置,优先级最高。
/usr/lib/os-release(备用位置)
当 /etc/os-release 不存在时,系统会回退到读取此文件。通常由发行版的软件包管理系统维护,不建议手动修改。
提示
最佳实践:始终优先检查 /etc/os-release,若不存在再读取 /usr/lib/os-release。
/etc/os-release 文件遵循以下语法规则:
KEY="value"。$ID 或 ${ID}。\" 表示双引号,\$ 表示美元符号,\n 表示换行等。""" 实现(较少使用)。# 开头的行被视为注释,会被忽略。/etc/os-release 文件包含两类字段:必选字段 和 可选字段。以下是所有字段的详细说明:
| 字段名 | 说明 | 示例 |
|---|---|---|
NAME | 操作系统的完整名称(人类可读) | "Ubuntu" |
ID | 操作系统的小写唯一标识符(无空格,仅字母、数字、-、_) | "ubuntu" |
PRETTY_NAME | 美观的完整名称,通常包含版本号 | "Ubuntu 22.04.3 LTS" |
VERSION_ID | 操作系统的版本号(数字形式,便于程序解析) | "22.04" |
| 字段名 | 说明 | 示例 |
|---|---|---|
VERSION | 完整的版本描述(人类可读) | "22.04.3 LTS (Jammy Jellyfish)" |
VERSION_CODENAME | 版本的代号(如 Ubuntu 的“Jammy”) | "jammy" |
ID_LIKE | 表示与哪些其他发行版兼容(空格分隔) | "debian" |
ANSI_COLOR | 终端中显示名称时使用的 ANSI 颜色代码 | "1;31"(红色) |
CPE_NAME | 符合 CPE(Common Platform Enumeration) 规范的标识符 | "cpe:/o:canonical:ubuntu:22.04" |
HOME_URL | 项目主页 URL | "https://www.ubuntu.com/" |
DOCUMENTATION_URL | 官方文档 URL | "https://help.ubuntu.com/" |
SUPPORT_URL | 技术支持 URL | "https://ubuntu.com/support" |
BUG_REPORT_URL | 提交 bug 的 URL | "https://bugs.launchpad.net/ubuntu/" |
PRIVACY_POLICY_URL | 隐私政策 URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" |
BUILD_ID | 构建标识符(如镜像构建 ID) | "2023-08-10" |
VARIANT | 系统变体(如“server”、“desktop”) | "Server Edition" |
VARIANT_ID | 系统变体的标识符 | "server" |
LOGO | 图标名称(符合 freedesktop.org 图标规范) | "ubuntu-logo" |
/etc/os-release 支持在值中引用其他变量,语法为 $KEY 或 ${KEY}。这在需要动态拼接信息时非常有用.假设文件内容如下:
bashID=ubuntu
VERSION_ID=22.04
PRETTY_NAME="$NAME $VERSION_ID LTS"
解析后,PRETTY_NAME 的实际值为:Ubuntu 22.04 LTS
bashNAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
VERSION_CODENAME=jammy
UBUNTU_CODENAME=jammy
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
bashNAME="CentOS Stream"
VERSION="9"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="9"
PLATFORM_ID="platform:el9"
PRETTY_NAME="CentOS Stream 9"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:centos:centos:9"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"
bashNAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/"
LOGO=archlinux-logo
bashcat /etc/os-release
或使用 grep 提取特定字段:
bashgrep "^ID=" /etc/os-release
bash#!/bin/bash
# 安全地加载变量
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "发行版: $PRETTY_NAME"
echo "版本号: $VERSION_ID"
else
echo "无法识别操作系统"
fi
pythonimport os
def get_os_info():
info = {}
try:
with open('/etc/os-release', 'r') as f:
for line in f:
if '=' in line:
key, value = line.strip().split('=', 1)
info[key] = value.strip('"')
except FileNotFoundError:
pass
return info
os_info = get_os_info()
print("系统名称:", os_info.get('NAME'))
print("版本:", os_info.get('VERSION_ID'))
| 场景 | 示例 |
|---|---|
| 系统检测脚本 | 自动适配不同发行版的包管理器(apt vs yum vs pacman) |
| 安装程序 | 根据系统版本下载正确的软件包 |
| 监控与日志 | 在日志中记录系统环境信息 |
| 容器镜像 | 在 Dockerfile 中识别基础镜像类型 |
| 安全扫描 | 匹配 CVE 数据库中的系统版本 |
/etc/os-release,回退到 /usr/lib/os-release。/etc/issue 或 /etc/*release 文件(如 redhat-release),它们是非标准的。/usr/lib/os-release,它由系统维护。. /etc/os-release 前确认文件存在。ID_LIKE 字段以处理衍生发行版(如 Ubuntu → Debian)。注意
声明:本文基于 systemd 官方文档编写,内容截至 2025 年 10 月。建议定期查阅官方文档以获取最新信息。


本文作者:蒋固金
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!