假设我有一个由两个分区组成的软件 raid1 阵列。我从计算机中取出一个硬盘,并将其放入另一台计算机,然后将一些数据复制到镜像分区。
当我将 HDD 放回其原始位置时会发生什么?新数据会镜像到其他驱动器吗?如果是,控制器如何检查/注意到驱动器上有新数据?当然它不能在每次启动时检查整个分区。
另外,如果在上述情况下删除文件会发生什么情况?文件会从其他驱动器中被删除,还是会被复制回来?
这是在 Ubuntu 机器上,通过取出驱动器,我的意思是在执行此操作时计算机完全关闭,并且只有当驱动器回到原位时才会重新打开。
如果 raid 控制器由于执行此操作时电源关闭而无法识别更改,是否有办法指示它重建阵列?例如,假设 raid 是由 /dev/sda1 和 /dev/sdb1 构建的,我关闭计算机,拔出 sdb 驱动器,将数据复制到其中,再放回原位,现在我想指示控制器重建阵列,使用 /dev/sdb1“作为主设备”。
答案1
关于标记为失败和正在重建的两个答案是正确的,希望这就是会发生的情况。这是最好的情况。
另一种可能性是软件没有注意到,然后它仍然认为驱动器是同步的。(例如,如果您在关闭电源的情况下执行此操作,则可能会发生这种情况)最终结果很可能是损坏,唯一的解决方法是格式化并从备份中恢复。
请记住,RAID 在磁盘级别工作,它对顶层文件系统一无所知。只是一堆扇区。当文件系统请求块 10 时,RAID 层知道块 10 存储在磁盘 1 和磁盘 2 的块 10 上。不知何故,它会选择一个磁盘或另一个磁盘并读取块 10。除非您修改了磁盘,否则磁盘 1 和磁盘 2 上的块 10 是不同的。哎呀。您可以预期每个块上都有磁盘 1 和磁盘 2 的混合,包括用于存储文件系统元数据的块。
解决混乱
我建议您最好从中恢复,因为格式化和从备份恢复不是一种选择:
(a)立即对两个驱动器进行映像处理。备份很重要。或者,您可能只想处理副本。
(b)如果出现此错误后阵列尚未处于读/写模式,则只需拉出修改后的驱动器。使用新的空白驱动器重建。
(c)如果阵列处于读/写模式,则选择一个驱动器并将其从阵列中取出。重建到新驱动器上。
(d) 如果您完全不关心哪个驱动器,只需(当然,用您的阵列号替换 X):这会强制重新同步。
echo repair > /sys/block/mdX/md/sync_action
(e)对现已重建的阵列强制进行 fsck。
(f) 尽一切可能验证您的数据。例如,运行 debsums 检查操作系统完整性,为没有 MD5 和的内容提供所有需要的包文件。
请注意,驱动器需要是空白的,或者至少从中擦除所有 RAID 信息,否则重建将无法正常进行。
答案2
当您从活动 RAID 阵列断开驱动器时,它会在配置中将该驱动器视为故障驱动器。当您插入新驱动器(或同一驱动器)时,它会将其视为阵列中的“新”驱动器并从已知良好的剩余驱动器重建内容,因此您对内容所做的任何更改都将被覆盖。如果您在阵列处于脱机状态时对驱动器执行此操作,则所做的更改将破坏阵列控制器用于跟踪更改的校验和,并且它会再次将该驱动器视为故障驱动器并尝试重建。
如果您想将文件复制到阵列中,则需要通过控制器进行操作(无论是软件还是硬件)。
答案3
这是 Linux 还是 Windows 的问题?你具体的实现是什么?
通常,移除的驱动器已发生故障,在将其添加回去时,您必须“恢复”它。这通常意味着故障磁盘将使用工作磁盘中的所有数据重新初始化。因此,从本质上讲,在这种情况下,对移除的磁盘所做的所有更改可能会丢失
答案4
您的阵列将会损坏,因为两个磁盘中的文件系统将具有不同的数据,并且系统第一次尝试在磁盘的一个分区中写入新文件时,它不仅会弄乱文件系统的表,还会弄乱其中的数据。