LUKS + BTRFS + RAID1

LUKS + BTRFS + RAID1

我想使用BTRFS RAID1dm_crypt在微型服务器上。困难的部分是我不明白文件系统和 LUKS 的工作原理。假设我们在驱动器上有 2 个分区,并且我们对整个驱动器进行加密。这是否意味着两个分区都将被加密,如果不知道密钥,我就无法知道它们有哪些文件系统?如果是这样,那么我不明白如何在这样的驱动器上有一个未加密的启动分区(加载 dm_crypt 所必需的),或者如果我加密两个驱动器并且它们在解密之前彼此不知道,btrfs raid1 将如何工作?另一方面,如果 dm_crypt 使用 btrfs 分区来存储加密的数据(例如在一个巨大的文件中),那么 btrfs 清理是否只对这个巨大的文件起作用,并且一个无法纠正的错误不会杀死磁盘的全部内容吗?

答案1

这是否意味着两个分区都将被加密,并且如果不知道密钥,我就无法分辨它们有什么文件系统?

是的,两个分区都将被加密为 LUKS 分区。您将能够分辨出它们是 LUKS 加密分区。如果没有密钥(和/或密码),您将无法分辨分区内的内容。

如果是这样,那么我不明白如何可能有一个未加密的启动分区......

要么 (a) 启动分区是一个单独的 [未加密的] 分区,要么 (b) 启动加载程序 [GRUB?] 要求输入密码并知道如何解密和挂载启动分区。 (我通常在 Ubuntu 中使用未加密的启动分区。 我曾经在 Manjaro Linux 的安装中看到过加密的启动分区。)

此设置的主要问题在于,由于 raid1 位于上层,因此两个 hdd/ssd 将采用不同的加密,这意味着性能损失和大量不必要的加密。

我听说磁盘加密的开销可以忽略不计。我从来没有遇到过问题。但我从未测量过性能影响,而且我的系统不需要高速磁盘 IO。

无论如何,您只需在写入数据时支付多重加密的费用。读取时,只需读取一份数据。

我使用 LUKS + ZFS + RAID1,但仅用于/home。我ext4使用/ext2以及/boot

(请注意,如果您有 N>2 个磁盘,则 BTRFS 的“RAID1”模式实际上并不是 RAID1,因为 BTRFS 只会创建 2 个数据副本,而不是 RAID1 所要求的 N 个副本。换句话说,具有 N>2 个磁盘的 BTRFS“RAID1”为您提供了更多的存储空间,而不是更多的冗余。)

答案2

我阅读了主题中的一些文本。根据他们的说法,分区和格式化是独立的过程,所以我不必通过对块设备进行分区来提供文件系统类型(ssd/hdd/virtual?)。dm-crypt 可以通过单独加密每个块(或扇区?)将未加密的块设备转换为加密的块设备,并且 btrfs 可以存在于该加密的块设备上。

注意:dmcrypt + btrfs 需要 4+ 内核才能正常工作;3.2 内核存在兼容性和安全性问题,4.0 内核存在性能问题。

此设置的主要问题是,由于 raid1 将位于上层,因此两个 hdd/ssd 的加密方式不同,这意味着性能损失和大量不必要的加密。根据我阅读的其他文本/答案,现在没有办法做到这一点。人们正在研究 btrfs 加密,但目前还没有稳定的东西。目前,使用 ecryptfs 的堆叠方法(btrfs FAQ 提到)比 dm-crypt 慢很多,所以这也不是一个好的解决方案。另一个选择是使用 zfs,它具有加密支持,但据我所知。与 btrfs 相比,它消耗大量内存。

更新(2019 年 1 月):

我也检查了 zfs,它有很好的原生加密功能,而且你也可以加密交换分区,所以我认为这是可行的方法。但它也有一些缺点,它占用更多内存,而且添加新磁盘不像使用 btrfs 那样简单。

答案3

也许我误解了你的问题,但这应该完全没问题。

您的系统的先决条件是在访问 LUKS 设备之前打开/解密它们。可以通过两种基本方式进行设置:

  • 在启动所需的文件系统上:你必须passphrase在启动时输入你的(grub或内核,取决于你是否充分对你的磁盘进行 FDE)
    • 这将有一个0安装顺序/etc/fstab
  • 或者不需要启动,例如数据驱动器。
    • 我将以此为例;它看起来是一个稍微复杂一些的情况。

假设你有一个非加密的btrfs和LUKS/dev/sda1加密btrfs/dev/sdb1/dev/sdc1

因此您需要所有相关的设备opened/ decrypted。这是一个完全独立于 BTRFS 的步骤 / 实体。LUKS 使用内核设备映射器,因此这意味着:

  • 如果没有LUKS,您将通过标准设备路径引用您的 btrfs 文件系统,执行您的分区,例如/dev/sda1(注意,我们谈论的是分区而不是整个sda驱动器,因为文件系统包含在那里)。
  • LUKS,luks 在概念上包装了文件系统。当你(手动,或者例如在启动时自动)luksOpen它(再次devicemapper使用内核)时,你最终会得到一个/dev/mapper/your_label。你仍然有正常的/dev/sda1节点,但是这个不是将被使用;dev/mapper/节点是(luks-open 在概念上与/dev/sda1- 相同,它是您的 btrfs 文件系统所在的位置。

一旦您有了btrfs可用的文件系统,例如/dev/sda1等等/dev/mapper/your_label,您就可以执行btrfs所需的任何任务,例如device add创建raid1数组。

现在——如何“使btrfs文件系统自动可用?

  1. 当然你可以手动解锁
  2. 你的 LUKS 可以是包含你的根文件系统的,这意味着你必须按照其他指南来解锁它grub或你的内核initramfs
  3. 您有一个已解锁的安全文件系统(例如,您的根文件系统),我们可以使用keyfile+/etc/crypttab自动解锁它。

以最后一个为例,因为这似乎是你问的情况

脚步:

  1. 创建一个keyfile并将其与驱动器关联cryptsetup luksAddKey /dev/sdb1(提示您输入 LUKS 密码)——网上有很多这方面的教程,比如https://access.redhat.com/solutions/230993
  2. 创建一个条目,/etc/crypttab告诉您的系统安装该设备(注意,使用UUID=not /dev/sdb1... 但那是另一个话题!)。由于您的根文件系统之前已luksOpen编辑,因此现在可以使用密钥文件,该文件将自动用于打开它。

现在你的btrfs文件系统可用/解密了,并且可以像没有 LUKS 一样工作(尽管是在/dev/mapper/...节点上,而不是/dev/sd...节点上)`

相关内容