在 Linux 里查硬件序列号,并不存在一条“放之四海而皆准”的命令,通常得按具体部件分别处理:查整机序列号可用sudo dmidecode -t system,查主板可用sudo dmidecode -t baseboard,查硬盘可用sudo udevadm info --name=/dev/sda | grep -i "id_serial",查内存则用sudo dmidecode -t memory;另外,这类查询在多数情况下都需要root权限。

Linux 查硬件序列号没有“一条命令通吃”的解法,不同部件必须用不同工具、不同路径,且多数情况需要 root 权限——不加 sudo 就跑 dmidecode,基本等于白跑。
查整机/系统序列号:优先用 dmidecode -t system,但得看 BIOS 填没填
这是最常被问到的“主机序列号”,实际对应 SMBIOS Type 1 表项。执行:
sudo dmidecode -t system | grep -E "Serial Number|UUID"
注意几个现实问题:
- 输出是
Serial Number: None或To be filled by O.E.M.?不是命令错了,是 BIOS 固件根本没写——换任何工具都一样 - 虚拟机(VMware/KVM)返回
VMware-xxxx或全 0 的 UUID,不能当物理资产编号用 /sys/class/dmi/id/product_serial可免 root 读,但 Ubuntu 22.04+ 默认禁止非 root 访问,报Permission denied就得切回sudo dmidecode- 别用模糊匹配如
dmidecode | grep -i serial——容易把内存条(Type 17)或主板(Type 2)的 Serial Number 混进来
查主板序列号:dmidecode -t baseboard 是唯一直接来源
主板序列号和系统序列号可能不同(尤其 OEM 整机),必须单独查 Type 2(Base Board):
sudo dmidecode -t baseboard | grep -E "Manufacturer|Product Name|Serial Number"
关键细节:
- 字段名就是
Serial Number:,不是serial:或Board Serial:,别被 lshw 的输出格式带偏 - 同样会遇到
Serial Number: Not Specified——消费级主板、部分工控机 BIOS 压根不填,不是权限或命令问题 /sys/class/dmi/id/board_serial文件不一定存在;存在也不保证可读(加固系统常禁掉)- 怀疑 BIOS 填错或漏填时,可用
sudo lshw -class motherboard | grep -E "vendor:|product:|serial:"交叉验证,lshw 会融合 ACPI 等其他固件区数据
查硬盘序列号:别碰 lsblk,改用 udevadm 或 smartctl
lsblk 和 /proc/mounts 完全不提供序列号,/sys/block/sda/device/serial 在很多 NVMe/SATA 设备上为空或根本不存在。
可靠路径分三类:
- 通用首选:
sudo udevadm info --name=/dev/sda | grep -i "id_serial|id_model"——基于 udev 数据库,覆盖 SATA/NVMe/USB - NVMe 盘:
sudo smartctl -i /dev/nvme0n1 | grep "Serial Number"(需先apt install smartmontools) - SATA 盘 fallback:
sudo hdparm -I /dev/sda | grep "Serial Number"——部分驱动支持,但成功率低于 udevadm
注意:USB 移动盘的序列号常来自设备描述符,udevadm 仍是最稳选择;smartctl 对 USB-SATA 桥接芯片支持有限。
查内存条序列号:dmidecode -t memory 能读但别太信
free 和 /proc/meminfo 只管逻辑容量,完全不含物理 DIMM 的型号或序列号。
dmidecode -t memory 是唯一能从 SPD 获取序列号的途径,但现实很骨感:
- 消费级主板上
Serial Number字段基本为空;OEM 服务器(Dell/HP)常填00000000,这不是 bug,是 SPD 芯片本身没提供或 BIOS 拒绝写入 - 输出混着空插槽(
Size: No Module Installed),建议过滤:sudo dmidecode -t memory | awk '/Memory Device$/,/^$/ { if (/Size:/ && !/No Module/) print; if (/Bank Locator:|Part Number:|Serial Number:/) print }' - Supermicro 主板启用 ECC 后,
dmidecode可能合并多条内存输出导致序列号错位,此时sudo lshw -class memory更可信
真正棘手的,往往不是命令本身怎么执行,而是 BIOS 里根本没有把信息写进去。尤其是接手二手整机或虚拟机时,动手查之前最好先把场景判断清楚:如果是物理服务器,就重点看 dmidecode -t baseboard;如果是 OEM 整机,建议再配合 lshw 交叉比对;要是在容器环境里,就别再死磕 DMI 了,直接改查硬盘信息或网卡 MAC,作为替代标识更实际。