TT Lab
开始
学习 学习路径 课程

存储实务 — RAID、快照、iSCSI、fio

搭建 RAID1、弄坏一块盘、再恢复

在 TT Lab 中继续学习

目标

在回环设备上建立 md RAID1,让一块盘故障并亲眼看到 degraded 状态,用新设备完成重建,再通过校验和与巡检(check)留下数据完好的证据。

为什么重要

更换磁盘是基础设施工程师最常做的硬件作业,但大多数人是在第一次遇到那一刻时才学会的。如果事先亲手经历过 /proc/mdstat 中的 [U_] 是什么、--fail 和 --remove 为什么是分开的、重建结束与数据原样不变为什么是两种不同的证据,凌晨收到告警时就不会慌张。

本实验在 Ubuntu 24.04 VM 中以 root 身份运行。没有空闲磁盘,所以用让文件看起来像块设备的回环设备(losetup)模拟三块磁盘。这正是实际工作中没有磁盘时测试 RAID 所用的方法。会话从 60 分钟开始,最多可延长到 180 分钟,会话结束后 VM 会消失。

步骤

  1. 把 /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。
  2. 用 raid-a.img 和 raid-b.img 的两个回环设备创建 RAID1 阵列 /dev/md/sto(元数据 1.2)。raid-c.img 先不加入。
  3. 把 /dev/md/sto 格式化为 ext4 并挂载到 /srv/raid。向 /srv/raid/ledger.dat 写入 20MiB 的随机数据,并把 sha256sum /srv/raid/ledger.dat 的输出保存到 /root/sto/raid/ledger.sha256。
  4. 在 /etc/mdadm/mdadm.conf 中添加 /dev/md/sto 的 ARRAY 行。写有该阵列 UUID 的 ARRAY 行必须恰好一行。
  5. 把 raid-b.img 的回环设备标记为故障(fail),把标记后立即得到的 /proc/mdstat 保存到 /root/sto/raid/degraded.txt,然后把该设备从阵列中移除(remove)。
  6. 把 raid-c.img 的回环设备加入阵列进行重建,并等到结束。状态必须是 clean,活动设备 2 个,故障设备 0 个。
  7. 用第 3 步的校验和检查 ledger.dat,把 sha256sum -c 的输出保存到 /root/sto/raid/verify.txt。
  8. 对阵列运行巡检(check),结束后在 /root/sto/raid/scrub.txt 中写两行:last_sync_action=<값> 和 mismatch_cnt=<값>(占位符均为对应的值)。这些值从 /sys/block/<md 장치>/md/(占位符为 md 设备名)中读取。

参考

创建三个回环设备

把 /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 等到结束。