lsblk -o 无法直接输出物理扇区大小和序列号;物理扇区大小需用 lsblk -t 配合 -d 获取,序列号应通过 udevadm info 或读取 sysfs 路径获得。

lsblk -o 本身不能直接输出物理扇区大小和序列号,因为这两个字段不在 lsblk 原生支持的列列表中。物理扇区大小属于拓扑信息,序列号则是硬件属性,需通过其他机制补充。但你可以用 -o 配合其他选项与外部工具协同实现目标。
✅ 正确理解 lsblk 的能力边界
-
lsblk --output(或-o)只支持预定义字段,如NAME,SIZE,TYPE,MODEL,TRAN,FSTYPE等。 -
物理扇区大小(PHY-SEC) 属于拓扑信息,需用
-t或--topology显式启用,且它不参与-o自定义列控制——即你不能写lsblk -o NAME,PHY-SEC。 -
序列号(SERIAL) 不是
lsblk默认字段;即使新版支持SERIAL列(需 udev 注入),也常为空,因多数系统未将ID_SERIAL写入 udev db。
? 获取物理扇区大小:用 -t + 解析输出
lsblk -t 会显示每个设备的拓扑参数,包括:
-
PHY-SEC:物理扇区大小(字节) -
LOG-SEC:逻辑扇区大小 -
ROTA:是否旋转介质(1=HDD,0=SSD/NVMe)
示例命令:
lsblk -d -t -o NAME,PHY-SEC,LOG-SEC,ROTA
说明:
-
-d:仅显示磁盘(排除分区),避免冗余 -
-t:强制启用拓扑输出(必须加,否则 PHY-SEC 不出现) - 输出中
PHY-SEC列即为物理扇区大小(常见值:512、4096)
⚠️ 注意:-t 和 -o 可共存,但 -o 中只能填 lsblk --output-all 里列出的字段;PHY-SEC 是 -t 专属列,无需也不支持写进 -o 参数。
? 获取唯一序列号:结合 udevadm(推荐)
lsblk 无法保证输出序列号,最可靠方式是用 udevadm 补充:
for dev in $(lsblk -nd -o NAME); do
phy=$(lsblk -dn -t -o PHY-SEC /dev/$dev 2>/dev/null | tr -d '[:space:]')
serial=$(udevadm info --name=/dev/$dev --query=property 2>/dev/null | awk -F= '/^ID_SERIAL=/{print $2}' | tr -d '"')
printf "%-8s %-8s %-20s\n" "$dev" "$phy" "$serial"
done | column -t
输出类似:
sda 4096 WDC_WD10EZEX_XX1234567890 nvme0n1 512 SAMSUNG_MZVL2512HCJQ_123456789012345
关键点:
-
udevadm info --name=/dev/sda --query=property提取全部 udev 属性 -
ID_SERIAL是最常用、含型号+序列的完整标识;若为空,可试ID_SERIAL_SHORT或ID_WWN - 需 root 权限读部分设备属性(普通用户可能漏掉某些磁盘)
? 替代方案:直接读 sysfs(轻量、免依赖)
适用于 SATA/SCSI 磁盘(NVMe 路径不同):
for d in /sys/block/sd*; do n=$(basename "$d") p="$d/device/phys_block_size" # 物理扇区大小 s="$d/device/serial" phy=$(cat "$p" 2>/dev/null | tr -d '[:space:]') ser=$(cat "$s" 2>/dev/null | tr -d '[:space:]') printf "%-8s %-8s %-20s\n" "$n" "$phy" "$ser" done | column -t
NVMe 设备需改路径为 /sys/block/nvme*n1/device/serial 和 /sys/block/nvme*n1/queue/logical_block_size(注意:NVMe 的 phys_block_size 通常不暴露,用 logical_block_size 更稳妥)。
不复杂但容易忽略











