LUKS 位于 BTRFS raid 阵列之上

U. *_*lle 8 linux raid raid-1 luks btrfs

如何加密 RAID 分区btrfs

在 RAID 之上运行加密是许多来源中的最佳实践,甚至是cryptsetupFAQ 推荐的(参见 2.2)。我希望它能够跳过加密/解锁两次、复制配置、消除密钥管理开销并保持简单和愚蠢的原因。

尽管我们有这种最佳实践,但我在网上找到的几乎所有指南都btrfs首先加密磁盘/分区,然后btrfs在这些磁盘上创建阵列。由于上述原因,我不希望这样。

luksFormat在 RAIDed btrfs 分区上交互运行时,我得到:

WARNING: Device /dev/sdc1 already contains a 'btrfs' superblock signature.

WARNING!
========
This will overwrite data on /dev/sdc1 irrevocably.
Run Code Online (Sandbox Code Playgroud)

所以我猜这就是 RAID 被破坏的原因。有没有办法让这个拓扑(创建btrfsRAID 分区后加密)在不破坏 RAID 的情况下工作?

我做了什么

  1. 通过在每个 HDD 上运行类似的操作,从两个 HDD 创建两个分区:
sudo parted --script <disk-name> \
    mklabel gpt \
    mkpart 'btrfs-raid1-partition' 1MiB 100%
Run Code Online (Sandbox Code Playgroud)
  1. 在这些分区之间创建 BTRFS RAID 1 阵列,例如:
sudo mkfs.btrfs \
  -L 'btrfs-raid1-array' \
  -d raid1 \
  -m raid1 \
  /dev/sdb1 /dev/sdc1 # Two partitions from two different disks
Run Code Online (Sandbox Code Playgroud)
  1. 在 RAID 分区之一上安装 LUKS:
echo -n 'mysecret' | \
  sudo cryptsetup luksFormat \
  --batch-mode \
  --type luks2 \
  '/dev/sdc1/
Run Code Online (Sandbox Code Playgroud)

我的期望是什么

由于镜像 RAID 1 配置,我预计其他设备也会被加密,但其他磁盘没有获得相同的配置。sudo btrfs fi show当我运行或时,我还看到其他分区从 RAID 阵列中删除sudo blkid --match-token TYPE=btrfs

use*_*686 13

你不能这样做,因为 Btrfs 不是块设备 RAID 阵列,它是一个恰好包含数据镜像的文件系统。

\n
\n

首先,通过执行您所做的操作(即尝试对设备进行 luksFormat sdc1),对于 Linux 包含 \xe2\x80\x93 甚至 mdraid 或 dm-raid 的任何 RAID 系统,您都会遇到相同的故障。它们实际上并没有改变底层设备的工作方式\xe2\x80\x93,它们通过为您提供一个实现镜像的新虚拟设备来工作。

\n

例如,通过 mdadm 设置 RAID1 将创建一个虚拟/dev/md0块设备,您可以为 LUKS 创建或初始化该虚拟块设备。然而,即使 RAID 阵列“在线”,原始名称/dev/sdc1仍然代表各个设备;直接写入其中一个只会写入该单个磁盘并损坏阵列。cryptsetup luksFormat /dev/md0例如,通过 mdadm 初始化 LUKS 的正确方法是。

\n

(即使是硬件 RAID 阵列也以同样的方式工作;例如,如果您有 HP SmartArray 卡,操作系统将只能看到虚拟 RAID 磁盘,而看不到任何单独的物理磁盘。)

\n

那么 Btrfs 创建的虚拟设备在哪里呢?没有,因为它不是块级RAID系统;它本身就是一个文件系统,只是恰好支持多个支持设备进行数据镜像。(打个比方,要使用 Btrfs 进行加密,您需要将其分开并在“中间”插入 LUKS。)

\n

(嗯,您可以losetup在 Btrfs 文件系统中创建一个大型映像文件并使用 LUKS 对其进行初始化,但是随后您需要将另一个文件系统放入该 LUKS 卷中,并且在另一个 Btrfs 之上运行 Btrfs 会有点愚蠢.)

\n

这意味着您不能在 Btrfs“之上”使用 LUKS。如果您需要数据加密,其他选项是:

\n
    \n
  • 设置 ZFS 阵列,因为 ZFS 现在集成了数据加密,无需 LUKS。

    \n
  • \n
  • 使用常规 mdadm(或 dm-raid 或 LVM)创建 RAID 阵列,将 LUKS 放在其上,然后在该 LUKS 卷中使用 Ext4 或 XFS。(可能是 Btrfs,但使用 Btrfs 级别的数据镜像,仅使用 mdadm。我认为这就是 Synology 所做的......)

    \n
  • \n
  • 再等几年,Btrfs 最终会获得文件级加密,就像 ZFS 或 Ext4 和 XFS 中常见的“fscrypt”功能一样。

    \n
  • \n
\n