开篇直接给答案
排查服务器硬件故障、盘点资产、或向厂商报修时,获取硬盘序列号是必经操作,在Linux服务器上,最直接的方法是用 smartctl 配合 lsblk 或 lsscsi 定位盘符,再用 udevadm 或 hdparm 读出序列号,本文按操作场景拆解命令组合,省去你东翻西找的时间。
定位硬盘盘符:别一上来就查序列号
很多新手直接敲 smartctl -i /dev/sda,结果发现输出的序列号跟机器侧面的标签对不上,原因很简单:Linux 的盘符(sda、sdb)是动态分配,重启后可能调换顺序,查序列号前,先确认你盯的是哪一块物理硬盘。
用 lsblk 看清设备拓扑
lsblk 是 util-linux 包自带的工具,几乎所有发行版都有,执行后能看到盘符、容量、挂载点和分区结构。
lsblk -o NAME,TRAN,SIZE,MODEL,SERIAL
TRAN显示接口类型(sata/nvme),快速区分固态和机械盘。MODEL是型号。SERIAL在很多发行版上能直接显示序列号,但部分老内核或驱动不支持,此时输出为空。
用 lsscsi 应对多盘位服务器
刀片服务器或磁盘阵列柜里挂着十几块盘时,lsscsi 能显示 SCSI 设备与盘符的对应关系,这在多块硬盘的服务器序列号查询场景下比 lsblk 更直观。
lsscsi -i
输出末尾的 /dev/sda 和后面的序列号一一对应,如果系统没装,用 yum install lsscsi 或 apt install lsscsi 补上。
处理多路径映射的环境
在存储网络(SAN)环境中,同一块 LUN 会通过多个 HBA 卡映射出多个盘符,查序列号前要用 multipath -ll 聚合,否则查的是同一个物理盘的不同路径,容易让人误以为有两块盘。
用 smartctl 读取序列号:最稳妥的方案
smartmontools 是行业标准工具,通过 SMART 协议直接跟硬盘固件通信,它不依赖设备驱动对序列号字段的支持,通用性最强。
安装与基础用法
CentOS/RHEL 系装 smartmontools,Ubuntu/Debian 系装同名包,装好后执行:
smartctl -i /dev/sda
输出里 Serial Number 一行就是我们要的,如果想省去其他无关信息,直接 grep:
smartctl -i /dev/sda | grep -i serial
NVMe 固态硬盘的差异
NVMe 协议的盘不走 SATA 的 SMART 通道,命令稍有不同:
smartctl -i /dev/nvme0
NVMe 盘的序列号字段是 Serial Number,但有些盘会显示 Model Number 之后才轮到序列号。不同品牌 NVMe 盘的固件输出格式略有差异,字段名不会变。
设备名与物理槽位的对应
机架式服务器换硬盘时,光知道盘符没用,你得知道盘在哪个托盘上,通过 smartctl -i 读出序列号后,对照 服务器前面板的标签贴纸 或者用 ipmitool sel 查看背板信息,戴尔 iDRAC、惠普 iLO 的 Web 界面里也能按序列号反查物理槽位。
用 udevadm 查询序列号:不依赖 SMART 的备选方案
有些特殊场景下硬盘的 SMART 功能被禁用,或者 smartmontools 没装,udevadm 就是个可靠的备选,它直接从内核的 sysfs 文件系统读属性,无需跟硬件交互。
按盘符查序列号
udevadm info --query=all --name=/dev/sda | grep ID_SERIAL
输出类似 ID_SERIAL=WDC_WD4003FZEX-00Z4SA0_WD-WCC6Y3系列,等号后面就是完整序列号。
按序列号反查盘符
服务器有几块同型号硬盘时,想找某块特定序列号的盘对应哪个设备名,用:
for disk in /dev/sd?; do echo -n "$disk: "; udevadm info --query=property --name=$disk | grep ID_SERIAL_SHORT; done
这行命令遍历所有 SCSI 盘符,打出每个盘对应的短序列号。批量识别硬盘序列号时效率比较高。
hdparm 与 lshw:补充手段
hdparm 适合老系统
早年间排查 CentOS 6 或更老系统上的硬盘问题,hdparm 是必备工具,查序列号的命令:
hdparm -i /dev/sda
输出里的 SerialNo 字段就是,但 hdparm 对 NVMe 盘和 USB 外接盘支持不好,新服务器建议优先用 smartctl。
lshw 查看硬件层次
lshw -class disk 能显示整个存储子系统的树状结构,包括总线位置、逻辑名、序列号,适合写资产报告时用,输出格式整洁,能直接导出为 HTML。
不同接口硬盘的序列号查询差异
机械硬盘(SATA/SAS)
SATA 盘用 smartctl 无压力,SAS 盘略有不同,部分直通卡(HBA)模式下 smartctl 默认无法访问 SAS 盘,需要加 -d scsi 参数:
smartctl -d scsi -i /dev/sda
固态硬盘(SATA/NVMe)
SATA 固态和机械盘命令一致,NVMe 固态请参考上文专门命令。企业级 NVMe 盘(如 Intel P5510、三星 PM9A3)通常支持完整的 SMART 命令集,消费级盘部分字段可能被固件隐藏。
虚拟化环境与 USB 外接盘
虚拟机里查到的序列号是宿主机虚拟化层模拟的,不是物理盘真实序列号,想查宿主机物理硬盘序列号,得在宿主机上执行命令,USB 外接盘盒会重写序列号,测出来大概率是桥接芯片的序列号而非盘体本身的。
服务器厂商工具的额外便利性
戴尔 iDRAC、惠普 iLO、联想 XClarity 管理界面里都有存储设备信息,能直接看到序列号、固件版本、健康状态。批量巡检时比逐台登录 Linux 系统敲命令高效得多,部分服务器在 BIOS 设置界面里也能直接查看硬盘序列号,适合系统起不来时的排查场景。
/sys/block/sda/device/ 路径下隐藏着原始 sysfs 属性,
cat /sys/block/sda/device/vendor cat /sys/block/sda/device/model
部分内核版本下没有序列号文件,但 vendor 和 model 信息基本齐全,可作为辅助判定的依据。
Q&A:Linux服务器查看硬盘序列号的常见疑问
查询硬盘序列号需要 root 权限吗?
smartctl -i 和 hdparm -i 通常需要 root 权限执行,如果当前用户不在 disk 组里,普通用户执行会得到 “Permission Denied” 的提示。lsblk 和 udevadm 普通用户即可运行,是权限受限时的第一选择。
为什么 smartctl 查到的序列号和硬盘标签上的不一致?
标签上的序列号(如 Western Digital 的 WD-WCCXXXX)与 SMART 协议上报的序列号字段(通常是短序列号)在部分品牌上确实不同,这是厂商的命名逻辑差异,不影响保修识别,如果怀疑盘被换过,建议结合固件版本号和通电时长综合判断,若想进一步了解厂商命名差异的具体规律,搜索 “硬盘型号序列号对应规则” 这类关键词也能找到第三方社区的整理资料。
Ubuntu 系统下查询硬盘序列号有什么不同?
Ubuntu 默认不开 root 账号,用 sudo 前缀执行 sudo smartctl -i /dev/sda 即可,Ubuntu 20.04 及更高版本默认内核支持 NVMe 设备属性,lsblk -o SERIAL 对 NVMe 盘的序列号显示比老版本更完整,如果查询结果为空,先执行 sudo apt install smartmontools 再试。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/787391.html


