hachiNote

勉強したことをメモします。

CentOSのインストールとRAID1の構築

目的

自宅サーバのハードがとてもとても古くなってきたので、新しい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>

全部のリカバリーが終わったら元通りですよ!