搭建 RAID1、弄坏一块盘、再恢复
目标
在回环设备上建立 md RAID1,让一块盘故障并亲眼看到 degraded 状态,用新设备完成重建,再通过校验和与巡检(check)留下数据完好的证据。
为什么重要
更换磁盘是基础设施工程师最常做的硬件作业,但大多数人是在第一次遇到那一刻时才学会的。如果事先亲手经历过 /proc/mdstat 中的 [U_] 是什么、--fail 和 --remove 为什么是分开的、重建结束与数据原样不变为什么是两种不同的证据,凌晨收到告警时就不会慌张。
本实验在 Ubuntu 24.04 VM 中以 root 身份运行。没有空闲磁盘,所以用让文件看起来像块设备的回环设备(losetup)模拟三块磁盘。这正是实际工作中没有磁盘时测试 RAID 所用的方法。会话从 60 分钟开始,最多可延长到 180 分钟,会话结束后 VM 会消失。
步骤
- 把
/var/lib/sto/raid-a.img、/var/lib/sto/raid-b.img、/var/lib/sto/raid-c.img各创建为 256MiB,并把三个都挂成回环设备。把losetup -a的输出保存到/root/sto/raid/loops.txt。 - 用
raid-a.img和raid-b.img的两个回环设备创建 RAID1 阵列/dev/md/sto(元数据 1.2)。raid-c.img先不加入。 - 把
/dev/md/sto格式化为 ext4 并挂载到/srv/raid。向/srv/raid/ledger.dat写入 20MiB 的随机数据,并把sha256sum /srv/raid/ledger.dat的输出保存到/root/sto/raid/ledger.sha256。 - 在
/etc/mdadm/mdadm.conf中添加/dev/md/sto的ARRAY行。写有该阵列 UUID 的ARRAY行必须恰好一行。 - 把
raid-b.img的回环设备标记为故障(fail),把标记后立即得到的/proc/mdstat保存到/root/sto/raid/degraded.txt,然后把该设备从阵列中移除(remove)。 - 把
raid-c.img的回环设备加入阵列进行重建,并等到结束。状态必须是clean,活动设备 2 个,故障设备 0 个。 - 用第 3 步的校验和检查
ledger.dat,把sha256sum -c的输出保存到/root/sto/raid/verify.txt。 - 对阵列运行巡检(check),结束后在
/root/sto/raid/scrub.txt中写两行:last_sync_action=<값>和mismatch_cnt=<값>(占位符均为对应的值)。这些值从/sys/block/<md 장치>/md/(占位符为 md 设备名)中读取。
参考
- 回环设备:
truncate -s 256M 파일→losetup -f --show 파일,找回用losetup -j 파일(占位符均为文件名)。 - 阵列:
mdadm --create、mdadm --detail、cat /proc/mdstat、mdadm --wait。 - 更换:
mdadm <배열> --fail <장치>→--remove <장치>→--add <새 장치>(占位符依次为阵列、设备、新设备)。 - 常见错误 1:把
--detail --brief运行两次,在mdadm.conf中堆叠了两行相同的ARRAY。 - 常见错误 2:重建还没结束就记录“已经结束”——要等到
recovering消失为止。
创建三个回环设备
把 /var/lib/sto/raid-a.img、/var/lib/sto/raid-b.img、/var/lib/sto/raid-c.img 各创建为 256MiB(稀疏文件即可),并把三个都挂成回环设备。把 losetup -a 的输出保存到 /root/sto/raid/loops.txt。
用 truncate -s 指定大小,用 losetup -f --show 挂到空闲的回环设备上。如果手写编号,会与 snap 正在使用的设备冲突。
创建 RAID1 阵列 /dev/md/sto
用 raid-a.img 和 raid-b.img 的两个回环设备创建 RAID1 阵列 /dev/md/sto(元数据 1.2)。raid-c.img 先不加入。
给 mdadm --create 指定 --level 和 --raid-devices。如果出现“不适合作为启动设备”的确认提问,本实验中可以回答 y 继续。要找回是哪个回环设备,用 losetup -j <文件>。
留下文件系统和校验和
把 /dev/md/sto 格式化为 ext4 并挂载到 /srv/raid。向 /srv/raid/ledger.dat 写入 20MiB 的随机数据,并把该文件的 SHA-256 按 sha256sum /srv/raid/ledger.dat 的格式原样保存到 /root/sto/raid/ledger.sha256。
阵列也是块设备,所以 mkfs.ext4 和 mount 可以照常使用。可以用 head -c 20M /dev/urandom 生成随机数据。校验和文件中必须写绝对路径,以后才能在任何地方用 sha256sum -c 检查。
在 mdadm.conf 中用一行登记阵列
在 /etc/mdadm/mdadm.conf 中添加 /dev/md/sto 的 ARRAY 行。写有该阵列 UUID 的 ARRAY 行必须恰好一行。
mdadm --detail --brief 会生成 ARRAY 行。先看文件里是否已有该 UUID,没有时才追加。如果是真实服务器,还要执行到 update-initramfs -u,才能在启动早期完成组装。
让一块盘故障并移除
把 raid-b.img 的回环设备在阵列中标记为故障(fail),把标记后立即得到的 /proc/mdstat 保存到 /root/sto/raid/degraded.txt,然后把该设备从阵列中移除(remove)。/srv/raid/ledger.dat 仍然必须可以读取。
顺序是 mdadm <阵列> --fail <设备>,然后 --remove <设备>。标记故障后立即得到的 mdstat 中,设备名称后面会有 (F),状态栏里会有 [2/1]。
用新磁盘重建
把 raid-c.img 的回环设备加入阵列进行重建,并等到重建结束。结束后 mdadm --detail /dev/md/sto 的状态必须是 clean,活动设备 2 个,故障设备 0 个。
用 mdadm <阵列> --add <设备> 加入后,内核会开始 recovery。mdadm --wait 会等到结束。cat /proc/mdstat 中能看到进度。
用校验和确认数据
用第 3 步留下的校验和检查 /srv/raid/ledger.dat,并把 sha256sum -c 的输出保存到 /root/sto/raid/verify.txt。
sha256sum -c <校验和文件> 会对每个文件输出一行 OK 或 FAILED。阵列是 clean 与数据原样不变,是两种不同的证据。
运行巡检(check)并留下结果
对阵列运行巡检(check),等到结束后,在 /root/sto/raid/scrub.txt 中写两行:last_sync_action=<값>、mismatch_cnt=<값>(占位符均为对应的值)。这两个值从 /sys/block/<md 장치>/md/ 下的同名文件中读取(占位符为 md 设备名)。
/dev/md/sto 是指向 /dev/mdNNN 的链接(readlink -f)。向该设备的 /sys/block/mdNNN/md/sync_action 写入 check,巡检就会开始,可以用 mdadm --wait 等到结束。