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

Jos*_*ffy 4 software-raid mdadm raid5

我目前有 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 个新的空驱动器,那会打开新的选项吗?

我使用的是mdadm3.3 版的Ubuntu Server 16.04.2 。

roa*_*ima 7

您有两个 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
Run Code Online (Sandbox Code Playgroud)

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