物理偏移地址 = Start × 扇区大小;需先通过fdisk -l顶部“Sector size”行确认逻辑扇区大小(如512或4096字节),再计算,否则结果错误。

直接看 fdisk -l 输出里的 Start 列,再乘以扇区大小,就是物理偏移地址(字节单位)——但必须确认扇区大小,否则算错。
fdisk -l 的 Start 列怎么换算成字节偏移
fdisk -l 中的 Start 是逻辑扇区号(LBA),不是字节地址。它默认按 512 字节/扇区计算,所以:
物理偏移(字节) = Start × 扇区大小
关键点在于扇区大小不总是 512:
- 输出顶部会明确写
Sector size (logical/physical): 512 bytes / 4096 bytes,这时逻辑扇区仍是 512,Start仍按 512 计算 - 若看到
Sector size: 4096 bytes / 4096 bytes(少见),Start就是 4096 字节单位,不用再乘 - NVMe 设备如
/dev/nvme0n1可能报告 512 逻辑扇区,但底层物理页是 4K,此时仍用Start × 512得字节偏移,再检查是否被 4096 整除
例如:/dev/sda1 的 Start 是 2048,顶部显示 Sector size: 512 bytes / 4096 bytes → 偏移 = 2048 × 512 = 1048576 字节(即 1MiB)。
为什么不能只信 lsblk 的 START 列
lsblk -o NAME,START,SIZE 确实能快速看到起始扇区号,但它不告诉你扇区大小,也不校验对齐有效性。
常见坑:
-
START=0在 NVMe GPT 分区上很常见,这是内核隐藏了保护性 GPT 头导致的假象,并非真正从 0 开始 - 某些虚拟磁盘或 RAID 卡后端设备,
lsblk可能无法读取分区表,START显示为空或 0,但实际有偏移 - 它不输出
Sector size行,你无法判断该用 512 还是 4096 去乘
所以 lsblk 适合初筛,真要定位物理偏移,必须回退到 fdisk -l 或 parted /dev/sdX unit s print。
parted align-check optimal 才是最终验证
fdisk -l 给出的是“记录值”,parted align-check optimal 1 才告诉你这个值在当前硬件上“是否真有效”。
执行前先确认底层参数:
-
cat /sys/block/sda/queue/logical_block_size(逻辑扇区) -
cat /sys/block/sda/queue/physical_block_size(物理扇区) -
cat /sys/block/sda/alignment_offset(对齐偏移,常为 0,但 RAID/NVMe 可能非零) -
cat /sys/block/sda/queue/optimal_io_size(推荐 IO 大小,常为 4096 或 0)
然后运行:sudo parted /dev/sda align-check optimal 1
返回 1 aligned 才算过关;返回 1 not aligned 说明即使 Start=2048,硬件层也不认——这种情况下,重分区时得用 mkpart primary 1MiB 100% 或 -a optimal 参数,不能只调 Start 数值。
真正麻烦的不是算偏移,而是偏移值在工具间不一致、硬件抽象层又藏了一层——别只盯着一个命令输出,交叉验证才靠得住。


















