更稳妥的做法,是直接用sudo smartctl -i去读取硬盘固件信息:其中的Serial Number和Model字段,通常就是出厂时写入、相对最真实的值。相比之下,lsblk、udevadm这类命令经常要么返回空值,要么给出伪造字符串;至于hdparm -I,只适合作为SATA盘的备选方案,而且对应字段名写的是SerialNo。

直接用 smartctl -i 查最准
它不走内核缓存,也不受 udev 规则影响,而是直接下发 ATA/NVMe 命令去读取固件信息。这样拿到的 Serial Number 和 Model,才是硬盘出厂时写入的真实值。反过来看,像 lsblk -o model,serial 或 udevadm info 这类命令,在 SATA 内置盘、VMware 虚拟盘以及部分 NVMe 设备上,常常要么返回空值,要么给出伪造的字符串。
必须加 sudo,普通用户无权访问底层设备指令:
- SATA/SCSI 盘:
sudo smartctl -i /dev/sda - NVMe 盘:
sudo smartctl -i /dev/nvme0n1(注意不是/dev/nvme0) - 如果提示
SMART Disabled,先执行sudo smartctl -s on /dev/sda
hdparm -I 是 SMART 不可用时的 fallback
当 smartctl 报错、SMART 被 BIOS 锁死、或系统没装 smartmontools 时,hdparm -I 可作为备选——它走 IDENTIFY 指令路径,不依赖 SMART 层,对部分老旧盘或 JMicron 桥接芯片反而更稳定。
但注意限制:
- 只支持 ATA/SATA 接口,对 NVMe、USB-SATA 桥接器、SCSI RAID 卡直通模式无效
- 输出字段名是
SerialNo(带大写 N 和 o),不是Serial Number - 执行:
sudo hdparm -I /dev/sda | grep -E "SerialNo|Firmware"
别信 udevadm 和 /sys/block/*/device/serial 的输出
这两个来源读的是内核初始化时缓存的数据,不是实时从设备读的。常见失效场景包括:
udevadm info --name=/dev/sda | grep ID_SERIAL_SHORT在多数 SATA 台式机内置盘上直接无输出cat /sys/block/sda/device/serial经常报No such file or directory- VMware/KVM 虚拟磁盘返回
vmware virtual s这类占位符,不是真实序列号 - 部分国产主控 SSD 在 udev 下序列号为空,但
smartctl能正常读出
确认目标设备名再动手
误操作可能影响生产环境,务必先用 lsblk 或 ls /sys/block/ 确认设备名:
lsblk -d -o NAME,MODEL,SIZE,TRAN快速列出物理磁盘(-d排除分区)- 区分
sda(SATA/SCSI)和nvme0n1(NVMe),别把/dev/nvme0当成盘设备 - RAID 卡后接的盘,
smartctl可能失败,此时优先查mdadm --examine /dev/sdX或卡厂商工具
真实环境里,同一块盘用不同命令查出三套“序列号”很常见——关键不是哪个“看起来像”,而是哪个值能被硬件厂商售后系统识别。这时候只有 smartctl -i 输出的 Serial Number 行才真正可信。