如何对现有根分区进行raid镜像?

如何对现有根分区进行raid镜像?

我想将 SSD 上现有的根(也是唯一)分区镜像到另一个磁盘。它应该是一种 RAID-1,只是不对称*。我知道有一个选项mdadm --write-behind,应该可以做到这一点。

但我不知道是否可以保留现有分区的上下文。我想象它就像

  • 创建“从”分区
  • 设置 RAID 告诉它从属分区未初始化
  • 让它通过克隆主分区来初始化它

但我可能太乐观了,不是吗?


* 所有读取操作都应访问第一个磁盘,写入操作应在第一个磁盘写入时视为已完成。

答案1

您可以从现有分区开始创建 mdraid RAID-1 阵列。首先,您需要为 mdadm 超级块腾出空间,这意味着您需要稍微缩小文件系统。

目前,正常的超级块格式是0.9。它的位置在距离分区末尾 128kB 到 60kB 之间,长度为 4kB,起始地址为 64kB 的倍数。因此,将文件系统缩小 128kB,或更精确地缩小到 ((device_size mod 64kB) - 1) * 64kB。

如果您想要每个条带超过 2TB,则需要1.0 超级块格式,尚未得到所有发行版的开箱即用支持。 1.0 超级块位于设备的末尾,我理解这意味着您只需将文件系统缩小 8kB。

现在您已经缩小了文件系统,您可以创建阵列了。首先仅使用现有数据创建一个降级数组。确保此时尚未安装文件系统。对于您的用例,写入意图位图必须位于单独的分区上。用于-e 1.0使用较新的版本 1 超级块格式。

mdadm --create /dev/md0 -e 0.9 -l 1 -n 2 \
      --write-behind=256 --bitmap=/path/to/bitmap /dev/sda1 missing

现在您可以将文件系统挂载到/dev/md0.根据您的意愿添加第二个磁盘。数据将在后台复制到新驱动器。

mdadm --add /dev/md0 --write-mostly /dev/sdb1

我创建了一个像这样的镜像数组,但没有后写模式。我认为后写模式不会使该过程无效。

答案2

我有个主意。我在循环设备上使用小型文件系统对此进行了测试,我建议您在亲自尝试之前执行相同的操作。在这个答案中,/dev/sda 是包含重要数据的磁盘,/dev/sdb 是新的空磁盘。

export DATA_DISK='/dev/sda'
export EMPTY_DISK='/dev/sdb'
  1. 从以下位置创建降级的 RAID1 阵列空盘。这个很重要!

    mdadm --create /dev/md0 --level=1 --raid-devices=2 "${EMPTY_DISK}" missing
    
  2. 然后缩小要镜像的磁盘上的文件系统。 (希望它受到支持。)这是必需的,因为 RAID 阵列有一个标头,并且完整的文件系统不适合该阵列。

  3. 复制数据到新的降级阵列

    dd if="${DATA_DISK}" of=/dev/md0 bs=4k
    
  4. 将原磁盘添加到阵列中。

    mdadm --manage /dev/md0 --add "${DATA_DISK}"
    
  5. 您可以观察同步的进度。

    watch 'cat /proc/mdstat'
    

相关内容