最可靠方法是用 smartctl -i:sudo smartctl -i /dev/sda 查 Serial Number 行,它直接读取固件标识;NVMe 用 /dev/nvme0n1;需 sudo 权限,SMART 关闭时先启用。

用 smartctl 查序列号最可靠
Linux 下查硬盘序列号,smartctl 是唯一能直接读取物理设备标识的工具,其他命令(如 lsblk、lshw)大多依赖 sysfs 或 udev 缓存,可能为空或不一致。
-
sudo smartctl -i /dev/sda输出里找Serial Number:行,这是真实固件写的序列号 - 必须加
sudo,普通用户无权访问 ATA/SATA/SCSI 设备底层指令 - NVMe 盘要用
sudo smartctl -i /dev/nvme0n1,别误用/dev/nvme0(后者不是块设备) - 如果报错
SMART Disabled,需先启用:sudo smartctl -s on /dev/sda
udevadm 适合批量脚本但不可信
udevadm 查的是内核在设备初始化时记录的 ID,快、免权限,但容易被 udev 规则覆盖或缺失。
-
udevadm info --name=/dev/sda | grep ID_SERIAL_SHORT可快速提取(注意是ID_SERIAL_SHORT,不是ID_SERIAL) - USB 移动硬盘常有值,SATA 内置盘经常为空——因为厂商没填或固件未暴露
- 虚拟机里几乎总是空的,
virtio_blk设备不提供标准序列号字段
hdparm 对 SATA 盘有时比 smartctl 更快
hdparm 绕过 SMART 层直接发 IDENTIFY 命令,某些老旧或锁定的硬盘反而更易读出序列号。
-
sudo hdparm -I /dev/sda | grep "Serial Number"(注意大写I) - 不依赖 SMART 开启状态,但只支持 ATA/SATA,对 NVMe、SCSI、USB-SATA 桥接器无效
- 部分 RAID 卡直通模式下会失败,报
HDIO_DRIVE_CMD(identify) failed
别碰 /sys/block/*/device/serial —— 大部分时候是空的
这个路径看着像真相入口,实际是内核从设备响应中解析出的字段,很多驱动根本不填,尤其国产主控或 JMicron 桥接芯片。
-
cat /sys/block/sda/device/serial返回空或cat: ...: No such file or directory是常态,不是你操作错了 - 哪怕有值,也可能是厂商随意填的占位符(比如全 0 或 “000000000000”),和
smartctl结果对不上 - 该路径还受内核版本影响:5.10+ 对 NVMe 的
/sys/block/nvme0n1/device/serial才开始稳定支持
真正要拿准确序列号,只认 smartctl -i;脚本里做 fallback 可以加 hdparm -I,但别把 udevadm 或 /sys 路径当主力。NVMe 和虚拟环境是重灾区,提前测好目标设备类型再写逻辑。










