blockdev --getpbsz 返回值即物理扇区大小,是最底层可信来源;失败时可回退至 /sys/block/sda/queue/physical_block_size;fdisk -l 的物理扇区值仅为估算;最终对齐验证须用 parted align-check optimal 1。

blockdev --getpbsz 返回值就是物理扇区大小
直接运行 sudo blockdev --getpbsz /dev/sda(把 /dev/sda 换成你的设备名),输出数字就是物理扇区字节数,比如 4096 或 512。这个值由内核通过 ioctl 从驱动读取,不依赖分区表或文件系统,是目前最底层、最可信的来源。
常见错误现象:
-
Invalid argument:不是命令写错,而是设备驱动没暴露该信息(常见于老 SATA 控制器、某些 USB-SATA 桥接盘) - 返回
512:不能直接认定是传统盘,可能是固件强制报告,需结合hdparm -I交叉验证 - 对
/dev/sda1运行失败:必须作用于整块磁盘节点(如/dev/sda),分区节点不支持--getpbsz
若 --getpbsz 失败,fallback 到 cat /sys/block/sda/queue/physical_block_size —— 这个 sysfs 值比 fdisk -l 的估算更可信,且适用于 NVMe(如 /dev/nvme0n1)和虚拟设备(LVM、md)。
fdisk -l 输出里的 “Sector size (logical/physical)” 行不可信但够用
运行 sudo fdisk -l /dev/sda,第三行类似 Sector size (logical/physical): 512 bytes / 4096 bytes 的字段,右侧数值就是它“声称”的物理扇区大小。它本质是 fdisk 根据设备标识字符串和 LBA 地址“猜”出来的,不是直接读硬件寄存器,所以不能用于底层工具开发,但日常排查够用。
容易踩的坑:
- 某些 USB-SATA 桥接器恒定返回
512 / 4096,哪怕后端是 SMR 盘或 NVMe - 新版
fdisk默认隐藏该行(尤其在无分区盘上),不代表没信息,只是不显示 - 设备刚插入、内核未完全识别时(如 NVMe),
fdisk -l可能根本不出这行,而blockdev --getpbsz仍可能成功
parted align-check optimal 1 是唯一决定性验证
光看物理扇区大小还不够,得验证分区起始位置是否真正落在它的对齐边界上。sudo parted /dev/sda align-check optimal 1 才是最终判决——它会读取 /sys/block/sda/queue/optimal_io_size、/sys/block/sda/alignment_offset 和 physical_block_size,算出理论最优偏移,并比对实际分区起始位置。
实操要点:
- 返回
1 aligned才算过关;1 not aligned就必须重分区 - RAID 卡或 NVMe 命名空间下,
alignment_offset可能非零(如2048),此时起始扇区需满足(optimal_io_size + alignment_offset) / physical_block_size为整数 - 不要手动调
Start数值,应使用mkpart primary 1MiB 100%或-a optimal参数重建分区
lsblk -o NAME,START,SIZE 只适合初筛
lsblk -o NAME,START,SIZE 是最轻量的批量筛查方式,无需 root 权限也能看到 START 列(单位是逻辑扇区)。若 START 是 2048、4096、8192 等值,可初步认为对齐(因为 2048 × 512 = 1MiB,能被常见物理扇区 4096 整除)。
但注意:
- START 是扇区号,不是字节;
2048s≠2048 字节 - NVMe 设备(如
/dev/nvme0n1p1)可能显示START=0,这是内核抽象层隐藏 GPT 头所致,不代表未对齐 - 若输出为空或 START 缺失,说明内核未刷新分区表,需先执行
sudo partprobe /dev/nvme0n1
真正要确认物理对齐,不能只靠 START 是否为 2048 的倍数,也不能只信 Aligned: yes —— 它依赖内核提供的 optimal_io_size,而某些 RAID 卡或虚拟化层会返回错误值。最终得回到 align-check optimal 和底层 sysfs 参数交叉验证。











