LinuxのソフトウェアRAIDを利用する

RAIDは構築だけではなくて、障害検知と復旧の手順も確認してから運用しましょう。

## RAIDの構築 ### ディスク一覧の確認 システムに接続されているハードディスクなどの一覧を得るには、lsscsi コマンドを使います。このような出力がされます。 ```text [3:0:0:0] disk ATA Hitachi HDS72161 P22O /dev/sda [3:0:1:0] cd/dvd Optiarc DVD RW AD-7200S 1.06 /dev/sr0 [7:0:0:0] disk ATA WDC WD2500JS-55N 10.0 /dev/sdc [7:1:0:0] disk ATA ST3320620AS 3.AA /dev/sdd [7:4:0:0] disk ATA ST3320620AS 3.AA /dev/sde [8:0:0:0] disk JetFlash Transcend 2GB 8.07 /dev/sdb ``` ここでは、7:1と7:4に接続されているシーゲイトのハードディスク(sddとsde)をRAID1にしてみます。これらのハードディスクはまだシステムに接続したばかりで、未使用の状態です。 普通のLinux解説サイトだと、パーティションがどうとか理屈っぽいことの説明から入るのですが、この記事ではとにかく /dev/sddと /dev/sdeを RAID1にする最短の手順だけガイドすることにします。 ### パーティションの作成 ```shell parted --script /dev/sdd 'mklabel gpt' parted --script /dev/sdd 'mkpart primary 2048s -1' parted --script /dev/sdd 'set 1 raid on' parted --script /dev/sde 'mklabel gpt' parted --script /dev/sde 'mkpart primary 2048s -1' parted --script /dev/sde 'set 1 raid on' ``` これで二つのハードディスクはRAID用に初期化されました。 新たに /dev/sdd1 と /dev/sde1 というデバイスが出現しています。LinuxのソフトウェアRAIDでは、ディスク全体をまるごと使用する場合でもいちおう原則としてパーティションの作成をすることになっています。そのため /dev/sddの1番目のパーティション(ひとつしかないけど)を作成しました。それは/dev/sdd1 というわけです。 ### RAID1の構築 二つのハードディスクをRAID用に初期化したら、mdadmというコマンドを使ってRAID1を作成しましょう。 ```shell mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdd1 /dev/sde1 ``` sdd1とsde1のふたつのハードディスクが合わさったRAID1ボリューム md0 を作りなさいというコマンドです。 ```text mdadm: array /dev/md0 started. ``` と言われます。瞬時にRAID1が構成されました。とはいえRAID1とはミラーリングのはずです。データのコピーが瞬時に行われるわけがありません。実は /dev/md0が作成された瞬間から、バックグラウンドでふたつのハードディスクのデータ同期が行われています。 ```shell cat /proc/mdstat ``` としてみましょう。 ```text Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] md0 : active raid1 sde1[1] sdd1[0] 312571072 blocks [2/2] [UU] [>....................] resync = 2.3% (7359552/312571072) finish=86.9min speed=58521K/sec ``` のような表示が出ます。いまデータ同期が2.3%進んだ所だ、というわけです。もし、同期の最中でシステムを再起動するなどした場合、同期が保留されてしまいますので ```mdstat --readwrite /dev/md0``` として同期を再開してください。 ### 構築したRAID1ボリュームの利用 RAIDボリュームはまだ同期中の状態でも利用を開始することができます。下記は今作成したRAID1ボリューム上に XFSファイルシステムを構築してマウントする例です。 ```shell mkfs.xfs /dev/md0 mount /dev/md0 /mnt ``` これでRAID上にファイルを保存できるようになりました。 ## だがここで安心してはいけない ただこれだけの設定では、ミラーリングの片方が故障してしまった時にそれを人間が知る術がありません。放っておくと、マシンが動かなくなってはじめて両方のハードディスクが故障したことに気付くというハメになります。ハードウェアRAIDであれば、けたたましいブザー音が鳴ったりディスクのLEDが赤く光ったりするので片割れの異常に気付くことができるのですが、ソフトウェアRAIDの場合はそういった自己主張の強い方法で通知をしてもらうことは出来ないため、かわりにディスクの異常検知を何らかの方法で通知するように設定しておくことで悲劇を避けることが出来るかもしれません。 ### RAID異常の時にメールを飛ばす方法 RAIDの異常を検知した際にメールを発信させるには、```/etc/mdadm.conf``` という設定ファイルの中にある MAILADDR 行に、異常検知のメールを送信する宛先アドレスを書き込み(デフォルトではコメントアウトされているのでコメントインしてください)、```systemctl start mdmonitor``` として監視デーモンを起動してください。次回のシステム起動時に監視デーモンを自動起動させるには、さらに ```systemctl enable mdmonitor``` とします。 メールの送信には ```/sbin/sendmail``` が使用されるので、sendmailで外部にメールが送信できる環境が前提となります。これについてはここで解説しきれないため、ssmtpや Postfixを使ってうまくやってくださいと述べるにとどめておきます。また、OP25Bによって外部への直接メール送信がブロックされている環境では [gmailを経由するなどして対策する必要があります](../gentoo-postfix-relay-gmail.html)。 監視デーモンが走り出し、sendmailでメールが飛ぶ環境であることを確認できたら、本当に監視しているかテストしてみましょう。RAID1を構成しているハードディスクの片方を抜いてしまいます。ここでは、/dev/sde を抜きました。しばらくしてから lsscsi を取ってみると、/dev/sdeは居なくなります。 ```text [3:0:0:0] disk ATA Hitachi HDS72161 P22O /dev/sda [3:0:1:0] cd/dvd Optiarc DVD RW AD-7200S 1.06 /dev/sr0 [7:0:0:0] disk ATA WDC WD2500JS-55N 10.0 /dev/sdc [7:1:0:0] disk ATA ST3320620AS 3.AA /dev/sdd [8:0:0:0] disk JetFlash Transcend 2GB 8.07 /dev/sdb ``` ```cat /proc/mdstat``` で RAIDの状態を確認してみてください。 ```text Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] md0 : active raid1 sdd1[0] sde12 312571072 blocks [2/1] [U_] ``` sde1が(F)、つまり Failになっていることが確認出来ます。この状態になってから数分以内にシステムからメールが飛べば監視はうまくいっています。メールが飛んで来ない場合は、SMTPサーバの指定が正しいか、SMTPサーバにリレーを拒否されていないか、迷惑メールフォルダ行きにされていないかをチェックしてみてください。 では、抜いたハードディスクを元に戻します。lsscsiを取ってみましょう。 ```text [3:0:0:0] disk ATA Hitachi HDS72161 P22O /dev/sda [3:0:1:0] cd/dvd Optiarc DVD RW AD-7200S 1.06 /dev/sr0 [7:0:0:0] disk ATA WDC WD2500JS-55N 10.0 /dev/sdc [7:1:0:0] disk ATA ST3320620AS 3.AA /dev/sdd [7:4:0:0] disk ATA ST3320620AS 3.AA /dev/sdf [8:0:0:0] disk JetFlash Transcend 2GB 8.07 /dev/sdb ``` なんと /dev/sde だったハードディスクが /dev/sdf に変わってしまっています。Linuxではハードディスクの抜き差しをする度に名前が変わってしまうのです。とはいえ、名前が変わったところで対応を間違えなければどうということはありません。 現在、RAID1ボリュームは /dev/sdd1 の片系だけで動作している状態なので、本当はもともとこのRAID1の一員だった /dev/sdf1を「新品の交換用ハードディスクだということにして」新たにRAID1に加えてやりましょう。 ```shell mdadm /dev/md0 --add /dev/sdf1 ``` このコマンドがうまくいけば、```mdadm: re-added /dev/sdf1``` と言われます。これで /dev/sdd1と /dev/sdf1 の2台体勢による RAID1が復活しました。 __RAIDは構築だけではなくて、障害検知と復旧の手順も確認してから運用しましょう。__ __RAIDは構築だけではなくて、障害検知と復旧の手順も確認してから運用しましょう。__ 大事な事なので2度言いました。 ### 監視エージェントで監視する方法 Zabbixを使用してソフトウェアRAIDの監視をする方法を [Zabbixで LinuxのソフトウェアRAIDを監視する](../zabbix-linux-raid.html) にて紹介しています。 ## RAIDをオフライン(非アクティブ)にする方法 ハードディスクを他のマシンに付け替えるなど、アレイを解除せずに(データを残したまま)ハードディスクを外したい場合は、 ```shell mdadm --stop /dev/md0 ``` としてアレイを非アクティブにし、それからハードディスクを外して下さい。 ## RAIDの解除方法 何らかの理由で、組んだRAIDを解除したい場合もあるでしょう。RAIDボリュームをマウントしている場合はまずアンマウントするなどして開放してから、RAIDを停止し、それぞれのハードディスク上に記録されているRAIDに関する情報を消去します。 __注意!これを行うと中のデータにはもうアクセスできなくなります__。つまり全ファイルを消去したのと同じことになります。意味を理解し、指差し確認してから行ってください。 ```shell mdadm --stop /dev/md0 mdadm --zero-superblock /dev/sdd1 /dev/sde1 ```