blockdev --getss 是查看磁盘逻辑扇区大小最直接可靠的方式,返回值单位为字节(如512或4096),不依赖文件系统或挂载状态,需指定整盘设备(如 /dev/sda)且通常需 root 权限;其结果应与 /sys/block/sda/queue/logical_block_size 一致,但 --getss 更权威。

用 blockdev 查逻辑扇区大小最直接
Linux 下最可靠、无需 root 权限(多数情况)就能查逻辑扇区大小的方式,就是 blockdev --getss。它返回的是设备的逻辑扇区(logical sector)字节数,通常是 512 或 4096。
常见错误是误用 --getpbsz(物理扇区),它返回物理扇区大小(physical block size),在 SMR 盘或某些虚拟化环境中可能和逻辑值不同,但「4K 对齐」判断只看逻辑扇区对齐与否。
-
blockdev --getss /dev/sda→ 返回512或4096,这就是逻辑扇区大小 - 若报错
Permission denied,加sudo;但普通用户通常可读/sys/block/*/queue/logical_block_size - 别依赖
fdisk -l输出里的 “Sector size”,它有时会混用逻辑/物理描述,且新版fdisk默认隐藏该行
查 /sys 接口确认逻辑块大小更底层
内核把每个块设备的逻辑扇区大小暴露在 /sys/block/*/queue/logical_block_size,这是最权威的来源,不依赖用户态工具。
例如:
cat /sys/block/sda/queue/logical_block_size
输出一定是数字(如 512)。注意路径中设备名要准确——sda 是整盘,sda1 是分区,后者没有 queue/ 子目录,所以必须查盘,不能查分区。
- 物理扇区对应路径是
/sys/block/sda/queue/physical_block_size,仅用于对比,不参与对齐计算 - 虚拟设备(如 LVM、md、nvme ns)也支持该接口,行为一致
- 某些 USB-SATA 桥接器会强制报告逻辑扇区为
512,即使后端是 4K 盘,此时对齐仍按512算
判断分区是否 4K 对齐:用 fdisk -l 看起始扇区是否能被 8 整除
当逻辑扇区是 4096 字节时,“4K 对齐” 实际是指分区起始位置必须是 4096 字节的整数倍。由于 fdisk 显示的“扇区”单位默认是逻辑扇区,所以只需检查起始扇区号能否被 8 整除(因为 4096 ÷ 512 = 8)——前提是逻辑扇区确实是 512 字节;如果逻辑扇区已经是 4096,则起始扇区号本身就必须是 1 的整数倍(即任意整数都满足),但实践中仍建议从扇区 2048(1MB)起始以兼容旧 BIOS 和固件。
- 运行
fdisk -l /dev/sda,找到某一分区(如sda1)的Start列数值 - 若
blockdev --getss /dev/sda返回512,则起始扇区 % 8 应为 0(例如 2048、4096、6144)才对齐 - 若返回
4096,则起始扇区 % 1 == 0 即可,但推荐仍用 2048 起始(即 1MB offset),避免部分旧工具解析异常 -
parted /dev/sda unit s print更直观:它明确标出 Start 单位是 “sectors”,且默认使用逻辑扇区
mkfs 和 fdisk 默认行为不一定对齐,别假设自动正确
很多用户以为用 fdisk 新建分区就天然 4K 对齐,其实老版本 fdisk(start= 参数覆盖,就容易出错。
-
mkfs.ext4不检查底层对齐,它只按你给的块大小和 inode 位置写数据,若底层分区未对齐,性能会掉一截(尤其随机小 IO) - 创建新盘时,用
fdisk后执行partprobe或重启内核分区表,再验证blockdev --getss和起始扇区,别跳过这步 - SSD 和 NVMe 盘虽然内部页大小常为 4K~64K,但对外暴露的逻辑扇区仍是 512 或 4096,对齐规则不变;真正影响性能的是“是否跨页”,而操作系统层面对齐是第一道防线
真正麻烦的是混合场景:比如逻辑扇区 512 的盘,但控制器固件内部做 4K 扇区模拟,此时不对齐会导致单次写放大成两次 NAND 写入——这种细节不会反映在 /sys 或 blockdev 输出里,只能靠厂商文档或实测延迟曲线来识别。











