lsb_release 命令详解与参数实测(Ubuntu 22.04)

以 Ubuntu 22.04.5 LTS(lsb-release 11.1.0ubuntu4)为实测环境,逐参数验证 lsb_release 的 -i/-d/-r/-c/-v/-a 信息选项、-s 短格式单用与组合、无参数默认行为、-h 与非法参数退出码,并实测 /etc/lsb-release 与 /etc/os-release 两个数据源的内容、字段映射与脚本化取版本方案,含 Python 脚本本体的实现细节与非 root 行为。

Linux命令Linux系统UbuntuUbuntu 22.04命令行系统信息2026/10/16

lsb_release 命令详解与参数实测(Ubuntu 22.04)

实测目标:在 Ubuntu 22.04.5 LTS 服务器上逐个验证 lsb_release 的全部选项,弄清它显示的每个字段从哪里来,并给出脚本里"识别发行版"的正确姿势。全部命令均为真实执行取证。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(jammy),x86_64
  • 命令路径:/usr/bin/lsb_release(dpkg -S 确认属于 lsb-release 包)
  • 软件包版本:lsb-release 11.1.0ubuntu4(dpkg -l 与 apt-cache policy 双重确认)
  • 命令本体:Python 脚本(file 识别为 Python script, ASCII text executable,首行 #!/usr/bin/python3 -Es,共 95 行)
  • 数据源文件:/etc/lsb-release 与 /etc/os-release(内容实测见 3.12 节)
  • 执行身份:root 与普通用户(非 root 行为实测见 3.14 节)

二、命令概览

2.1 语法与测试数据

Usage: lsb_release [options]

lsb_release 是 LSB(Linux Standard Base)发行版识别工具,功能单一:回答"这台机器跑的是什么发行版、什么版本"。四个信息选项对应四个字段,-a 打包全部,-s 把带标签的长格式换成纯值短格式。

测试数据约定:命令无任何状态副作用(只读工具),本文所有示例均按"命令 → 回显"原样引用,可直接在自己的 Ubuntu 22.04 机器上复跑。

💡 技术拓展:Linux 上"识别发行版"有四条路,权重各不相同——lsb_release(LSB 标准,Ubuntu/Debian 系传统首选)、/etc/os-release(systemd 推广的事实标准,几乎全发行版通用)、hostnamectl(systemd 机器上的静态信息面板)、/etc/issue(登录提示用语,不适合脚本)。lsb_release 的数据最终就来自 /etc/lsb-release,而后者与 os-release 的字段一一对应(3.12 节实测对照表)。

2.2 --help 全量输出

lsb_release --help
Usage: lsb_release [options]

Options:
  -h, --help         show this help message and exit
  -v, --version      show LSB modules this system supports
  -i, --id           show distributor ID
  -d, --description  show description of this distribution
  -r, --release      show release number of this distribution
  -c, --codename     show code name of this distribution
  -a, --all          show all of the above information
  -s, --short        show requested information in short format

共 8 个选项:4 个信息位(-v/-i/-d/-r/-c,其中 -v 是第五个信息位"LSB 模块")、1 个聚合位(-a)、1 个格式位(-s)。lsb_release -h 输出与之一致。

2.3 版本信息

dpkg -l lsb-release | tail -1
apt-cache policy lsb-release | head -3
ii  lsb-release    11.1.0ubuntu4 all          Linux Standard Base version reporting utility

lsb-release:
  Installed: 11.1.0ubuntu4
  Candidate: 11.1.0ubuntu4

注意一个高频误区:lsb_release -v 显示的不是 lsb_release 程序的版本号,而是"本系统支持的 LSB 模块"(见 3.2 节)。要查命令自身的版本,用 dpkg -l lsb-release(本文即 11.1.0ubuntu4)。

三、参数逐项实测

3.1 无参数:默认行为

lsb_release
No LSB modules are available.

不带参数时等价于 lsb_release -v,只显示 LSB 模块状态。标准 Ubuntu 22.04 没装 LSB 模块包,所以永远输出这句话——这是新装机器上最常见的现象,不是故障(FAQ Q2)。

3.2 -v / --version:LSB 模块支持情况

lsb_release -v
No LSB modules are available.

-v 回答"这套系统支持哪些 LSB 子模块"(如 core、cxx、printing 等)。本机未安装 lsb-core 等模块包,因此显示"无可用 LSB 模块"。若安装了 lsb-core,这里会变成一行行的模块名与版本号。

3.3 -i / --id:发行商 ID

lsb_release -i
Distributor ID:	Ubuntu

长格式自带 Distributor ID: 标签(标签后是制表符)。该值对应 /etc/lsb-release 里的 DISTRIB_ID=Ubuntu。

3.4 -d / --description:发行版描述

lsb_release -d
Description:	Ubuntu 22.04.5 LTS

这是人类可读的完整名称,对应 DISTRIB_DESCRIPTION="Ubuntu 22.04.5 LTS",也是屏幕上最常被引用的一行。

3.5 -r / --release:发行版号

lsb_release -r
Release:	22.04

对应 DISTRIB_RELEASE=22.04。做版本比较时用它(配合 -s 拿纯值)。

3.6 -c / --codename:代号

lsb_release -c
Codename:	jammy

对应 DISTRIB_CODENAME=jammy。拼 APT 软件源地址、找第三方仓库时最常用的就是它(源地址里写的是 jammy 而不是 22.04)。

3.7 -a / --all:全部信息

lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.5 LTS
Release:	22.04
Codename:	jammy
退出码=0

-a 是 -v -i -d -r -c 的聚合,输出顺序固定:LSB 模块行在最前,四个字段紧随。排障时一条命令拿全景。

3.8 -s / --short:短格式(单用与组合)

lsb_release -si
lsb_release -sd
lsb_release -sr
lsb_release -sc
lsb_release -sv
lsb_release -sa
Ubuntu
Ubuntu 22.04.5 LTS
22.04
jammy
No LSB modules are available.

No LSB modules are available.
Ubuntu
Ubuntu 22.04.5 LTS
22.04
jammy
  • 单个信息位加 -s:只输出值本身,无标签、无制表符——脚本取值的标准姿势;
  • 实测顺序 -si -sd -sr -sc -sv 各自输出一行,最后一行 -sv 在短格式下同样输出 No LSB modules are available.(LSB 行没有"值"形态);
  • -sa(-a 与 -s 组合):按 -a 的固定顺序输出全部五行,LSB 模块行依然打头。

组合两个信息位也是合法的:

lsb_release -d -r
lsb_release -si -sr
Description:	Ubuntu 22.04.5 LTS
Release:	22.04

Ubuntu
22.04

长格式组合按参数顺序输出带标签行;短格式组合按顺序各出一行纯值。

3.9 -h / --help 与退出码

lsb_release -h
Usage: lsb_release [options]

Options:
  -h, --help         show this help message and exit
  -v, --version      show LSB modules this system supports
  -i, --id           show distributor ID
  -d, --description  show description of this distribution
  -r, --release      show release number of this distribution
  -c, --codename     show code name of this distribution
  -a, --all          show all of the above information
  -s, --short        show requested information in short format

与 --help 全量输出一致(2.2 节),退出码 0。

3.10 非法参数与退出码

lsb_release -z
Usage: lsb_release [options]

lsb_release: error: no such option: -z

不存在的选项报 no such option 并返回退出码 2,Usage 打到 stderr。退出码速查:正常 0;参数错 2。

3.11 数据源之一:/etc/lsb-release

cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.5 LTS"

lsb_release -i/-d/-r/-c 显示的四个值与这四行键值一一对应(-v 的 LSB 模块信息则来自已安装的 LSB 包,不在此文件)。该文件由 base-files 包提供(dpkg -S /etc/lsb-release 实测确认),也就是说它是发行版元数据,不是 lsb-release 软件包私有的。

3.12 数据源之二:/etc/os-release 与字段对照

cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
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"
UBUNTU_CODENAME=jammy

/etc/os-release 是指向 /usr/lib/os-release 的符号链接(ls -l 实测),同样由 base-files 提供。两个数据源的字段映射关系:

lsb_release 显示/etc/lsb-release/etc/os-release
Distributor ID: UbuntuDISTRIB_ID=UbuntuID=ubuntu / NAME="Ubuntu"
Description: Ubuntu 22.04.5 LTSDISTRIB_DESCRIPTION="Ubuntu 22.04.5 LTS"PRETTY_NAME="Ubuntu 22.04.5 LTS"
Release: 22.04DISTRIB_RELEASE=22.04VERSION_ID="22.04"
Codename: jammyDISTRIB_CODENAME=jammyVERSION_CODENAME=jammy(另有 UBUNTU_CODENAME=jammy)

os-release 字段更多(含 ID_LIKE、各 URL),且它是全 Linux 世界的通用约定;lsb-release 文件只有 LSB 四键。

3.13 命令本体的实现细节

file /usr/bin/lsb_release
head -3 /usr/bin/lsb_release
wc -l /usr/bin/lsb_release
/usr/bin/lsb_release: Python script, ASCII text executable
#!/usr/bin/python3 -Es

# lsb_release command for Debian
95 /usr/bin/lsb_release

Ubuntu 的 lsb_release 是一个 95 行的 Python 脚本(解释器 #!/usr/bin/python3 -Es,-E 忽略环境变量、-s 不加用户站点目录),逻辑就是解析上面两个数据源文件再按参数拼输出——这解释了它为什么对系统没有副作用,也解释了 3.11/3.12 节"数据源在哪、显示就从哪来"。

3.14 非 root 执行

setpriv --reuid 65534 --regid 65534 --clear-groups lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.5 LTS
Release:	22.04
Codename:	jammy

普通用户(甚至 nobody)执行结果与 root 完全一致,退出码 0——数据源文件全局可读,该命令无任何权限要求,可以放心写进任意用户的登录脚本。

3.15 技术拓展:lsb_release 与 /etc/os-release 读取方案对比

对比项lsb_release 命令source /etc/os-releasecat /etc/lsb-releasehostnamectl
形态独立命令(Python 脚本)shell 直接 . 导入变量shell 解析键值systemd 命令
依赖lsb-release 包无(base-files 自带)无(base-files 自带)systemd
发行版覆盖Debian 系为主全主流发行版Debian 系为主systemd 发行版
字段数4+1(LSB 四键+模块)12+(含 URL、ID_LIKE)4数个
脚本友好度高(-s 出纯值)高(导出即变量)中(需自己 parse)低(输出面向人)
持久保证有包维护systemd 标准规范有包维护systemd 维护
实测取值lsb_release -sc → jammy$VERSION_CODENAME → jammygrep CODENAME → jammyhostnamectl 静态区

选型结论(均来自实测):交互查询/给人看用 lsb_release -a,输出规整、有标签;脚本取值首选 . /etc/os-release 后用变量(无外部依赖、全发行版通用),Ubuntu/Debian 专用脚本用 lsb_release -s* 也完全可靠。

四、实战示例

4.1 按发行版分支执行不同逻辑

. /etc/os-release
case "$ID" in
  ubuntu)  echo "Ubuntu 分支:apt 系" ;;
  debian)  echo "Debian 分支:apt 系" ;;
  centos|rhel|rocky) echo "RHEL 分支:yum/dnf 系" ;;
  *)       echo "未知发行版:$ID" ;;
