我目前有 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
(新)。
- 如果可能的话,备份所有数据,即使您必须从朋友那里借用磁盘几天
- 在新磁盘上创建 RAID1 阵列
sdc
。它应该有两个成员,其中一个缺失 - 在此 RAID1 阵列上创建文件系统
- 将数据复制
sdb
到新的 RAID1 阵列 - 验证您是否已正确复制数据
- 添加
sdb
到RAID1阵列 - 等待同步完成
- 重启
- 将 RAID1 阵列扩展为 RAID5。它应该有三名成员,其中缺少一名。为此,您需要在额外的磁盘上有 128K 的临时空间。为此,您可能需要使用 USB 拇指棒。不要使用 RAM 磁盘。
- 将数据复制
sda
到新的 RAID5 阵列 - 验证您是否已正确复制数据
- 添加
sda
到RAID5阵列 - 重启
工作示例
这是一个使用三个文件作为磁盘映像的工作示例。
# 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
在接触磁盘上的实时数据之前,您确实应该确保您理解工作示例。不用说,这是您的责任,我真的建议您在更改实时系统之前进行备份。