ストレージ実務 — RAID・スナップショット・iSCSI・fio
RAID1 を組み、1台を壊し、元に戻す
目標
ループデバイスの上にmdのRAID1を立ち上げ、1枚を故障させてdegraded状態を自分の目で見て、新しいデバイスでリビルドしたあと、チェックサムとチェック(check)で、データが無事であるという証拠を残します。
なぜ重要なのか
ディスクの交換は、インフラエンジニアが最も頻繁に行うハードウェア作業ですが、大半の人は、その瞬間を初めて経験しながら学びます。/proc/mdstatの[U_]が何なのか、--failと--removeがなぜ別々にあるのか、リビルドが終わったことと、データがそのままであることが、なぜ別の証拠なのかを、あらかじめ手で経験しておけば、明け方のアラートに慌てません。
このラボは、Ubuntu 24.04のVM上で、rootとして動きます。空のディスクがないので、ファイルをブロックデバイスのように見せるループデバイス(losetup)で、ディスク3枚を模します。実務でディスクなしにRAIDを試すときに使う、まさにその方法です。セッションは60分で始まり、最大180分まで延長でき、VMはセッションが終わると消えます。
ステップ
/var/lib/sto/raid-a.img、/var/lib/sto/raid-b.img、/var/lib/sto/raid-c.imgをそれぞれ256MiBで作成し、3つともループデバイスとして取り付けてください。losetup -aの出力を/root/sto/raid/loops.txtに保存してください。raid-a.imgとraid-b.imgのループデバイス2つで、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行は、ちょうど1行である必要があります。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=<값>の2行を書いてください。値は/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を2回実行して、mdadm.confに同じARRAY行を2回ためてしまう場合です。 - よくある間違い2: リビルドが終わる前に「終わった」と記録してしまう場合です。
recoveringが消えるまで待ってください。
ループデバイスを3つ作る
/var/lib/sto/raid-a.img、/var/lib/sto/raid-b.img、/var/lib/sto/raid-c.imgをそれぞれ256MiBで作成し(スパースファイルでかまいません)、3つともループデバイスとして取り付けてください。losetup -aの出力を/root/sto/raid/loops.txtに保存してください。
truncate -sでサイズを決め、losetup -f --showで空いているループデバイスに取り付けます。番号を直接書くと、snapが使っているデバイスとぶつかります。
RAID1のアレイ/dev/md/stoを作る
raid-a.imgとraid-b.imgのループデバイス2つで、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にアレイを1行で登録する
/etc/mdadm/mdadm.confに、/dev/md/stoのARRAY行を追加してください。そのアレイのUUIDが書かれたARRAY行は、ちょうど1行である必要があります。
mdadm --detail --briefが、ARRAY行を作ってくれます。すでにそのUUIDがファイルにあるかを先に見て、なければ追記してください。実際のサーバーなら、update-initramfs -uまで行って初めて、起動の初期に組み立てられます。
1枚を故障させて外す
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を1行ずつ出します。アレイがcleanであることと、データがそのままであることは、別の証拠です。
チェック(check)を実行して結果を残す
アレイにチェック(check)を実行して終わるまで待ったあと、/root/sto/raid/scrub.txtに2行を書いてください: last_sync_action=<값>、mismatch_cnt=<값>。2つの値は、/sys/block/<md 장치>/md/の下の同じ名前のファイルから読み取ります(プレースホルダーは値とmdデバイスです)。
/dev/md/stoは、/dev/mdNNNを指すリンクです(readlink -f)。そのデバイスの/sys/block/mdNNN/md/sync_actionにcheckを書くとチェックが始まり、mdadm --waitで終わるまで待てます。