我有一个 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