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

run*_*eks 5 raid software-raid mdadm

我目前在 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 x 1 TB 磁盘和 1 x 2 TB 磁盘。我想创建一个 2 TB RAID-1 阵列,其中镜像的一侧由两个汇集在一起​​的 1 TB 磁盘组成,镜像的另一侧是整个 2 TB 磁盘。此外,我想仅使用这些磁盘保留 1 TB 的数据,同时仍然能够用随机数据覆盖每个磁盘。

fro*_*utz 5

至于用随机数据覆盖每个磁盘,这是多余的。由于您要构建新的加密 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]
    
    Run Code Online (Sandbox Code Playgroud)
  • 从 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]
    
    Run Code Online (Sandbox Code Playgroud)
  • 擦除 2TB 磁盘

    $ shred -n 1 /dev/loop2
    
    Run Code Online (Sandbox Code Playgroud)
  • 将磁盘重新分区为 2TB。请注意,如果您没有其他引导设备,则需要一个引导分区,因为您无法从加密设备引导。

    $ parted /dev/loop2
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用该分区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]
    
    Run Code Online (Sandbox Code Playgroud)
  • 加密、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
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在您的数据在旧的 RAID 1(未加密)和新的非冗余 RAID 1(加密)上是冗余的。但是此时您必须打破冗余才能将 2x1TB 磁盘添加到新的 RAID 1。

    $ mdadm --stop /dev/md99
    mdadm: stopped /dev/md99
    
    Run Code Online (Sandbox Code Playgroud)
  • 此时,如果您想浪费时间,也可以擦除 2x1TB 磁盘。没有必要,因为 RAID-1 会将随机数据从 2TB 磁盘同步到 1TB 磁盘。

    $ shred -n 1 /dev/loop0 &
    $ shred -n 1 /dev/loop1 &
    $ wait # for shred
    $ parted /dev/loop0
    $ parted /dev/loop1
    
    Run Code Online (Sandbox Code Playgroud)
  • 根据您的喜好,使用 mdadm 或linear或组合 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_]
    
    Run Code Online (Sandbox Code Playgroud)
  • 将其添加到 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]
    
    Run Code Online (Sandbox Code Playgroud)
  • 还要增加 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.
    
    Run Code Online (Sandbox Code Playgroud)

Aaand你完成了。

编辑:

这是/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
Run Code Online (Sandbox Code Playgroud)

特别是:

  • 没有DEVICE线路(如果您必须拥有它们,请确保它包含md*设备)
  • 行的顺序ARRAY很重要 - 必须首先构建 RAID0 阵列,如果它在文件中首先列出,就会发生这种情况。