
mdadmのRAID1の修復と拡張
Linux(openSUSE Tumbleweed)のPCに2ベイのHDDケースをUSB接続して、2TBx2台のRAID1(ミラーリング)ディスクとしています。基本24時間稼働で、家の中の共有ディスクとして利用しています。
ソフトウェアRAIDのmdadmを使ってRAIDにしています。
一杯になってきたので、そろそろ容量を増やさないといけないなーと思っていた矢先、アクセスできなくなってしまいました。
RAIDとしては認識しているようですが、マウントするとスーパーブロックが読み込めないと出てしまいます。
$ cat /proc/mdstat
Personalities : [raid1]
md127 : inactive sda1[1] sdb1[0]
3907026672 blocks super 1.0
unused devices: <none>
$ sudo mount /dev/md127 /raid
mount: /raid: /dev/md127 のスーパーブロックを読み込むことができません.
dmesg(1) may have more information after failed mount system call.
ということで、RAIDの修復を行い、合わせて容量の拡張を行いました。
ディスクの選択
これまで使っていたHDDはWDのPurple(WD20PURZ)の2TBで、2017年12月から使ってたので6年6ヶ月くらい稼働していました(後で分かるように、HDDは壊れていなかったので、まだまだ使い続けることもできました)。
新しいディスクには、容量と値段との兼ね合いで東芝の6TBのディスクMN08ADA600にしてみました。1本¥19,800(税込み)でした。
ディスクのバックアップ
RAIDのディスクが単純に1台壊れたのであれば、新しいディスクに交換すれば良いのですが、今回はRAIDディスクとして動かない状況なので、安全策として現行のHDDをそのまま新しいHDDにまるごとコピーした上で、復旧作業にはコピーした方の新しいディスクを使い、古いディスクは書き換わったりしないように保存しておきます。
PCにはHDDを2台しかつなげることができない環境のため、HDDケースに新しいディスク(6TB)1台と、古いディスク(2TB)1台を差し込んでコピーします。コピーにはddを使いました。もし古いディスクのアクセス状態が悪い状況ならば、ddrescueを使った方がサルベージできると思います。
古いディスクが/dev/sdb、新しいディスクが/dev/sdaの場合は以下の感じでddでまるごとコピーできます。実行前には読み込み側と書き込み側を間違わないように何度も確認しましょう。これを間違えると取り返しがつきませんので。
$ sudo dd if=/dev/sdb of=/dev/sda bs=4k conv=noerror,sync
ですが、実行してすぐに書き込みエラーとなって止まってしまいました。
何で?と思い色々と試してみると、読み込みだけとか書き込みだけでなら正常にディスクにアクセスできるのですが、書き込みと読み込みを同時に行うとエラーになってしまいます。HDDの問題では無く、HDDケースのドライブ側のハード的な問題のようです。仕方ないのでHDDケースも新調することにしました。
これまで、コレガの2BAYのHDDケースを使っていたのですが、今回はラトックのRS-EC32-U3RZにしました。なんと都合の良いことに、ラトックプレミア楽天市場店で半額セールをやっていたので、¥7,899で購入できました。
この手のHDDケースにはハードのRAIDコントローラーが付いていますが、何かあったときに対処できないし、ハードがいつまで供給されるかも分からないので、怖くて使えないので使いません。それぞれ別のHDDとして認識するシングルモードで使います。
HDDケースを交換してコピー(dd)を実行したところ、特にエラーもなくコピーできました。HDDは壊れていなかったようです。
RAIDの修復
元のディスク(2TB)は取り外して保存しておき、コピーした方のディスク(6TB)を使ってRAIDを復旧してみます。
コピーのディスクをつないで、Linuxを起動すると一応RAIDディスクとして認識してくれます。
$ cat /proc/mdstat
Personalities :
md127 : inactive sda1[0](S)
1953513336 blocks super 1.0
unused devices: <none>
とりあえず、stopしてassembleをしてみましたが、今回はだめでした。
$ sudo mdadm --stop /dev/md127
mdadm: stopped /dev/md127
$ sudo mdadm --assemble /dev/md127 /dev/sda1
なので、2台構成のRAID1としてcreateしました。2台構成のRAIDの1台がfail状態として構成するので、そのHDDを"missing"とします。また、metadataのバージョンをこれまで使っていたバージョン(ここでは1.0)に合わせて指定します。
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=1.0 /dev/sda1 missing
mdadm: /dev/sda1 appears to contain an ext2fs file system
size=1953513280K mtime=Sun Jun 2 15:32:05 2024
mdadm: /dev/sda1 appears to be part of a raid array:
level=raid1 devices=2 ctime=Tue Dec 26 22:50:26 2017
Continue creating array?
Continue creating array? (y/n) y
mdadm: array /dev/md0 started.
/dev/md0としてstartしたようなので、この状態でマウントすることでOKになりました。ここでは、マウントポイントは/raidにしています。
$ sudo mount /dev/md0 /raid
この状態でRAID上のファイルにアクセスできるようになっていますが、1台がfail状態なので、新しいHDDをaddします。追加するディスクにLinux RAIDのパーティションを作成します。パーティションの作成にはOpenSuSEのYaSTのパーティション管理のGUIを利用しましたが、コマンドラインでpartedなどでもできると思います。
そしてそのディスクをaddします。ここでは、追加するディスクは/dev/sdb1として認識されている場合の例です。
$ sudo mdadm --manage /dev/md0 --add /dev/sdb1
syncが始まるので終わるまで待ちましょう。/proc/mdstatを見れば進行状況がわかります。
$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[2] sdb1[0]
1953513408 blocks [2/1] [U_]
[>....................] recovery = 0.1% (3688128/1953513408) finish=353.3min speed=91974K/sec
bitmap: 15/15 pages [60KB], 65536KB chunk
以上でRAIDの修復は完了です。
ちなみにオリジナルの2TBのディスク2台を使ってcreateしても復旧できました。この場合はmissingでなくディスク名を指定します。この例では、/dev/sda1と/dev/sdb1です。
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=1.0 /dev/sda1 /dev/sdb1
容量の拡張をしないのであれば、これで元の2TBx2として継続利用できます。
容量の拡張
次は容量の拡張です。
やり方としては、RAIDを構成するHDDを1台ずつfail/removeして新しい容量のHDDをaddするという作業を繰り返して、RAIDを構成する全部のHDDの容量を大きくします。
例えば、下記などに説明がありますので参考にしてください。
さて復旧した状態の自分のRAIDですが、2台とも新しい6TBのHDDとなっているものの、1台は2TBのHDDをコピー(dd)したパーティションサイズが2TBの状態です。
なので、2TBのパーティションの方のHDDを一旦fail/removeして、1台構成にした上で、改めて6TBのパーティションのHDDをaddします。
2TBパーティションのHDDを取り除く
$ sudo mdadm --manage /dev/md0 --fail /dev/sdb1
$ sudo mdadm --manage /dev/md0 --remove /dev/sdb1
6TBのパーティションのHDDを追加する
$ sudo mdadm --manage /dev/md0 --add /dev/sdb1
これで、2台とも6TBのHDD(パーティションサイズは6TB)の構成となりました。
次に、growでRAIDの容量を拡張します。
$ sudo mdadm --grow /dev/md0 -z max --assume-clean
mdadm: component size of /dev/md0 has been set to 5860521524K
さらに、ファイルシステムの拡張をします。ここではext4ファイルシステムを使っているのでresize2fsを使います。
$ sudo resize2fs /dev/md0
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/md0 is mounted on /raid; on-line resizing required
old_desc_blocks = 117, new_desc_blocks = 350
The filesystem on /dev/md0 is now 1465130381 (4k) blocks long.
以上で、RAIDの容量の拡張も完了です。もとのファイルを残したまま6TBの容量のRAIDディスクになりました。
その他のコマンド
mdadmのコマンドでexamineやdetail, scanなどがディスクの状況を把握するのに有効です。RAIDの修復作業時に良く使います。
$ sudo mdadm --examine /dev/sda1
/dev/sda1:
Magic : a92b4efc
Version : 1.0
Feature Map : 0x1
Array UUID : xxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
Name : xxxx:0 (local to host xxxx)
Creation Time : Sun Jun 9 15:22:03 2024
Raid Level : raid1
Raid Devices : 2
・・・・・
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.0
Creation Time : Sun Jun 9 15:22:03 2024
Raid Level : raid1
Array Size : 5860521524 (5.46 TiB 6.00 TB)
Used Dev Size : 5860521524 (5.46 TiB 6.00 TB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
・・・・・
$ sudo mdadm --examine --scan
ARRAY /dev/md/0 metadata=1.0 ・・・・・
まとめ
mdadmによるソフトウェアRAIDはとても安定していてロバストです。障害時にもかなりの確率で復旧でき、完全に復旧できない場合でもかなりのデータのサルベージができるように思います。
今回も無事に復旧できました。HDDの障害で無く、ケース側のドライバの障害によるものでしたが、HDDの載せ替えだけで普及できるのはソフトウェアRAIDの強みです。HDDケースに付いているハードRAIDを使っていたら、同じHDDケースに交換しても修復できたかどうかは分からないです(多分できなかったと思う)。
新調したラトックのHDDケースは、これまで使っていたものより全体的な筐体のサイズも小さく、またACアダプターもかなり小さくなったので良かったです。PCとの接続がUSB2.0からUSB3.0になって、アクセス速度も速くなった感じがします。また、最近のHDDケースでは当たり前かもしれませんが、HDDの出し入れもネジを使わずできるので、入れ替えが楽ちんになりました。予定外の出費でしたが、結果として良かったかもしれません。
結局、2TBのHDDは2台とも壊れていなかったので、2TBのHDD2台が余ってしまいました。6年以上使っているのでいつ壊れるかわかりませんが、何かの時に使いたいと思います。
