lsblk 默认不显示序列号,因其仅解析设备树和udev数据库,而序列号属硬件属性,需通过sysfs(如/sys/block/sda/device/serial)或udevadm提取。

可以用 lsblk 的 -o 选项指定输出字段,并结合 --nodeps 和 /sys/block/*/device/serial 等方式间接获取磁盘序列号,但要注意:lsblk 本身不直接支持输出序列号(SERIAL)字段,它默认只显示设备名、大小、类型、挂载点等基础信息。
为什么 lsblk 默认不显示序列号
序列号(Serial Number)属于 SCSI/SATA/NVMe 设备的硬件属性,由内核通过 sysfs 暴露(如 /sys/block/sda/device/serial),而 lsblk 主要解析设备树和 udev 数据库,不主动读取该文件。udev 中若未将 SERIAL 注入设备属性,lsblk 就无法显示。
用 lsblk + udevadm 组合获取序列号(推荐)
这是最可靠、兼容性最好的方法:
- 先用
lsblk -n -o NAME,MODEL,SIZE,TRAN列出基础设备信息 - 对每个磁盘(如
sda),用udevadm info --name=/dev/sda --query=property | grep ID_SERIAL提取序列号 - 可写成一行脚本批量处理:
for dev in $(lsblk -nd -o NAME); do
serial=$(udevadm info --name=/dev/$dev --query=property 2>/dev/null | awk -F= '/^ID_SERIAL=/{print $2}' | tr -d '"')
echo "$dev $(lsblk -nd -o MODEL,SIZE,TRAN /dev/$dev) $serial"
done | column -t
尝试用 lsblk -o + udev 属性(需系统支持)
部分新版系统(udev ≥ 240 + lsblk ≥ 2.34)中,若设备已正确识别并注入 udev 属性,可尝试:
-
lsblk -o NAME,MODEL,SERIAL,SIZE,TRAN—— 若 SERIAL 显示为空,说明 udev 未提供该属性 - 检查是否可用:
udevadm info --name=/dev/sda | grep -i serial,常见键名有ID_SERIAL、ID_SERIAL_SHORT、ID_WWN - 若需持久化显示,可自定义 udev 规则(如
/etc/udev/rules.d/99-disk-serial.rules)添加属性
替代方案:直接读取 sysfs(简单直接)
适用于 SATA/SCSI 磁盘(NVMe 需查 /sys/block/nvme0n1/device/serial):
for d in /sys/block/sd*; do n=$(basename $d); s=$(cat $d/device/serial 2>/dev/null | tr -d '[:space:]'); echo "$n $s"; done- 注意:需 root 权限读某些 device 目录;USB 或虚拟磁盘可能无
device/serial - 配合
lsblk -o NAME,MODEL,SIZE /dev/$n可合并输出











