dmsetup luksFormat 创建对齐不一致

der*_*ert 5 linux encryption luks cryptsetup disk

解锁新格式化的 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
Run Code Online (Sandbox Code Playgroud)

根据另一个问题,错误警告是可能的,所以我确认这是一个真正的警告:33553920 不能被 4096 整除。我进一步使用 luksDump 来确认:

cryptsetup luksDump /dev/sdk1  | grep 'Payload offset'
Payload offset: 65535
Run Code Online (Sandbox Code Playgroud)

不是 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
Run Code Online (Sandbox Code Playgroud)

dmsetup 被记录为处理对齐本身,为什么它会造成错位?luksFormat 是否有参数可以避免这个问题?

der*_*ert 8

看来 dmsetup 是根据最佳 I/O 大小计算其对齐方式的,而无需检查它是否实际上是物理块大小的倍数。正如错误警告问题中所述,由于 USB 限制,这种最佳 I/O 大小是有意义的。

所以解决方案很简单:使用--align-payload覆盖检测到的值。值 8 应该可以工作(并产生尽可能小的标题);cryptsetup 无法分辨时的默认值记录为 2048。所以我选择了默认值:

cryptsetup luksFormat /dev/sdk1 --align-payload 2048 --verify-passphrase --hash sha512 -s 512
Run Code Online (Sandbox Code Playgroud)

之后,有效载荷偏移量现在是 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
Run Code Online (Sandbox Code Playgroud)

...但是 2097152 可以被 4096 整除,所以这是另一个问题中提到的错误警告。所以问题解决了。