将两个磁盘上的 btrfs raid1 转换为两个 luks 加密磁盘上的 btrfs raid1

将两个磁盘上的 btrfs raid1 转换为两个 luks 加密磁盘上的 btrfs raid1

我有一个 btrfs raid1,由两个大小相同的完整大硬盘组成。现在我想将数据迁移到由同一硬盘上的两个加密的 luks 设备组成的 btrfs raid1。我在其他盒子上有单独的数据副本作为备份。我的计划是从 raid1 中删除一个设备,在删除的设备上创建 luks 卷,在 luks 设备上创建 btrfs 文件系统,将数据复制到新设备上,在第二个设备上创建 luks 卷并添加第二个设备到加密的 btrfs 系统。

这听起来合理吗?有人有这方面的秘诀吗?或者我应该更好地购买第三个硬盘用于迁移?

答案1

为了回答我自己的问题,我在备用硬盘上做了以下实验。确保拥有有效且可恢复的备份。如果例如应用于错误的设备,这些命令可能会不可挽回地破坏有价值的数据。

创建测试系统

首先我们需要两个分区来使用,我使用 fdisk 创建它们以获得:

Device     Boot    Start      End  Sectors Size Id Type
/dev/sda1           2048 20973567 20971520  10G 83 Linux
/dev/sda2       20973568 41945087 20971520  10G 83 Linux

然后我创建了一个未加密的 btrfs raid1(如果使用分区,则需要强制使用 -f,但请确保您知道自己在做什么):

> mkfs.btrfs -m raid1 -d raid1 /dev/sda1 /dev/sda2

...

Devices:
   ID        SIZE  PATH
    1    10.00GiB  /dev/sda1
    2    10.00GiB  /dev/sda2

然后我安装了文件系统以拥有可以使用的实时系统,并创建了一个测试文件:

> mount /dev/sda1 /mnt/tmp
> echo "Hello World" > /mnt/tmp/hello.txt

进行迁移

首先调整文件系统的大小,以便我们稍后可以用较小的加密版本替换设备。

> btrfs fi resize 1:9G /mnt/tmp
> btrfs fi resize 2:9G /mnt/tmp

然后我们删除系统中的重复项(需要强制,因为它增加了数据丢失的风险)。在大型文件系统上,这需要很长时间,因为它会重写所有数据。我们可以通过 来检查进度btrfs balance status /mnt/tmp

> btrfs balance start -mconvert=single -dconvert=single /mnt/tmp --force
Done, had to relocate 3 out of 3 chunks

然后我们可以删除其中一台设备。如果这需要很长时间,我们可以使用 检查状态btrfs device usage /mnt/tmp

> btrfs device remove 1 /mnt/tmp
> btrfs device usage /mnt/tmp
/dev/sda2, ID: 2
   Device size:            10.00GiB
   Device slack:            1.00GiB
   Data,single:             1.00GiB
   Metadata,single:       256.00MiB
   System,single:          32.00MiB
   Unallocated:             7.72GiB

然后我们将其转换为LUKS设备

> cryptsetup luksFormat /dev/sda1
> cryptsetup luksOpen /dev/sda1 crypt_1

我们将加密设备添加到文件系统并删除另一个

> btrfs device add /dev/mapper/crypt_1 /mnt/tmp
> btrfs device remove /dev/sda2 /mnt/tmp

对于具有大量数据的文件系统来说,这将再次花费很长时间,因为所有数据都必须移动。

然后我们将另一个设备转换为 LUKS,将其添加回文件系统并重新平衡为 Raid1:

> cryptsetup luksFormat /dev/sda2
> cryptsetup luksOpen /dev/sda2 crypt_2
> btrfs device add /dev/mapper/crypt_2 /mnt/tmp
> btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/tmp
Done, had to relocate 3 out of 3 chunks

当然,如果我们有大量数据,最后一个命令将再次花费很长时间。让我们检查一下结果:

> btrfs filesystem show /mnt/tmp
Label: none  uuid: e894df1a-b62f-49cb-bcdc-8e6eb25945a4
        Total devices 2 FS bytes used 448.00KiB
        devid    3 size 9.98GiB used 1.28GiB path /dev/mapper/crypt_1
        devid    4 size 9.98GiB used 1.28GiB path /dev/mapper/crypt_2
> btrfs filesystem df /mnt/tmp
Data, RAID1: total=1.00GiB, used=320.00KiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B

瞧,我们在两个加密设备上有一个 RAID 1,仍然包含我们的数据!

> cat /mnt/tmp/hello.txt 
Hello World

相关内容