目前,我的 RAID-1 mdadm 阵列上有 1 TB 的数据。该阵列由一个 1 TB 磁盘和一个 2 TB 磁盘上的 1 TB 分区组成。我现在购买了第二个 1 TB 磁盘,我想用它来创建 2 TB RAID-1 阵列。
该阵列上的数据将使用 dm-crypt 加密,因此我想在/dev/urandom
将数据放入之前用数据覆盖每个磁盘。
问题是我是否可以创建这个 2 TB RAID-1 阵列,并用随机数据安全地覆盖每个磁盘,同时保留当前 1 TB RAID-1 阵列上的 1 TB 数据。
回顾一下:我有 2 个 1 TB 磁盘和 1 个 2 TB 磁盘。我想创建一个 2 TB RAID-1 阵列,其中镜像的一侧由两个汇集在一起的 1 TB 磁盘组成,镜像的另一侧是整个 2 TB 磁盘。另外,我希望仅使用这些磁盘保留 1 TB 的数据,同时仍然能够用随机数据覆盖每个磁盘。
答案1
至于覆盖每个带有随机数据的磁盘,它是多余的。由于您要构建新的加密 RAID,因此重新同步无论如何都会覆盖所有内容。
至于覆盖的方法,/dev/urandom
速度非常慢,尝试使用它来擦除 TB 的人通常会中途取消,因为它花费的时间太长了。使用随机密钥加密设备然后擦除它/dev/zero
速度更快,而且shred -n 1
还要快得多。因此,如果您的磁盘上必须有随机数据,我建议您改用这些方法。
现在对于您的 RAID,我将执行以下操作:(在此示例中loop2
是 2TB 磁盘)
将新的 1TB 磁盘分区添加到 RAID-1。等到同步完成。这样,您的 1TB 数据就可以跨越三个磁盘。
$ mdadm /dev/md99 --grow --raid-devices=3 --add /dev/loop1p1 mdadm: added /dev/loop1p1 raid_disks for /dev/md99 set to 3 $ cat /proc/mdstat md99 : active raid1 loop1p1[2] loop2p1[1] loop0p1[0] 100224 blocks super 1.2 [3/3] [UUU]
从 RAID-1 阵列中删除 2TB 磁盘。您的 1TB 仍被保留多余地位于两个 1TB 磁盘上。
$ mdadm /dev/md99 --fail /dev/loop2p1 mdadm: set /dev/loop2p1 faulty in /dev/md99 $ mdadm /dev/md99 --remove /dev/loop2p1 mdadm: hot removed /dev/loop2p1 from /dev/md99 $ mdadm /dev/md99 --grow --raid-devices=2 raid_disks for /dev/md99 set to 2 $ cat /proc/mdstat md99 : active raid1 loop1p1[2] loop0p1[0] 100224 blocks super 1.2 [2/2] [UU]
擦除2TB磁盘
$ shred -n 1 /dev/loop2
将磁盘重新分区为 2TB。请注意,如果您没有其他启动设备,则需要一个启动分区,因为您无法从加密设备启动。
$ parted /dev/loop2
使用该分区并
missing
为第二个设备创建一个新的 RAID-1 阵列。第二个设备将在稍后添加。此外,目前的大小将受到限制,稍后会增加,因为我们目前不确定 2x1TB 磁盘的大小。 (如果您确定,请随意在此处使用不同的大小,但如果您将其设置得太大,以后将无法添加 2x1TB)。$ mdadm /dev/md42 --create --level=1 --raid-devices=2 --size=1000G /dev/loop2p1 missing mdadm: largest drive (/dev/loop2p1) exceeds size (102400K) by more than 1% Continue creating array? yes mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md42 started. $ cat /proc/mdstat md42 : active raid1 loop2p1[0] 102400 blocks super 1.2 [2/1] [U_] md99 : active raid1 loop1p1[2] loop0p1[0] 100224 blocks super 1.2 [2/2] [UU]
加密、mkfs、复制数据(使用您喜欢的密码和设置、LVM、文件系统、复制方法……)
$ cryptsetup luksFormat /dev/md42 $ cryptsetup luksOpen /dev/md42 luksmd42 $ mkfs.ext4 /dev/mapper/luksmd42 $ mount /dev/md99 /mnt/old $ mount /dev/md42 /mnt/new $ rsync -aAHSX /mnt/old/. /mnt/neW/. $ umount /mnt/old /mnt/new
现在,您的数据在旧的 RAID 1(未加密)和新的非冗余 RAID 1(加密)上是冗余的。但此时您必须打破冗余才能将 2x1TB 磁盘添加到新的 RAID 1。
$ mdadm --stop /dev/md99 mdadm: stopped /dev/md99
如果您想浪费时间,此时您还可以擦除 2x1TB 磁盘。没有必要,因为 RAID-1 会将随机数据从 2TB 磁盘同步到 1TB 磁盘。
$ shred -n 1 /dev/loop0 & $ shred -n 1 /dev/loop1 & $ wait # for shred $ parted /dev/loop0 $ parted /dev/loop1
linear
使用 mdadm或组合 2x1TB0
,具体取决于您的偏好。$ mdadm /dev/md43 --create --level=0 --raid-devices=2 /dev/loop0p1 /dev/loop1p1 $ cat /proc/mdstat md43 : active raid0 loop1p1[1] loop0p1[0] 199680 blocks super 1.2 512k chunks md42 : active raid1 loop2p1[0] 102400 blocks super 1.2 [2/1] [U_]
将其添加到 RAID 1 并同时扩展 RAID 1。
$ mdadm /dev/md42 --add /dev/md43 mdadm: added /dev/md43 $ mdadm /dev/md42 --grow --size=max mdadm: component size of /dev/md42 has been set to 199616K $ cat /proc/mdstat md43 : active raid0 loop1p1[1] loop0p1[0] 199680 blocks super 1.2 512k chunks md42 : active raid1 md43[2] loop2p1[0] 199616 blocks super 1.2 [2/2] [UU]
还要扩展 cryptsetup 和文件系统。
$ cryptsetup resize luksmd42 $ resize2fs /dev/mapper/luksmd42 resize2fs 1.42.7 (21-Jan-2013) Resizing the filesystem on /dev/mapper/luksmd42 to 197568 (1k) blocks. The filesystem on /dev/mapper/luksmd42 is now 197568 blocks long.
啊,你就完成了。
编辑:
/etc/mdadm.conf
这是使用此设置的示例(用于mdadm --detail --scan
获取起点):
ARRAY /dev/md43 metadata=1.2 UUID=b9f590d7:9984dad4:cb75131b:63bca165
ARRAY /dev/md42 metadata=1.2 UUID=3a70188d:9ecacda7:ac715e16:9402fc55
尤其:
- 没有
DEVICE
线路(如果必须有线路,请确保其中包含md*
设备) - 行的顺序
ARRAY
很重要 - 必须首先构建 RAID0 阵列,如果它在文件中首先列出,就会发生这种情况。
答案2
先备份一下。
我假设我的答案是 sda 是 2TB 磁盘,sdb 和 sdc 是 1TB 磁盘。 sdc 是新的空白 1TB 磁盘。目前,您有 sda1 和 sdb1 的镜像。 sda2 未使用。 (根据需要更改号码)。
我认为你可以通过以下方式到达你想要的地方:
echo repair > /sys/block/md0/md/sync_action
通过(或您的镜像所在的任何 MD 设备)进行完整的阵列一致性检查/修复。查看cat /proc/mdstat
;等待一段时间(几个小时)才能完成。这是为了确保您不会隐藏坏块等。- 擦除全新的空磁盘(让它与阵列检查同时运行)。
- 将 sda1 从镜像中删除。确认您掉落了正确的磁盘。在阅读本文之前请确认您确实进行了备份。继续擦拭
/dev/sda
(随机填充)。重新分区/dev/sda
,只有一个分区(好吧,如果有的/boot
话,也可以是两个)。另外,当您重新分区时,您可能需要留出一点可用空间,您需要确保这不大于 sdb 和 sdc 的 RAID10。 - 使用
sda1
和创建一个新的镜像missing
。我假设这是md1
.继续在其上设置 LUKS(加密),并在md1_crypt
. - 将文件从旧镜像复制到新镜像。
- 卸载旧文件系统,并停止 md0(旧阵列)。
- 擦除 /dev/sdb。
- 确保 /dev/sdc 已完成擦除。
- 在 /dev/sdb1 和 /dev/sdb2 上创建 RAID0 阵列。我会称之为
md2
- 现在将
md2
(RAID0)添加到md1
(新镜像)。
基本思想是过渡到:
sda
sdb |
\ \|/
---> RAID10 -> RAID1 ---> LUKS/dmcrypt ---> filesystem
/
sdc
您可能需要一个额外的阵列(三向镜像)/boot
。您可能希望通过在 dmcrypt 和文件系统之间放置 LVM 来为交换留出空间,或者在其自己的阵列上。