在 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)的序列号一并匹配出来,导致结果混乱
查看主板序列号: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 硬盘备用方案:
sudo hdparm -I /dev/sda | grep "Serial Number"——部分驱动可用,但整体成功率通常不如 udevadm
另外需要注意,USB 移动硬盘的序列号通常来自设备描述符,因此 udevadm 往往是更稳定的选择;而 smartctl 对 USB-SATA 桥接芯片的兼容性相对有限。
查看内存条序列号:dmidecode -t memory 可以读取,但结果未必完整可靠
free 和 /proc/meminfo 只能查看逻辑内存容量,并不包含实际物理 DIMM 的型号、部件号或序列号。
dmidecode -t memory 是 Linux 下查看内存条序列号的主要方式之一,但实际使用中经常会遇到以下情况:
- 在消费级主板上,
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往往更值得参考
很多时候,真正麻烦的并不是 Linux 命令怎么用,而是 BIOS 或固件压根没有把硬件序列号写进去。尤其是在接手二手服务器、OEM 整机或虚拟机时,建议先判断具体环境:如果是物理服务器,优先重点查看 dmidecode -t baseboard;如果是 OEM 整机,最好再结合 lshw 做交叉核对;如果运行在容器环境中,就没有必要继续死磕 DMI 信息,改为查看硬盘序列号或网卡 MAC 地址作为替代标识,通常会更实用。
