如何加密btrfs
RAID 分区?
在 RAID 上运行加密是许多来源中的最佳做法,甚至在cryptsetup
FAQ 中也推荐 (见 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 被破坏的原因。有没有办法让这个拓扑(在创建btrfs
RAID 分区后加密)工作而不破坏 RAID?
我做了什么
- 在两个 HDD 上分别运行以下命令来创建两个分区:
sudo parted --script <disk-name> \
mklabel gpt \
mkpart 'btrfs-raid1-partition' 1MiB 100%
- 在这些分区之间创建 BTRFS RAID 1 阵列,例如:
sudo mkfs.btrfs \
-L 'btrfs-raid1-array' \
-d raid1 \
-m raid1 \
/dev/sdb1 /dev/sdc1 # Two partitions from two different disks
- 在其中一个 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
例如使用),然后加密阵列(使用cryptsetup
on/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 个分区,它将毫无用处。