我有一个有趣的配置:双启动系统,带有 RAID 1,需要在 Windows 和 Linux 中都可见。Windows 安装是 Win 7 Enterprise,Linux 安装是 Kubuntu 10.04。为了使 RAID 正常工作,我使用 Windows 的“动态磁盘”RAID 1 进行设置,并使用没有持久超级块的 MD 和另一个分区上的写入意图位图在 Linux 中启动它。(如果没有此位图,MD 无法知道阵列是否同步,并且每次启动阵列时都会进行完全重新同步。)阵列组装如下:
mdadm --build /dev/md1 -l 1 -n 2 -b /var/local/md1.bitmap /dev/sdb2 /dev/sdc2
我以为第一次运行此命令时,它会重新同步阵列,写出没有脏块的位图,一切都会好起来。但事实并非如此:完成重新同步后,位图大多干净,但约有 5% 的脏块仍然存在,正如
mdadm -X /var/local/md1.bitmap
我没有在 /dev/md1 上安装文件系统或者以任何其他方式触碰它。
然后我发现停止并重新启动阵列:
mdadm --stop /dev/md1
mdadm --build /dev/md1 -l 1 -n 2 -b /var/local/md1.bitmap /dev/sdb2 /dev/sdc2
确实读取了位图,随后重新同步,由于大多数块都标记为干净,因此重新同步过程进行得很快。令人困惑的是,这种重新同步进一步减少了脏块的数量,但仍然没有删除所有脏块。通过反复停止和重新启动,我可以慢慢将脏块数量降至 0.6% 左右,似乎已经趋于平稳。
有什么想法可能导致这种情况?我觉得可能是某个地方存在竞争条件,导致块在同步期间被跳过或未从位图中正确清除,但我真的没有证据证明这一点。这看起来不像是硬件问题,因为两个驱动器都是新的,并且没有读取错误和 smartctl -a 报告的重新分配扇区。
答案1
我希望我的猜测不会冒犯您,但是您在检查之前是否监视过该/proc/mdstat
文件以确保--build
操作已经完成mdadm -X
?
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 nbd0[3] sda10[0]
53246315 blocks super 1.2 [3/1] [U__]
[>....................] recovery = 1.0% (537088/53246315) finish=203.0min speed=4326K/sec
bitmap: 1/1 pages [4KB], 65536KB chunk
要检查的第二件事是 /var/local 是否是 ext2/ext3,引用 man:
注意:外部位图仅可在 ext2 和 ext3 上使用。将位图文件存储在其他文件系统上可能会导致严重问题。