创建一个RAID1,开启bitmap。磁盘初始内容为全0。
mdadm --create /dev/md0 /dev/vdc /dev/vdd --level=1 --raid-devices=2 --metadata=1.0 --bitmap=internal --bitmap-chunk=128K
停止它,然后单独assemble第一块磁盘。
mdadm --stop /dev/md0
mdadm --assemble --run /dev/md0 /dev/vdc
前4M写入1
./host/image/wr.sh /dev/md0 4M 0 1
停止它,然后单独assemble第二块磁盘。
mdadm --stop /dev/md0
mdadm --assemble --run /dev/md0 /dev/vdd
然后把第1块磁盘,加入进来
mdadm --add /dev/md0 /dev/vdc
此时,不会同步任何内容,因为md没有写入数据。没有脏。这就导致两块盘的内容不一致。
root@Xrouter-qemu:/mnt# hexdump -n $((8*1024*1024)) -C /dev/vdc 00000000 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 |................| * 00400000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00800000 root@Xrouter-qemu:/mnt# hexdump -n $((8*1024*1024)) -C /dev/vdd 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00800000 root@Xrouter-qemu:/mnt# hexdump -n $((8*1024*1024)) -C /dev/md0 00000000 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 |................| * 00400000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00800000
这种场景,还好,md数据是某一块盘的。
如果单独assemble vdd的时候,写入后4M数据。那么加入vdc时,只同步后4M数据。
如果md选择vdc读取内容。那么读到的内容是vdc的前4M+vdd的后4M,这可能导致文件系统损坏。
总结
mdadm -add的时候,只同步当前md bitmap dirty的chunk。
如果其它部分,不一致,那就很危险。