Linux查硬件序列号无统一命令,需按设备类型分别处理:主板/系统用sudo dmidecode -t system;内存用sudo dmidecode -t memory;硬盘优先用sudo udevadm info --name=/dev/sda;网卡资产标签需结合ethtool与udevadm查PCI路径。

Linux 下查硬件序列号没有统一命令,得看你要查哪类设备——主板、CPU、内存、硬盘、网卡,各自来源不同,权限要求和可靠性也差别很大。
查主板和系统序列号:优先用 dmidecode -t system
这是最常用也最权威的方式,读取 BIOS/UEFI 固件中写死的 SMBIOS 表,但必须有 root 权限。输出里 Serial Number 字段才是你要的系统级序列号(OEM 常把它和主板序列号设为一致)。
- 直接提取关键字段:
sudo dmidecode -t system | grep -E "Manufacturer|Product Name|Serial Number" - 如果返回
Serial Number: None或全是 0,说明固件没填,不是命令问题,是硬件或厂商策略导致 - 虚拟机环境(如 VMware、KVM)常返回
Not Specified或伪造值,此时不可信 -
/sys/class/dmi/id/product_serial是内核映射的只读接口,无需安装工具,但部分安全加固系统会禁用该路径
查内存条型号与序列号:只能靠 dmidecode -t memory
这是唯一能拿到物理 DIMM 硬件信息的途径。free 和 /proc/meminfo 只管逻辑容量,完全不包含型号、插槽、序列号等物理属性。
- 重点字段包括:
Size、Bank Locator、Type、Speed、Manufacturer、Part Number、Serial Number -
Serial Number在消费级主板上大概率为空,OEM 服务器(如 Dell、HP)常填00000000,这不是 bug,是 SPD 芯片本身未提供或 BIOS 选择不写入 - 过滤空插槽更实用:
sudo dmidecode -t memory | awk '/Memory Device$/,/^$/ { if (/Size:/ && !/No Module/) print; if (/Bank Locator:|Part Number:|Serial Number:/) print }' - 某些 Supermicro 主板在启用 ECC 后,
dmidecode会合并多条内存输出,导致序列号错位,需结合lshw -class memory交叉验证
查硬盘序列号:别依赖 lsblk,用 udevadm 或 smartctl
lsblk 显示的是块设备拓扑,不带序列号;/sys/block/sda/device/serial 路径在部分 SATA/NVMe 设备上根本不存在,或返回空。
- 通用可靠方式:
sudo udevadm info --name=/dev/sda | grep -i "id_serial\|id_model\|id_vendor" - NVMe 盘建议用
smartctl(需装smartmontools):sudo smartctl -i /dev/nvme0n1 | grep "Serial Number" - SATA 盘若
udevadm没输出,可尝试:sudo hdparm -I /dev/sda | grep "Serial Number"(部分驱动支持) - 注意:USB 移动硬盘的“序列号”常由 USB 桥芯片生成,和盘体本身无关
查网卡 MAC 和资产标签:ip link 不够,得看 ethtool 和 udevadm
ip link show eth0 | grep ether 只给 MAC 地址,不是硬件序列号。真正的资产标识(如 Dell 的 Service Tag、HP 的 Product ID)藏在 DMI 或平台设备里。
- 先确认网卡 PCI 地址:
ethtool -i eth0 | grep bus-info(输出类似bus-info: 0000:02:00.0) - 再查对应 PCI 设备的固件标签:
sudo udevadm info --path=/sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0 | grep ID_VENDOR_ID\|ID_MODEL_ID\|ID_SERIAL - 部分企业级网卡(如 Intel X710)支持通过
ethtool -e eth0读取 EEPROM 中的定制字段,但需驱动支持且非常规 - 不要用过时的
kudzu,它早已被弃用,现代系统无对应包
真正麻烦的地方不在命令怎么写,而在于:同一块硬件,在不同 BIOS 版本、不同 OEM 设置、不同内核版本下,暴露出来的字段可能全不一样。查不到序列号,八成不是你命令错了,而是那块硬件压根没提供,或者厂商故意留空。


















