目的
自宅サーバのハードがとてもとても古くなってきたので、新しいPCへ移行させます。そのために必要なのはまず新しいPCにOSをインストールして、RAIDを構築することです。この作業のメモです。
環境やデータは基本的にそのまま、OSは CentOS 5.3 から CentOS 5.5 へマイナーバージョンアップします。HDDはSATAが2台で、LinuxのソフトウェアRAID機能を使ってRAID1(ミラーリング)を組みます。
手順
OSのインストールに関しては、ここで私がいろいろ書かなくてもさまざまな情報がネットに転がっているので省略します。
めちゃめちゃ詳細にまとまっているページがありましたので、こちらを参考にさせていだきました。
��CentOS5�̃C���X�g�[�� �����S�҂̂��߂�Linux�T�[�o�[�\�z�u��(CentOS �����T�[�o�[�Ή�)�����֗��T�[�o�[.com��
RAIDに関してもものすごくまとまっています。
��RAID���\�z���遞���S�҂̂��߂�Linux�T�[�o�[�\�z�u��(CentOS �����T�[�o�[�Ή�)�����֗��T�[�o�[.com��
RAIDは概念がわかっているのであれば、OSインストール時のGUIは割りと簡単にRAIDを組めますので、とりあえず何とかやってみればわかります。
どちらかというと悩むのは、どのパーティションにどれくらいHDD容量を割り当てるかですね。これはいつもいつも悩みに悩みます。
今回の切り方をメモっておきます。
RAIDデバイス /dev/md1 /boot ext3 258 /dev/md2 / ext3 40962 /dev/md3 swap 8189 /dev/md5 /home ext3 307203 /dev/md6 /var ext3 102398 ハードドライブ /dev/sda /dev/sda1 /dev/md1 ソフトウェアRAID 258 1 33 /dev/sda2 /dev/md2 ソフトウェアRAID 40962 34 5255 /dev/sda3 /dev/md3 ソフトウェアRAID 8189 5256 6299 /dev/sda4 拡張領域 427526 6300 60801 /dev/sda5 /dev/md5 ソフトウェアRAID 307203 6300 45462 /dev/sda6 /dev/md6 ソフトウェアRAID 102398 45463 58516 空き 自由領域 17924 58517 60801 /dev/sdb sdaとまったく同じなので省略
実は17GBくらいちょろっと余ってます。やろうと思えばあとからパーティションの増量も可能だと書いてあったので、足りなくなったときにの備えにしておくか……という思いがあったんですが、もしかしたらそれにははじめからLVMとかちゃんとやってないとだめかも。やれるとしてもかなり面倒なはず。ま、そのとき考えよう。
/varが大きすぎたような気がするな……。ま、いいや。
ブートローダを2台目のHDDにもインストールする
さてここからが本番です。これまでの作業でRAIDはすでに構築されているのですが、ブートローダは片方のHDDにしか入っていません。
この状態だと、もし運悪く1台目のほうのHDDが壊れてしまった場合に起動することができなくなります。なので、2台目のほうにもブートローダをインストールします。
CentOSで使われているブートローダはGRUBというものですが、これはFDDやCDに入れてそこから起動することもできるらしく、ここでの作業を後から(1台目が壊れてしまってから)行うことも可能っぽいです。でもまあ非常時にあわてたくないですね。
GRUBのコマンドを打つ
2台目にもブートローダを入れるには、grub と打ってGRUBを起動させて、いくつかコマンドを打つだけです。
GNU GRUB version 0.97 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.] grub> device (hd0) /dev/sdb grub> root (hd0,0) Filesystem type is ext2fs, partition type 0xfd grub> install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf grub>
grub> の行が実際打ち込んだものですね。最後にquitと打つと抜けられます。
私が行ったのは上記のとおりですが、いろいろ調べてみると、人によって微妙に打っているコマンドが違うんですよねぇ。それがすごく気になって、GRUBコマンドのマニュアルとかいろいろ見て調べてました。
でその結果上のコマンドを選んだわけですが、正直言って説明できるほどには理解できなかったです。
まず、GRUBってなんやねん、ってところはこれが参考になります。
http://www.turbolinux.com/products/server/11s/user_guide/grub.html
GRUBコマンドの解説はここ。
http://jo1upk.blogdns.net/linux/?%E3%82%BD%E3%83%95%E3%83%88%2FGRUB%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
手順の紹介はここあたり。
ソフトウェアRAID1のつくりかた
ソフトウェアRAIDのリカバリ手順 - Knowlege Database
壊れたときに本当にRAIDが機能するのか検証してみる
ここまでやれば、ちゃんとRAID1でどちらかのHDDが破損したとしてもデータは無事なはず……。なんですが。
ブートローダのインストールの件もあったりで、ほんとにこれまでの手順が正しいのか、どうも不安です。うむ、それならばテストです!
壊れる前のRAIDの状態を確認する
RAIDの状況を確認するには、/proc/mdstat をテキストエディタなどで見るとよいです。
Personalities : [raid1] md1 : active raid1 sdb1[1] sda1[0] 264960 blocks [2/2] [UU] md3 : active raid1 sdb3[1] sda3[0] 8385856 blocks [2/2] [UU] md5 : active raid1 sdb5[1] sda5[0] 314576640 blocks [2/2] [UU] md6 : active raid1 sdb6[1] sda6[0] 104856128 blocks [2/2] [UU] md2 : active raid1 sdb2[1] sda2[0] 41945600 blocks [2/2] [UU] unused devices: <none>
とりあえずこんな感じ。
1台目のHDDを擬似的に壊してみる
どうやって故障した状態をテストしようか悩んだんですが、考えたすえ、1台目のHDDの電源ケーブルを引っこ抜くことにしました。えいっ!
そして起動です。
……って、もし2台目へのブートローダインストールが失敗していたら、起動しない状態になっちゃうんですが……。おっ、無事起動しました! どうやら手順は正しかったようです。
起動すると、 root 宛てにメールがばんばん飛んで来ています。こんな感じです。
Subject: DegradedArray event on /dev/md5:localhost.localdomain This is an automatically generated mail message from mdadm running on localhost.localdomain A DegradedArray event had been detected on md device /dev/md5. Faithfully yours, etc. P.S. The /proc/mdstat file currently contains the following: Personalities : [raid1] md1 : active raid1 sda1[1] 264960 blocks [2/1] [_U] md3 : active raid1 sda3[1] 8385856 blocks [2/1] [_U] md5 : active raid1 sda5[1] 314576640 blocks [2/1] [_U] md6 : active raid1 sda6[1] 104856128 blocks [2/1] [_U] md2 : active raid1 sda2[1] 41945600 blocks [2/1] [_U] unused devices: <none>
もちろん直接 /proc/mdstat を覗いてもいいです。壊れる前の /proc/mdstat と比べると、いくつか違っている箇所がありますね。[0] っていうのがなくなってます。
でも電源引き抜いたのは sda のほうだったはずなんだけど……。片方が完全に認識しない状態になると、sda とか sdb とかの名前は詰めて認識されるってことなのかしら。
壊れたHDDを復旧させる
もし本当に壊れてしまったら、新しいHDDを買ってきてつなげて起動した後、fdiskでパーティションをもう1台と同じになるように設定しなおす必要があります。これはコマンドラインでちまちまやる必要があるので、結構面倒な作業です。
今は実際に壊れたわけではないので、はずしていた電源ケーブルを挿しなおして再起動すればいいです。
でも再起動したら勝手に元通りになるわけではありません。また正常なRAID状態にするには mdadm コマンドを打って新しいHDDをRAIDに参加させる必要があります。
# mdadm --manage /dev/md1 --add /dev/sda1 mdadm: re-added /dev/sda1
パーティションがいくつかあるのであれば、それぞれに対してコマンドを打ちます。md1とかsda1のところは各自のRAIDパーティションの構成や追加するHDDによって違ってくるので、くれぐれも気をつけて。間違ってaddしてしまうと、最悪データが消えてしまうかもしれません。
下の例は、md1, md2をaddしたあとの状態です。リカバリーが進んでいる様子がわかります。md3はswap領域なんですが、addしなくても勝手に復旧していたような気もしないでもない(うろ覚え)。ひとつのリカバリーが終わる前に次のパーティションをaddしても大丈夫みたいです。ちゃんと前のやつが終わるまで待ってからリカバリーを開始してくれます。
Personalities : [raid1] md1 : active raid1 sda1[0] sdb1[1] 264960 blocks [2/2] [UU] md3 : active raid1 sdb3[1] sda3[0] 8385856 blocks [2/2] [UU] md5 : active raid1 sdb5[1] 314576640 blocks [2/1] [_U] md6 : active raid1 sdb6[1] 104856128 blocks [2/1] [_U] md2 : active raid1 sda2[2] sdb2[1] 41945600 blocks [2/1] [_U] [>....................] recovery = 2.1% (912640/41945600) finish=5.9min speed=114080K/sec unused devices: <none>
全部のリカバリーが終わったら元通りですよ!