我有 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;
有人可以确认这是正确的方法吗?
答案1
如果您有少量可用磁盘空间,您可以使用环回设备测试这些命令。
创建环回设备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