加密 Linux 中的现有分区,同时保留其数据

gre*_*reg 16 linux encryption

如果我有一个像 /dev/hd1 这样的未加密分区并希望对其进行加密,但希望将当前所有内容保留在该分区中,我该怎么做?

小智 20

由于这出现在谷歌结果的顶部附近,添加解决方案:

LUKS 通过http://www.johannes-bauer.com/linux/luksipc/进行就地加密

  • luksipc 作者现在推荐使用上游 [crytsetup reencrypt](https://manpath.be/f31/cryptsetup/2.2.2-1.fc31.x86_64/8/cryptsetup#L167) 命令。 (3认同)

ben*_*org 8

cryptsetup 重新加密

我刚刚偶然发现了这个相当老的问题,并想指出cryptsetup已经获得了cryptsetup 重新加密选项。该文档列出了重新加密设备的示例:

加密 LUKS2 设备(就地)。确保 /dev/plaintext上的最后 32 MiB未使用(例如:不包含文件系统数据):

cryptsetup reencrypt --encrypt --type luks2 --reduce-device-size 32m /dev/plaintext_device
Run Code Online (Sandbox Code Playgroud)

该文档有更多示例,例如首先初始化设备、使设备在线、在使用时对其进行加密。此外,重新加密似乎具有弹性,因为它可以停止和重新启动,从而允许复杂的用例。

请注意,仍然需要写入 luks 标头,因此存在大小限制,这意味着您应该非常小心,最好在尝试此操作之前测试您的特定场景(例如在具有合理测试数据的另一台设备上)。该--reduce-device-size选项有更多关于此的信息。

重新加密时,该工具将输出有关大小、速度和预计到达时间的信息,恕我直言,这使得它非常用户友好。

工作流程

一般工作流程如下:

  1. 将现有文件系统/数据的大小调整为比周围块设备小 32MiB(例如在 btrfs run 上btrfs fi resize -32m /mnt
  2. 绝对 100% 确保设备没有以任何其他方式安装或打开(如果您在设备上运行mdadm,这将是一个问题,因为它会在设备写入时尝试恢复)
  3. 重新加密设备(例如cryptsetup reencrypt --encrypt --type luks2 --reduce-device-size 32m /dev/sda4
  4. 就是这样,您现在可以cryptsetup open像往常一样,并像往常一样使用块设备的 UUID(块设备本身现在有一个从 luks 层派生的 UUID),例如在启动过程/initrd 中


sta*_*fry 7

如果您选择 plain ,这是微不足道的dm-crypt。这是有风险的 - 如果它在中途失败(停电或其他),那么你就饱了!

确保未安装原始设备,然后为其创建一个加密设备并用于dd从原始设备复制到加密设备:

$ cryptsetup open /dev/sda sda-crypt --type plain
$ dd if=/dev/sda of=/dev/mapper/sda-crypt bs=512
Run Code Online (Sandbox Code Playgroud)

明文数据从/dev/sda设备映射器中读取和写入,设备映射器/dev/mapper/sda-crypt对其进行加密并将其写回到 中/dev/sda,从而覆盖读取的明文数据。

由于读取和写入整个磁盘,可能需要一些时间。


小智 5

似乎没有解决方案可以做到这一点。Truecrypt 仅为 Windows 提供系统加密,dm-crypt 会覆盖分区。您最好的选择是将所有内容从该分区移动到备份中cp -a,使用 luks/dm-crypt 创建一个加密分区,然后将所有内容移回来。

  • `rsync` 比 `cp` 更适合此类操作,因为它具有排除特定文件夹、处理特定文件类型等选项。 (5认同)