当解锁新格式化的 LUKS 卷时,我在内核日志中收到一条警告:
kernel: device-mapper: table: 253:14: adding target device sdk1 caused an alignment inconsistency: physical_block_size=4096, logical_block_size=512, alignment_offset=0, start=33553920
根据另一个问题,错误警告是可能的,所以我确认这是一个真正的警告:33553920 不能被 4096 整除。我进一步使用 luksDump 来确认:
cryptsetup luksDump /dev/sdk1 | grep 'Payload offset'
Payload offset: 65535
不是 8 的倍数 (4096 ÷ 512 = 8)
lsblk -t /dev/sdk
确认 Linux 知道对齐要求:
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME
sdk 0 4096 33553920 4096 512 1 cfq 128 128 32M
└─sdk1 0 4096 33553920 4096 512 1 cfq 128 128 32M
dmsetup 被记录为可以自行处理对齐,为什么它会造成未对齐? luksFormat 是否有参数可以避免这个问题?
答案1
看起来 dmsetup 根据最佳 I/O 大小计算其对齐方式,而无需检查这实际上是物理块大小的倍数。正如错误警告问题中提到的,由于 USB 限制,这种最佳 I/O 大小是有意义的。
所以解决方案很简单:使用--align-payload
覆盖检测到的值。值 8 应该有效(并产生尽可能小的标头);当 cryptsetup 无法识别时,默认值记录为 2048。所以我使用默认值:
cryptsetup luksFormat /dev/sdk1 --align-payload 2048 --verify-passphrase --hash sha512 -s 512
之后,有效负载偏移量现在为 4096(来自 luksDump),并且仍然会产生内核警告:
kernel: device-mapper: table: 253:14: adding target device sdk1 caused an alignment inconsistency: physical_block_size=4096, logical_block_size=512, alignment_offset=0, start=2097152
...但是 2097152 可以被 4096 整除,所以这是另一个问题中提到的错误警告。这样问题就解决了。