Mdadm

使用 mdadm 和 1 個包含數據的磁碟建構 RAID 5

  • April 13, 2019

我有 3 個完全相同的驅動器(4tb ironwolf),我想在其中使用 MDADM 進行 raid-5 以實現少量數據安全。現在的問題是,1 個驅動器充滿了我無法備份的數據。

是的,我知道當建構驅動器失敗時,我的所有數據都消失了,但我仍然想盡最大努力。

為了使其更容易理解,我們將它們稱為 sda1 和 sdb1 ,它們是空的,而 sdc1 則帶有數據。

mdadm --create --verbose /dev/md0 --level=5 --raid-devices=2 /dev/sda1 /dev/sdb1;
rsync -av --exclude-from=excludefile /dev/sdc1 /dev/md0;    
mkfs.ext4 /dev/sdc1;    
mdadm --add /dev/md0 /dev/sdc1;    
mdadm --grow --raid-devices=3 --spare-devices=1 /dev/md0;

有人可以確認這是正確的方法嗎?

如果您有少量可用磁碟空間,則可以使用環回設備測試這些命令。

創建環回設備 a、b、c:

dd if=/dev/zero bs=1M count=50 > diska.img    # Plan for RAID5
dd if=/dev/zero bs=1M count=50 > diskb.img    # Likewise
dd if=/dev/zero bs=1M count=50 > diskc.img    # Original data will be here

la=$(losetup --find --show diska.img); echo $la
lb=$(losetup --find --show diskb.img); echo $lb
lc=$(losetup --find --show diskc.img); echo $lc

創建一些“重要的原始數據”並放在第三個磁碟上($lc

mkfs -t ext4 -L data "$lc"
mount "$lc" /mnt
cp -a /usr/share/man/man1 /mnt
umount /mnt

現在嘗試根據您的想法創建 RAID5 陣列。在這種情況下,我們將$la$lb作為兩個空白磁碟,並$lc代表您重要的第三個磁碟:

mdadm --create --verbose /dev/md0 --level=5 --raid-devices=2 "$la" "$lb"

成功; 這創建了一個包含兩個成員的 RAID5 陣列。就個人而言,我已經指定了三個,第三個元素作為單詞missing,因為這使我的意圖更清楚:

mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 "$la" "$lb" missing

但是,您的下一個命令並不完全正確。rsync文件系統之間的副本,而不是設備之間的副本,所以首先你需要創建新的文件系統並掛載兩者:

mkfs -t ext4 -L data /dev/md0
mkdir -p /mnt/src /mnt/dst
mount "$lc" /mnt/src             # Here you could use mount /dev/sdc1 /mnt/src
mount /dev/md0 /mnt/dst
rsync -av --exclude-from=excludefile /mnt/src/ /mnt/dst

你應該rsync --dry-run在它做之前檢查它會做什麼。

umount /mnt/src
umount /mnt/dst

此時您需要絕對確定您已成功將數據從原始磁碟複製到新的(降級的)RAID5 陣列,因為我們要將舊磁碟添加到陣列中。

如果您最初只指定了兩個設備,則需要擴大陣列以包括第三個:

mdadm --grow /dev/md0 --raid-devices=3 --add "$lc"    # /dev/sd1c when you do this for real

另一方面,如果您接受我的建議並開始使用三個設備(其中一個是missing),您只需要添加設備:

mdadm --manage /dev/md0 --add "$lc"

最後,您可以在文件系統的預期部分重新安裝 RAID 5 陣列。用於cat /proc/mdstat查看重新同步的進展情況。

僅用於測試平台,您需要停止陣列並刪除組件

mdadm --stop /dev/md0
losetup -d "$la"
losetup -d "$lb"
losetup -d "$lc"
rm diska.img diskb.img diskc.img

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