我可以用一个 2 TB 磁盘和两个 1 TB 磁盘创建 2 TB RAID-1 阵列,同时保留 1 TB 数据吗?

我可以用一个 2 TB 磁盘和两个 1 TB 磁盘创建 2 TB RAID-1 阵列,同时保留 1 TB 数据吗?

目前,我的 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或组合 2x1TB 0,具体取决于您的偏好。

    $ 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 未使用。 (根据需要更改号码)。

我认为你可以通过以下方式到达你想要的地方:

  1. echo repair > /sys/block/md0/md/sync_action通过(或您的镜像所在的任何 MD 设备)进行完整的阵列一致性检查/修复。查看cat /proc/mdstat;等待一段时间(几个小时)才能完成。这是为了确保您不会隐藏坏块等。
  2. 擦除全新的空磁盘(让它与阵列检查同时运行)。
  3. 将 sda1 从镜像中删除。确认您掉落了正确的磁盘。在阅读本文之前请确认您确实进行了备份。继续擦拭/dev/sda(随机填充)。重新分区/dev/sda,只有一个分区(好吧,如果有的/boot话,也可以是两个)。另外,当您重新分区时,您可能需要留出一点可用空间,您需要确保这不大于 sdb 和 sdc 的 RAID10。
  4. 使用sda1和创建一个新的镜像missing。我假设这是md1.继续在其上设置 LUKS(加密),并在md1_crypt.
  5. 将文件从旧镜像复制到新镜像。
  6. 卸载旧文件系统,并停止 md0(旧阵列)。
  7. 擦除 /dev/sdb。
  8. 确保 /dev/sdc 已完成擦除。
  9. 在 /dev/sdb1 和 /dev/sdb2 上创建 RAID0 阵列。我会称之为md2
  10. 现在将md2(RAID0)添加到md1(新镜像)。

基本思想是过渡到:

                     sda
sdb                   |
    \                \|/
     ---> RAID10 -> RAID1 ---> LUKS/dmcrypt ---> filesystem
    /
sdc

您可能需要一个额外的阵列(三向镜像)/boot。您可能希望通过在 dmcrypt 和文件系统之间放置 LVM 来为交换留出空间,或者在其自己的阵列上。

相关内容