最可靠的方法是用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 桥接芯片反而更稳定。
但注意限制:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 只支持 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 行才真正可信。


















