大约 10 天前,我使用 mdadm 管理的 RAID 1 出现故障。该阵列由 2 个通过 USB 连接的外部 2 TB 硬盘组成,我怀疑连接松动导致故障。
根据我的 bash 历史记录,我输入了以下命令:
sudo mdadm --manage /dev/md1 --fail /dev/sda1
sudo mdadm --manage /dev/md1 --remove /dev/sda1
cat /proc/mdstat
sudo mdadm --manage /dev/md1 --add /dev/sda1
cat /proc/mdstat
mailx
cat /proc/mdstat
我在网上找到了相关说明,但是 iirc,第一个和/或第二个命令失败了,因为它/dev/sda1
已经不再是数组的一部分或类似的东西。
在发生故障和我输入上述命令之间,数据肯定已写入阵列的文件系统。
我假设 mdadm 会在我发出第四个命令后将所有数据复制/dev/sdb1
到 ,/dev/sda1
这将花费相当长的时间。然而,当我几分钟后检查最后一行时,它已经完成了。
由于不知道它如何设法只复制更改的数据,我担心 RAID 和 sha256summed 上存储的数据的完整性/dev/sda1
,/dev/sdb1
除了前 128 MiB,因为我知道前 128 MiB 是不同的。事实证明,其余磁盘分别存储了完全相同的数据,因此 mdadm 确实恢复了阵列的完整性。
它如何知道哪些部分发生了变化?如果我在发生故障的时间点和我发出上述命令的时间点之间重新启动,它是否仍然有效?
答案1
cat /proc/mdstat
应该显示相应的 RAID 有一个位图。这类似于文件系统的日志:当系统崩溃(或 RAID 损坏)时,同步功能可以检查哪些数据可能被损坏。其他一切都可以忽略不计。因此重建速度非常快。
位图线的含义
从https://raid.wiki.kernel.org/index.php/Mdstat
bitmap: 0/10 pages [0KB], 16384KB chunk
例如:23/234 意味着什么
这是指内存中的位图(基本上是磁盘上位图内容的缓存 - 它使位图操作更加高效)。
如果是 23/234,则意味着内存位图中分配了 234 个页面中的 23 个。这些页面是按需分配的,并在它们为空(全为零)时被释放。内存位图对每个位图块使用 16 位来计算对该块的所有正在进行的写入,因此它实际上比磁盘上位图大 16 倍。