※CUIでの操作を前提に書いています。
#PCの構成
OS:Ubuntu 18.04.2 LTS
/dev/sda1 : システムパーティション
/dev/md1 : データ用パーティション、raid5、3TB x4 + spare 3TB x1
- /dev/sdb1 : md1 active device ← 今回破損したHDD
- /dev/sdc1 : md1 active device
- /dev/sdd1 : md1 active device
- /dev/sde1 : md1 active device
- /dev/sdf1 : md1 spare device
#RAID破損の経緯
md1の中身を操作していると、突然cdコマンドが利かなくなり、ディレクトリ移動できなくなる。
再起動すると、OSがエマージェンシーモードでしか立ち上がらなくなる。
ubuntuの入ったbootable usbを用意し、これを起動して、sda1から必要なファイルを抜いてsdaにOSを再インストール。
インストール後、mdadmでraidディスクを調べると…
#症状
raidパーティション名がmd127となっている。
raidデバイス/dev/mdが存在しない。
md127はマウントできない。
mdadm --detail で見ると、raid5で組んでいたはずのアレイが、raid0と表示され、しかもinactiveとなっている。
$ sudo mdadm --detail /dev/md127
Version : 1.2
Raid Level : raid0
Total Devices : 5
Persistence : Superblock is persistent
State : inactive
Working Devices : 5
Name : xxxx:1
UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
Events : 12583
Number Major Minor RaidDevice
- 8 xx - /dev/sdf1
- 8 xx - /dev/sde1
- 8 xx - /dev/sdd1
- 8 xx - /dev/sdc1
- 8 xx - /dev/sdb1
xxは伏せ字
#復旧手順
まず、異常のある構成デバイスを探す。(sdb1を例として記載)
$ sudo mdadm --examine /dev/sdb1
Magic : a92b4efc
Version : 1.2
Feature Map : 0x1
Array UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
Name : xxxx:1
Creation Time : Sun Dec 11 21:09:08 2016
Raid Level : raid5
Raid Devices : 4
.
. (省略)
.
Device Role : Active device 3
Array State : ...A ('A' == active, '.' == missing, 'R' == replacing)
Array Stateの行から、sdb1に異常があることがわかる。
sdb1以外の構成デバイスのArray stateはAAAAだった。
raid5なので、HDD1基が壊れても復旧できることを信じ、sdb1以外でアレイを構成する。そのためにmd127を止める。
$ sudo mdadm --stop /dev/md127
mdadm: stopped /dev/md127
sdb1以外でassembleする。
$ sudo mdadm --assemble /dev/md127 /dev/sdc1
mdadm: /dev/md127 assembled from 1 drive - not enough to start the array.
$ sudo mdadm --assemble /dev/md127 /dev/sdd1
mdadm: Merging with already-assembled /dev/md/xxxx:1
mdadm: /dev/md/xxxx:1 assembled from 2 drives - not enough to start the array.
$ sudo mdadm --assemble /dev/md127 /dev/sde1
mdadm: Merging with already-assembled /dev/md/xxxx:1
mdadm: /dev/md/xxxx:1 assembled from 3 drives - need all 4 to start it (use --run to insist).
$ sudo mdadm --assemble /dev/md127 /dev/sdf1
mdadm: Merging with already-assembled /dev/md/xxxx:1
mdadm: /dev/md/xxxx:1 assembled from 3 drives and 1 spare - need all 4 to start it (use --run to insist).
アレイをrunする。
$ sudo mdadm --run /dev/md127
mdadm: started array /dev/md/xxxx:1
アレイのdetailを確認する。
$ sudo mdadm --detail /dev/md127
Version : 1.2
Creation Time : Sun Dec 11 21:09:08 2016
Raid Level : raid5
Array Size : 8781616128 (8374.80 GiB 8992.37 GB)
Used Dev Size : 2927205367 (2791.60 GiB 2997.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Jul 22 23:26:15 2019
State : clean, degraded
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : bitmap
Name : xxxx:1
UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
Events : 12583
Number Major Minor RaidDevice State
0 8 xx 0 active sync /dev/sdc1
1 8 xx 1 active sync /dev/sde1
3 8 xx 2 active sync /dev/sdd1
- 0 0 3 removed
4 8 xx - spare /dev/sdf1
この後、何もせずともspare rebuildingが始まり、復旧を完了した。
#おまけ 外した構成デバイスをフォーマットしてraidアレイに戻す
※HDDがハード的に生きていると確認できた場合のみ。
パーティションsdb1を削除し、GPTパーティションテーブルを作成する。
$ sudo fdisk /dev/sdb
コマンド (m でヘルプ): g
新しい GPT ディスクラベル (GUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) を作成しました。
sdbにパーティションを作成する。
コマンド (m でヘルプ): n
パーティション番号 (1-128, 既定値 1):
最初のセクタ (2048-5860533134, 既定値 2048):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (2048-5860533134, 既定値 5860533134):
新しいパーティション 1 をタイプ Linux filesystem、サイズ 2.7 TiB で作成しました。
パーティション #1 には linux_raid_member 署名が書き込まれています。
署名を削除しますか? [Y]es/[N]o: Y
署名は write (書き込み)コマンドを実行すると消えてしまいます。
コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。
riadアレイにsdb1をaddする。
$ sudo mdadm --manage /dev/md127 --add /dev/sdb1
mdadm.confを更新するため、mdadm.confのパーミッションを変更する。
(super userでログインしている場合は不要)
$ sudo chmod 647 /etc/mdadm/mdadm.conf
mdadm.confにraidアレイの最新情報を書き込む。
$ sudo mdadm --detail /dev/md127 --brief >> /etc/mdadm/mdadm.conf
最後に、パーミッションを戻す。
$ sudo chmod 644 /etc/mdadm/mdadm.conf
mdadm.confに古いアレイの情報がある場合は削除を忘れずに。
mdadm.confでraidアレイのパーティション名を変更すれば、--scanをつかって--assembleし直したときにパーティション名が変わる。
以上。
2022/11/9 追記
またこの記事に助けられた。これで何回目だろう。多分5回目。うちの趣味サーバーはよくクラッシュする。今回はRAID5のチェックを回しながら、サーバー内部のFANの角度を調整していたらSATAケーブルに触れて活電挿抜してしまったらしく、OSがクラッシュした。OS再インストール後にRAIDを復旧してみると、もともとアクティブだったHDD 2枚がbusyでassembleできず、顔面蒼白。誤って触ってしまったSATAカードを交換してみたところ、何故か、HDD 1枚が復活、ギリギリのところで復旧させられた。最後まで諦めない大切さを改めて感じた。本当に焦った。もうRAIDチェックを回しながらPCの蓋は開けない。それと2ポートのSATAカードを使う場合はRAID6で組んだほうがいいのかも。カードが原因でHDD 2枚がお亡くなりになっても復旧できるだろうから。