如何创建 3x3TB RAID 5 阵列而不丢失 2 个驱动器的数据?

如何创建 3x3TB RAID 5 阵列而不丢失 2 个驱动器的数据?

我目前有 2 个 3TB 硬盘,其中一个几乎已满,另一个还有约 200GB 的可用空间。我想购买额外的 3TB 驱动器并设置 RAID 5 阵列,但我担心会丢失现有数据。

我发现mdadm将用于创建阵列,其命令类似于mdadm --create --verbose /dev/md0 --level=5 --raid-devices=2 /dev/sdb2 /dev/sdc2 --spare-devices=1 /dev/sdd2,其中/dev/sdb2/dev/sdc2是我现有的驱动器(有数据),并且/dev/sdd2是一个新的 3TB 驱动器,上面没有数据。这会导致我丢失/dev/sdb2和上的数据/dev/sdc2吗?

我的另一个想法是以某种方式创建一个没有备用设备的 2x3TB RAID 5 阵列,其中阵列中的一个驱动器是空的,另一个有数据。然后,我可以将文件从现有驱动器复制到新的 (6TB) 阵列,擦除现在冗余的驱动器,然后将其添加为阵列的备用驱动器。虽然我怀疑这会起作用吗?

如果以上选项均不起作用,是否有另一种方法可以创建 RAID 5 阵列,其中 2 个驱动器已包含数据,1 个驱动器为空?如果我一次添加 2 个新的空驱动器,会带来新的选择吗?

我使用的是 Ubuntu Server 16.04.2mdadm版本 3.3。

答案1

您有两个 3TB 磁盘,可存储 6TB 数据。您想要安装一张新的 3TB 磁盘。

这将允许您将三个 3TB 磁盘转换为存储 6TB 数据的 RAID5 阵列。然而,这个过程相当繁琐,并且沿途某个地方丢失数据的机会相当大。

达到要求的步骤

让我们将磁盘声明为sda(包含数据)、sdb(包含数据)、sdc(新)。

  1. 如果可能的话,备份所有数据,即使您必须从朋友那里借用磁盘几天
  2. 在新磁盘上创建 RAID1 阵列sdc。它应该有两个成员,其中一个缺失
  3. 在此 RAID1 阵列上创建文件系统
  4. 将数据复制sdb到新的 RAID1 阵列
  5. 验证您是否已正确复制数据
  6. 添加sdb到RAID1阵列
  7. 等待同步完成
  8. 重启
  9. 将 RAID1 阵列扩展为 RAID5。它应该有三名成员,其中缺少一名。为此,您需要在额外的磁盘上有 128K 的临时空间。为此,您可能需要使用 USB 拇指棒。不要使用 RAM 磁盘。
  10. 将数据复制sda到新的 RAID5 阵列
  11. 验证您是否已正确复制数据
  12. 添加sda到RAID5阵列
  13. 重启

工作示例

这是一个使用三个文件作为磁盘映像的工作示例。

# Prepare the demonstration
#
dd if=/dev/zero bs=1M count=100 of=sda.img
dd if=/dev/zero bs=1M count=100 of=sdb.img
( echo n; echo p; echo 1; echo; echo; echo w ) | fdisk sda.img  # One primary partition
( echo n; echo p; echo 1; echo; echo; echo w ) | fdisk sdb.img  # One primary partition
losetup --show --find --partscan sda.img
losetup --show --find --partscan sdb.img

# At this point we have /dev/loop0 representing the first disk sda, with /dev/loop0p1
# equivalent to a disk partition sda1. Also /dev/loop1 representing the second disk.

mkfs -t ext4 -L sda /dev/loop0p1
mkfs -t ext4 -L sdb /dev/loop1p1
mkdir -p /mnt/sda1 /mnt/sdb1
mount /dev/loop0p1 /mnt/sda1
mount /dev/loop1p1 /mnt/sdb1
cp -a /usr/local/man/. /mnt/sda1/u.l.man/
mkdir /mnt/sdb1/u.l.etc
cp -a /usr/local/bin/. /mnt/sdb1/u.l.bin/
df -h | grep mnt
umount /mnt/sda1
umount /mnt/sdb1


# Create the third disk
#
dd if=/dev/zero bs=1M count=100 of=sdc.img
( echo n; echo p; echo 1; echo; echo; echo w ) | fdisk sdc.img  # One primary partition
losetup --show --find --partscan sdc.img


# Create the RAID1 array and its filesystem
#
mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=default /dev/loop2p1 missing
mkfs -t ext4 -L md1 /dev/md1
mkdir -p /mnt/md1

# Now /dev/loop2 is equivalent to third disk sdc, and /dev/loop2p1 representing sdc1


# Copy the data from sdb to md1
#
mount /dev/loop1p1 /mnt/sdb1
mount /dev/md1 /mnt/md1
cp -a /mnt/sdb1/. /mnt/md1/
umount /mnt/sdb1
umount /mnt/md1


# Complete the RAID1 array
#
mdadm --manage /dev/md1 --add /dev/loop1p1


# Grow the RAID1 array to RAID5
#
mdadm --grow /dev/md1 --level=5 --raid-devices=3 --backup-file=/root/workarea.dat --force
e2fsck -f /dev/md1
resize2fs /dev/md1


# Copy the data from sda to md1
#
mount /dev/loop0p1 /mnt/sda1
mount /dev/md1 /mnt/md1
cp -a /mnt/sda1/. /mnt/md1/
umount /mnt/sda1
umount /mnt/md1


# Add the remaning disk to the RAID5 array
#
mdadm --manage /dev/md1 --add /dev/loop0p1


# All done
#
mdadm --stop /dev/md1
losetup -d /dev/loop0
losetup -d /dev/loop1
losetup -d /dev/loop2
rm sda.img sdb.img sdc.img

在接触磁盘上的实时数据之前,您确实应该确保您理解工作示例。不用说,这是您的责任,我真的建议您在更改实时系统之前进行备份。

相关内容