BTRFS 磁盘阵列上的 LUKS

BTRFS 磁盘阵列上的 LUKS

如何加密btrfsRAID 分区?

在 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.

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

我做了什么

  1. 在两个 HDD 上分别运行以下命令来创建两个分区:
sudo parted --script <disk-name> \
    mklabel gpt \
    mkpart 'btrfs-raid1-partition' 1MiB 100%
  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
  1. 在其中一个 RAID 分区上安装 LUKS:
echo -n 'mysecret' | \
  sudo cryptsetup luksFormat \
  --batch-mode \
  --type luks2 \
  '/dev/sdc1/

我期望

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

答案1

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


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

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

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

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

(嗯,你可以用它losetup来在 Btrfs 文件系统中创建一个大图像文件,并用 LUKS 初始化它,但随后你需要其他文件系统,并在另一个 Btrfs 之上运行 Btrfs 有点愚蠢。)

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

  • 设置 ZFS 阵列,因为 ZFS 现在已集成数据加密,而不需要 LUKS。

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

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

答案2

您说过“我在网上找到的几乎所有使用 btrfs 的指南都首先加密磁盘/分区,然后在这些磁盘上创建 btrfs 阵列。”……知道您正在谈论并遵循哪个指南会很有趣。

我不明白你的意思,你说你要在阵列磁盘上使用 LUKS,最后在单个磁盘上使用它(/dev/sdc1

如果您想要加密 RAID 阵列,请组装阵列(md例如使用),然后加密阵列(使用cryptsetupon/dev/md0或类似命令)。您也可以分别加密/dev/sdc1/dev/sdc2并在其上构建 btrFS(但这会使加密计算量加倍)。

注意,在使用 LUKS 加密磁盘之前,您需要使用cryptsetup luksOpen /dev/_your_device_ _a_nick_name_然后使用/dev/mapper/_a_nick_name_

注意:RAID1 阵列是为了避免磁盘出现故障时丢失数据而创建的……在 和 之上/dev/sdc1/dev/sdc2同一磁盘的 2 个分区,它将毫无用处。

相关内容