为什么 cryptsetup 会在大小为 10M 的容器中失败?

Dee*_*ool 2 encryption luks

我正在尝试创建一个大小为 10M 的加密卷。我知道这是可能的,因为我有 10M 大小的坟墓。我已经运行了以下命令。

fallocate -l 10M container
cryptsetup -y -v luksFormat --progress-frequency 1 container
cryptsetup open --type luks container luksvol1
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息。

Requested offset is beyond real size of device container.
Run Code Online (Sandbox Code Playgroud)

但是如果我的容器大小为 20M,我的命令就会成功。为什么这会以 10M 失败?10M 应该足够大来容纳加密的 luks 卷。

use*_*686 6

最初的 LUKS 卷格式,现在称为 LUKS1,用于为元数据标头(密码参数、密钥槽等)保留 2 MiB,为实际数据留下 8 MiB。

但是随着使用不同元数据格式的 LUKS2 的引入,默认数据偏移量现在是16 MiB。问题是,cryptsetup luksFormat实际上并没有检查设备是否足够大,它只是盲目地写标题。

(在两种格式版本中,大key-slot区域的最初原因是使用了“anti-forensic striping”,即每个32字节的密钥分布在多个扇区中。但除此之外,LUKS2存储了一部分它的元数据使用 JSON 而不是打包的二进制结构,因此元数据区域已经扩大以解决新的开销。)

您的选择是:

  • 使用初始化卷luksFormat --type luks1(这将使用 2 MiB 偏移量);

  • 或者用不同的--luks2-metadata-size--luks2-keyslots-size值初始化 LUKS 卷。(注意:我不知道最小安全尺寸是多少。)

两个 LUKS 版本都使用相同的密码;LUKS2 的主要实用优势是它支持 Argon2 KDF,而 LUKS1 仅限于 PBKDF2。

  • 我认为应该提交相应的错误(至少要求确认创建这样一个无法使用的 LUKS 设备)。 (3认同)