我想将 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'
从以下位置创建降级的 RAID1 阵列空盘。这个很重要!
mdadm --create /dev/md0 --level=1 --raid-devices=2 "${EMPTY_DISK}" missing
然后缩小要镜像的磁盘上的文件系统。 (希望它受到支持。)这是必需的,因为 RAID 阵列有一个标头,并且完整的文件系统不适合该阵列。
复制数据到新的降级阵列。
dd if="${DATA_DISK}" of=/dev/md0 bs=4k
将原磁盘添加到阵列中。
mdadm --manage /dev/md0 --add "${DATA_DISK}"
您可以观察同步的进度。
watch 'cat /proc/mdstat'