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 的补丁成因,附脚本采集系统指纹实战示例。

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

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/,实测创建过程见第四章场景。

参数速查表(每项实测值均来自第三章):

参数长参数输出字段本机实测值
(无参数)—等价于 -sLinux
-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 一家,常用工具横向对比——

命令 / 文件所属软件包关注点适用场景
unamecoreutils内核名 / 节点名 / 内核版本 / 架构速览脚本判断内核与架构
archcoreutils仅输出机器架构(等价 uname -m)极简取架构
nproccoreutils可用 CPU 逻辑核数设置构建并发数
hostnamehostname主机名(可读可改)主机名查看与修改
hostnamectlsystemd主机名 + 系统版本 + 内核一览systemd 主机巡检
cat /proc/versionprocfs内核完整编译信息(编译器、时间戳)溯源内核构建
lscpuutil-linuxCPU 详细拓扑(核 / 线程 / 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。

六、参考链接