uname 命令详解与参数实测(Ubuntu 22.04)
逐参数实测 Ubuntu 22.04 的 uname:无参与 -s/-n/-r/-v/-m/-p/-i/-o、-a 全量、组合参数输出顺序、退出码与 /proc/version 对照,解析 Ubuntu 下 -p/-i 显示 x86_64 而非 unknown 的补丁成因,附脚本采集系统指纹实战示例。
uname 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 uname 的每一个常用参数——无参默认行为、-s/-n/-r/-v/-m/-p/-i/-o 单参数输出、-a 全量信息、组合参数输出顺序、退出码与 /proc/version 对照,全部命令与回显已在 Ubuntu 22.04(GNU coreutils 8.32 / 内核 6.8.0-138-generic)实测通过。
一、环境信息
本章记录实测环境的操作系统、内核与软件包版本,保证文中所有回显可追溯、可复现。以下信息均为在实测机上真实采集。
- 操作系统:Ubuntu 22.04.5 LTS(取自
/etc/os-release的PRETTY_NAME,实测见下) - 内核版本:6.8.0-138-generic(
uname -r实测) - 硬件架构:x86_64(
uname -m实测) - 主机名:f1034b9326b2(
uname -n实测,云主机默认随机节点标识) - 工具版本:GNU coreutils 8.32(软件包
coreutils 8.32-4.1ubuntu1.4,uname --version实测) - 演示数据目录:
/root/demo/uname/(本文落盘示例均在此目录,实测创建)
环境基线采集命令与实测回显:
head -2 /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
dpkg -l coreutils | tail -1
ii coreutils 8.32-4.1ubuntu1.4 amd64 GNU core utilities
💡 说明:uname 属于 GNU coreutils 软件包,Ubuntu 22.04 的 base 系统自带,无需额外安装;软件包版本
8.32-4.1ubuntu1.4与uname --version显示的上游版本 8.32 对应(后缀是发行版修订号)。
二、命令概览
2.1 语法与测试数据
uname(unix name)用于输出内核与系统的基础标识信息:内核名称、网络节点主机名、内核发行号、内核版本(构建信息)、机器硬件架构等。它读取的是内核通过 uname() 系统调用暴露的数据,因此输出的是"当前正在运行的内核"的真实状态。
官方语法(来自 --help 首行):
Usage: uname [OPTION]...
即:uname [选项]...,不接位置参数,只吃选项;选项可以单写,也可以组合连写(如 -snrvm)。
本文测试数据约定:
- 全部演示输出均在上述环境(Ubuntu 22.04.5 LTS / x86_64 / 内核 6.8.0-138-generic / 主机名 f1034b9326b2)实测采集;
- 落盘演示目录
/root/demo/uname/,实测创建过程见第四章场景。
参数速查表(每项实测值均来自第三章):
| 参数 | 长参数 | 输出字段 | 本机实测值 |
|---|---|---|---|
| (无参数) | — | 等价于 -s | Linux |
-s | --kernel-name | 内核名称 | Linux |
-n | --nodename | 网络节点主机名 | f1034b9326b2 |
-r | --kernel-release | 内核发行号 | 6.8.0-138-generic |
-v | --kernel-version | 内核版本(构建信息) | #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC |
-m | --machine | 机器硬件架构 | x86_64 |
-p | --processor | 处理器类型 | x86_64(Ubuntu 补丁行为,详见 3.7) |
-i | --hardware-platform | 硬件平台 | x86_64(Ubuntu 补丁行为,详见 3.8) |
-o | --operating-system | 操作系统标识 | GNU/Linux |
-a | --all | 全部信息按固定顺序输出 | 见 3.10 |
关键差异:-r 是"内核发行号"(对应内核软件包版本,排查模块兼容性用它),-v 是"内核构建时间戳与编译配置"(同一发行号下不变),-m 是脚本判断架构的唯一可靠依据(-p/-i 可移植性差,帮助文本自标注 non-portable)。
2.2 --help 全量输出(逐行照抄)
以下为 uname --help 的完整实测回显,逐行照抄未删减:
uname --help
Usage: uname [OPTION]...
Print certain system information. With no OPTION, same as -s.
-a, --all print all information, in the following order,
except omit -p and -i if unknown:
-s, --kernel-name print the kernel name
-n, --nodename print the network node hostname
-r, --kernel-release print the kernel release
-v, --kernel-version print the kernel version
-m, --machine print the machine hardware name
-p, --processor print the processor type (non-portable)
-i, --hardware-platform print the hardware platform (non-portable)
-o, --operating-system print the operating system
--help display this help and exit
--version output version information and exit
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/uname>
or available locally via: info '(coreutils) uname invocation'
逐项解读:
- 首行第二句
With no OPTION, same as -s.明确了无参数调用的语义——等价于-s; -a, --all的描述里有一句关键限定:except omit -p and -i if unknown,即当-p/-i取不到值(unknown)时,-a会省略这两个字段(本机因发行版补丁取到了值,见 3.7/3.8);-p、-i两项帮助文本自带(non-portable)标注,提示这两个字段的输出跨系统不可移植,脚本中判断架构应使用-m。
2.3 版本信息
版本是排查"为什么我的输出和你不一样"的第一现场,实测如下:
uname --version
uname (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie.
对照软件包版本:
dpkg -l coreutils | tail -1
ii coreutils 8.32-4.1ubuntu1.4 amd64 GNU core utilities
💡 技术拓展:Linux 下查看"系统 / 内核 / 主机"信息的命令不止 uname 一家,常用工具横向对比——
命令 / 文件 所属软件包 关注点 适用场景 uname coreutils 内核名 / 节点名 / 内核版本 / 架构速览 脚本判断内核与架构 arch coreutils 仅输出机器架构(等价 uname -m)极简取架构 nproc coreutils 可用 CPU 逻辑核数 设置构建并发数 hostname hostname 主机名(可读可改) 主机名查看与修改 hostnamectl systemd 主机名 + 系统版本 + 内核一览 systemd 主机巡检 cat /proc/version procfs 内核完整编译信息(编译器、时间戳) 溯源内核构建 lscpu util-linux CPU 详细拓扑(核 / 线程 / NUMA) CPU 深度排查 本文主角 uname 覆盖"内核 + 节点名 + 架构"的绝大多数脚本场景;需要更细的 CPU 拓扑用 lscpu,需要内核编译溯源用
/proc/version(实测对照见 3.13)。
三、参数逐项实测
本章逐个参数实测:每个参数给出实测命令、真实回显与要点说明。回显全部逐字照抄自实测日志。
3.1 无参数(等价于 -s)
不加任何参数调用 uname,按帮助文本约定等价于 -s,只输出内核名称。实测:
uname
Linux
对照 -s 的输出(见 3.2)完全一致,验证等价关系。
💡 要点:脚本里看到裸写
uname的老代码,读的就是内核名,与-s等价;想要完整信息必须显式-a或组合参数。
3.2 -s(--kernel-name)内核名称
输出内核名称,Linux 系统上固定为 Linux。实测:
uname -s
Linux
💡 要点:这是最小白也最没信息量的字段,但它决定了 uname 无参数时的默认输出;跨平台脚本(Linux/Darwin/FreeBSD 分支判断)常用
uname -s区分系统家族。
3.3 -n(--nodename)网络节点主机名
输出网络节点主机名(nodename),与 hostname 命令读到的值一致。实测:
uname -n
f1034b9326b2
对照 hostname 命令:
hostname
f1034b9326b2
两者输出完全一致:内核只维护一份 nodename,uname -n 与 hostname 读的是同一数据源。
💡 要点:
uname -n只读不写;hostname除了读还能改主机名(hostname 新名字)。二者的详细差异与选型见第五章 Q2。
3.4 -r(--kernel-release)内核发行号
输出内核发行号(release),对应 Ubuntu 内核软件包的版本命名。实测:
uname -r
6.8.0-138-generic
解读:6.8.0 是上游内核版本,-138 是 Ubuntu 打补丁的修订号,-generic 是内核风味(通用版)。
💡 要点:安装或编译内核模块(如网卡驱动、DKMS 包)前,第一件事就是
uname -r确认目标内核;装了新内核但未重启,uname -r仍显示旧值——它反映的是"正在运行的内核"。
3.5 -v(--kernel-version)内核版本(构建信息)
输出内核版本号字段,内容是构建编号 + 编译配置 + 构建时间戳。实测:
uname -v
#138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC
解读:#138 是同一内核源码的第 138 次构建,SMP 表示支持多处理器,PREEMPT_DYNAMIC 表示内核抢占模式可动态切换,最后是构建时间。
💡 要点:
-r回答"是哪个内核包",-v回答"这个内核是什么时候、以什么配置编出来的";排查"两台机器都是 6.8.0-138-generic 却行为不同"时,对比-v可发现构建差异。
3.6 -m(--machine)机器硬件架构
输出机器硬件架构名。实测:
uname -m
x86_64
💡 要点:这是脚本判断架构的标准做法——
[ "$(uname -m)" = "x86_64" ]即可分支下载 amd64/arm64 软件包(实战示例见 4.1)。常见取值:x86_64(64 位 Intel/AMD)、aarch64(64 位 ARM)、i686(32 位 x86)、armv7l(32 位 ARM)。
3.7 -p(--processor)处理器类型
输出处理器类型。注意:帮助文本自标注 non-portable(不可移植)。实测:
uname -p
x86_64
这里出现一个重要的实测现象:很多教材说 uname -p 会输出 unknown,但本机(Ubuntu 22.04,coreutils 8.32-4.1ubuntu1.4)实测输出 x86_64,且连续 3 轮测试结果稳定。
成因(有实证依据):上游原版 coreutils 在 Linux x86_64 上,内核的 uname() 系统调用并不提供处理器类型字段,因此原版行为是输出 unknown(帮助文本 except omit -p and -i if unknown 说的就是这种情况)。而 Debian/Ubuntu 对 coreutils 打了发行版补丁 80_fedora_sysinfo.patch,让 -p/-i 回落到真实的处理器/硬件名。发行版更新日志中的补丁描述实测如下:
- debian/patches/80_fedora_sysinfo.patch
+ Make 'uname -i -p' return the real processor/hardware,
instead of unknown.
💡 要点:本机看到的
x86_64是"Ubuntu 补丁后行为";在未打该补丁的系统(如原版 coreutils 构建)上会看到unknown,且此时uname -a会自动省略 -p/-i 字段。脚本判断架构永远用-m,不要依赖-p。
3.8 -i(--hardware-platform)硬件平台
输出硬件平台,同样标注 non-portable。实测:
uname -i
x86_64
与 -p 同理:本机因发行版补丁(见 3.7)输出真实值 x86_64;原版 coreutils 上会输出 unknown。
💡 要点:
-m/-p/-i三者在 x86_64 的 Ubuntu 上输出值相同,但语义不同:-m是机器架构(内核提供、可靠),-p/-i是处理器/硬件平台(原版不可靠、Ubuntu 补丁后可用)。跨发行版脚本只信-m。
3.9 -o(--operating-system)操作系统标识
输出操作系统标识。实测:
uname -o
GNU/Linux
💡 要点:
GNU/Linux是 GNU 用户态 + Linux 内核组合的固定标识,区分度不高;想知道具体发行版(Ubuntu/Debian/CentOS)应读/etc/os-release,不要指望-o。
3.10 -a(--all)全量信息
按固定顺序输出全部字段:内核名 节点名 内核发行号 内核版本 机器架构 处理器类型 硬件平台 操作系统。实测:
uname -a
Linux f1034b9326b2 6.8.0-138-generic #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC x86_64 x86_64 x86_64 GNU/Linux
字段逐段对照:
| 顺序 | 字段 | 实测值 |
|---|---|---|
| 1 | 内核名(-s) | Linux |
| 2 | 节点名(-n) | f1034b9326b2 |
| 3 | 内核发行号(-r) | 6.8.0-138-generic |
| 4 | 内核版本(-v) | #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC |
| 5 | 机器架构(-m) | x86_64 |
| 6 | 处理器类型(-p) | x86_64 |
| 7 | 硬件平台(-i) | x86_64 |
| 8 | 操作系统(-o) | GNU/Linux |
注意实测输出中 UTC 之后有两个空格:这是内核版本字符串自身以空格结尾所致(构建时间戳后有尾随空格),-a 按字段拼接时表现为双空格,属正常现象(详见第五章 Q4)。
💡 要点:
-a是报障贴日志、问问题时最常被要求的"一行环境指纹";如果某个系统的 -p/-i 是 unknown,-a会按帮助约定自动省略这两个字段,输出会比本机短两段。
3.11 组合参数与输出顺序(-snrvm)
uname 的多个参数可以连写。实测验证:无论参数在命令行上以什么顺序书写,输出始终按"内核名 → 节点名 → 发行号 → 版本 → 架构"的固定顺序排列。实测:
uname -snrvm
Linux f1034b9326b2 6.8.0-138-generic #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC x86_64
把参数顺序完全倒过来再测:
uname -vmrns
Linux f1034b9326b2 6.8.0-138-generic #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC x86_64
两次输出逐字相同:参数书写顺序不影响输出顺序,uname 内部按固定字段序输出,且组合时不包含 -o(除非显式给出,实测 -snrvm 末尾没有 GNU/Linux)。
💡 要点:与
-a对比,-snrvm=-a减去-p -i -o;需要"内核+节点+版本+架构"但不要操作系统标识时,组合参数比-a更精炼。
3.12 退出码与错误提示
非法参数的行为与退出码,是脚本健壮性设计的依据。实测非法长参数:
uname --bogus; echo rc=$?
uname: unrecognized option '--bogus'
Try 'uname --help' for more information.
rc=1
正常调用退出码为 0,实测:
uname -a >/dev/null; echo rc=$?
rc=0
💡 要点:成功 0、失败 1。脚本中可以
uname -r >/dev/null 2>&1 || exit 1之类的写法兜底;错误提示会引导用户去看--help。
3.13 与 cat /proc/version 对照
/proc/version 记录内核的完整构建信息,可与 uname -v 交叉验证。实测:
cat /proc/version
Linux version 6.8.0-138-generic (buildd@lcy02-amd64-008) (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04.3) 12.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC
对照结论:/proc/version 的版本号(6.8.0-138-generic)与构建号(#138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC)和 uname -r、uname -v 的输出完全对应,但 /proc/version 额外给出编译者(buildd@lcy02-amd64-008)与编译器版本(gcc-12 12.3.0、ld 2.38)。
💡 要点:日常取内核版本用
uname -r就够;要溯源"这个内核是谁用哪个编译器编的"才需要/proc/version。
四、实战示例
本章给出 4 个组合场景,覆盖架构分支、内核采集、系统指纹落盘与日志标注,全部实测通过。演示数据统一落盘到 /root/demo/uname/(实测创建):
mkdir -p /root/demo/uname
4.1 按架构分支选择软件包
下载软件包(如二进制工具、JDK、静态链接包)时,需要按机器架构选 amd64 还是 arm64。实测:
[ "$(uname -m)" = "x86_64" ] && echo "x86_64 架构:下载 amd64 软件包" || echo "非 x86_64 架构:按实际架构选择"
x86_64 架构:下载 amd64 软件包
说明:$(uname -m) 是命令替换,取当前架构参与比较;这是安装脚本中最常见的 uname 用法。
💡 要点:架构判断只用
-m,不用-p/-i(原因见 3.7 的 non-portable 说明)。
4.2 安装脚本中打印内核信息
安装脚本(尤其是装内核模块、DKMS、特定内核头文件的场景)第一步打印目标内核。实测:
echo "当前内核:$(uname -r)"
当前内核:6.8.0-138-generic
uname -sr
Linux 6.8.0-138-generic
说明:uname -sr 组合"内核名 + 发行号",一行即可确认系统家族与内核版本,常用于安装日志首行。
4.3 系统指纹一键落盘
巡检或交付时,把"内核 + 架构"指纹写入文件存档。实测:
uname -srm > /root/demo/uname/kernel-and-arch.txt && cat /root/demo/uname/kernel-and-arch.txt
Linux 6.8.0-138-generic x86_64
同目录另存完整指纹 uname-a.txt 与 kernel-release.txt(实测写入并回读):
uname -a > /root/demo/uname/uname-a.txt
cat /root/demo/uname/uname-a.txt
Linux f1034b9326b2 6.8.0-138-generic #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC x86_64 x86_64 x86_64 GNU/Linux
uname -r > /root/demo/uname/kernel-release.txt
cat /root/demo/uname/kernel-release.txt
6.8.0-138-generic
实测目录内容:
ls -l /root/demo/uname/
total 8
-rw-r--r-- 1 root root 18 Oct 15 13:50 kernel-release.txt
-rw-r--r-- 1 root root 133 Oct 15 13:50 uname-a.txt
4.4 日志中标注主机名
分布式排障时,每台机器的日志都需要带主机名标识。实测:
echo "host=$(uname -n)" > /root/demo/uname/host.txt && cat /root/demo/uname/host.txt
host=f1034b9326b2
说明:uname -n 与 hostname 输出一致(见 3.3),在脚本里用哪个都行;uname -n 的好处是 uname 几乎存在于所有类 Unix 系统,跨平台脚本无需额外依赖。
五、注意事项与常见问题
Q1:为什么很多资料说 uname -p / -i 显示 unknown,本机却显示 x86_64?
这是发行版补丁差异。上游原版 coreutils 8.32 在 Linux 上,内核 uname() 系统调用不提供处理器/硬件平台字段,原版行为输出 unknown(帮助文本 -a ... omit -p and -i if unknown 即对应此场景);Debian/Ubuntu 打了 80_fedora_sysinfo.patch,让 -p/-i 回落为真实硬件名,因此 Ubuntu 22.04 实测输出 x86_64(补丁证据见 3.7)。结论:跨发行版脚本判断架构一律用 -m,不要依赖 -p/-i。
Q2:uname -n 和 hostname 有什么区别?
两者读取的是内核里同一份 nodename 数据,实测输出完全一致(见 3.3)。区别在于能力:uname -n 只读;hostname 既能读也能临时改名(hostname 新名字),还能带 -f 查 FQDN、-i/-I 查 IP。临时改名后 uname -n 会同步变化(同一数据源),重启后临时改名即失效。需要看主机名选哪个都行,需要改主机名或查 FQDN/IP 只能用 hostname(systemd 主机上还有 hostnamectl 可持久化改名)。
Q3:uname -r 显示的内核和刚装的内核包不一致?
uname -r 反映的是当前正在运行的内核,不是刚安装的版本。装了新内核后必须重启,uname -r 才会变成新值;升级后核对内核是否切换成功,就对比 uname -r 与已安装内核包列表中的目标版本。
Q4:为什么 uname -a 的输出里 UTC 后面有两个空格?
内核的版本字符串(utsname.version)以时间戳结尾且自带一个尾随空格,-a 按字段用单空格拼接时,"版本"与"架构"之间就出现了两个空格。实测本机 uname -a 中 ...UTC x86_64 x86_64 x86_64 GNU/Linux 即此现象,属内核数据原样,不是输出错误;对空格敏感的解析脚本建议分别调用单个参数再自行拼接。
Q5:uname 参数写错时退出码是多少?怎么写健壮脚本?
实测非法参数退出码为 1,正常输出为 0(见 3.12)。健壮脚本的标准写法:uname -r 之类调用后用 || exit 1 兜底,或直接判断 $?;uname 本身只读内核信息,失败场景基本只有参数写错。
Q6:-r 和 -v 都叫"版本",到底怎么区分?
-r(release)是内核发行号,如 6.8.0-138-generic,对应内核软件包与模块版本匹配;-v(version)是构建信息,如 #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 7 13:43:15 UTC,记录构建号、编译配置与时间戳。记法:-r 找软件包用,-v 溯源构建用。
Q7:组合参数 -snrvm 的输出顺序由什么决定?
由 uname 内部的固定字段序决定(内核名 → 节点名 → 发行号 → 版本 → 架构),与命令行上参数的书写顺序无关(实测对照见 3.11,-snrvm 与 -vmrns 输出逐字相同)。另外组合参数不会自动带上 -o 的 GNU/Linux,需要操作系统标识请显式加 -o 或用 -a。
六、参考链接
- uname(1) 手册页(man7.org):https://man7.org/linux/man-pages/man1/uname.1.html
- uname(2) 系统调用手册页(man7.org):https://man7.org/linux/man-pages/man2/uname.2.html
- GNU coreutils 官方手册 uname 章节:https://www.gnu.org/software/coreutils/manual/html_node/uname-invocation.html
- Ubuntu 22.04 (jammy) uname 手册页:https://manpages.ubuntu.com/manpages/jammy/en/man1/uname.1.html
- GNU coreutils 官网:https://www.gnu.org/software/coreutils/
- procfs 内核文档(version 相关):https://docs.kernel.org/filesystems/proc.html