將兩個磁碟上的 btrfs raid1 轉換為兩個 luks 加密磁碟上的 btrfs raid1
我有一個 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