Btrfs

將兩個磁碟上的 btrfs raid1 轉換為兩個 luks 加密磁碟上的 btrfs raid1

  • January 24, 2020

我有一個 btrfs raid1,它由兩個相同大小的完整大硬碟組成。現在我想將數據遷移到由同一硬碟上的兩個加密 luks 設備組成的 btrfs raid1。我在其他盒子上有單獨的數據副本作為備份。我的計劃是從 raid1 中刪除一個設備,在刪除的設備上創建一個 luks 卷,在 luks 設備上創建一個 btrfs 文件系統,將數據複製到新設備上,在第二個設備上創建一個 luks 卷並添加第二個設備到加密的 btrfs 系統。

這聽起來合理嗎?有人有這個食譜嗎?或者我應該更好地為遷移購買第三個硬碟?

為了回答我自己的問題,我在備用硬碟上做了以下實驗。確保有一個有效且可恢復的備份。如果例如將這些命令應用於錯誤的設備,這些命令可能會不可挽回地破壞有價值的數據。

創建測試系統

首先,我們需要兩個分區來使用,我使用 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

引用自:https://unix.stackexchange.com/questions/562194