esac
Ubuntu 分支:apt 系

(os-release 的 ID=ubuntu 来自 3.12 节实测内容。)

4.2 用代号拼 APT 软件源行

. /etc/os-release
echo "deb http://archive.ubuntu.com/ubuntu ${VERSION_CODENAME} main restricted universe multiverse"
echo "deb http://archive.ubuntu.com/ubuntu ${VERSION_CODENAME}-updates main restricted universe multiverse"
deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse

软件源地址用的是代号 jammy(3.6 节)而非版本号 22.04——这是新手最常见的拼接错误。等价的 lsb_release 写法:CODENAME=$(lsb_release -sc)。

4.3 CI/巡检脚本断言系统版本

. /etc/os-release
if [ "$ID" = "ubuntu" ] && [ "$VERSION_ID" = "22.04" ]; then
  echo "环境符合要求:$(lsb_release -sd)"
else
  echo "环境不符:${PRETTY_NAME}"; exit 1
fi
环境符合要求:Ubuntu 22.04.5 LTS

断言用 os-release 变量(无依赖、可移植),报告行用 lsb_release -sd 拿标准描述——两者混用各取所长。

五、注意事项与常见问题

Q1:lsb_release -v 为什么不是版本号?显示 "No LSB modules are available." 是不是坏了? 不是坏了,是 -v 的语义本来就不同(3.2 节)。-v 显示的是 LSB 模块支持情况,标准 Ubuntu 桌面/服务器都不装 LSB 模块包,所以固定输出这句话。要查 lsb_release 命令自身的版本用 dpkg -l lsb-release(本文实测 11.1.0ubuntu4)。想让这行变成模块清单,安装 lsb-core 等包即可,但除个别商业软件外通常没必要。

Q2:脚本里到底用 lsb_release 还是 /etc/os-release? 看依赖与可移植性。lsb_release -s* 输出干净、Debian 系可靠,但要求装了 lsb-release 包;. /etc/os-release 零依赖、全发行版通用,是 systemd 时代的标准做法。3.15 节对比表的结论:给人看用 lsb_release -a,给脚本用 os-release 变量。两者同源(都由 base-files 维护,3.11/3.12 节实测),数值不会打架。

Q3:lsb_release -a 会不会改系统状态?需要 root 吗? 都不会。命令本体是 95 行只读 Python 脚本(3.13 节),非 root 与 root 输出完全一致(3.14 节实测)。可以放心放进任意监控、巡检、登录脚本。

Q4:为什么有的系统没有 /etc/lsb-release?lsb_release 还能用吗? Debian 系之外不少发行版不提供该文件,此时 lsb_release(若存在)只能部分工作甚至不存在。/etc/os-release 则是 systemd 发行版的标准件,几乎必有。跨发行版脚本一律以 os-release 为第一数据源,lsb_release 作为 Debian 系的补充——这与本文 3.12 节的字段对照表一致。

六、参考链接