images header
Index >> Plamo Linux Fan >> Software-RAID設定メモ
              Software-RAID設定メモ
2004/10/02
1.目的

 RAIDというしくみは多くの方がご存知のとおり、ディスクシステムを冗長化するしくみです。詳しくはその手の読み物をご覧ください。
 エンタープライズ向けのサーバでRAIDを構成するなら、通常Hardware-RAID(RAIDコントローラチップ搭載ディスクアレイ)を用います。この方が信頼性が高く、構築も容易です。
 しかしコストの制約等々で自宅向けやSOHO向けにこのようなハードウエアが用意できないorする気がない場合でも、冗長化は興味がありますよね。僕んちがメインで使っているNetWare(というサーバ用OS、と書かなくては通じない人が多いのかな(爆))では、標準でこの機能が組み込まれていまして、HDDが偶数台あれば簡単にRAIDが構成できましたが、Linuxではそうはいきませんでした。しかし、カーネル2.4から(パッチを当てれば2.2系列でも)Linuxで安価にRAIDを構成できるようになりました。これがSoftware-RAIDです。
 ここでは、もっともシンプルで実用性の高い「ミラーリング(RAID1)」を構成する方法を示します。
 RedHatでは、インストール時点でミラーリングを設定することも可能らしい(未確認)ですが、Plamo-4.0にはまだそういう機能はないので、Plamo- 4.0を通常どおり1つのドライブ(sda)にインストールを完了した状態から、もう1つのドライブ(sdb)をRAID構成で追加するという手順で、SCSI-HDD2台のRAID1構成にしてみます。

2.用意するもの
Kernel-2.4系列で動くLinux
Plamo-4はそのままで大丈夫です(^-^)b
最新のraidtools
http://people.redhat.com/mingo/raidtools/raidtools-1.00.3.tar.gz
ハードウエア
SCSI HDDが偶数台搭載されたPlamo-4が動くマシン。IDEで試す場合、IDEコントローラは2つ以上あったほうが多分いいと思います。詳しくは別のところで探して頂きたいのですが、IDEはSCSIと違って1つのコントローラにぶら下がっているHDDはシーケンシャルにしか操作しないようなので、RAID構成にしてもねぇ・・・
3.導入方法

 カーネル2.4以降では、RAIDを構成する機能があらかじめ組み込まれているので、この機能を使えるようにするだけでOKですが、手順等に若干コツがあるようです。以下、ここら辺のことを中心に間違いなくRAID1を構成できる事を目指して書きます。なお、RAID5等別の目的には、他のもっと詳しく書いてあるサイトをご覧アレ(笑) 僕んちはPlamo-4.01でRAID1が出来れば十分だったので(笑)
 なお、今回はブートローダはGrubを用いています。Liloを用いる場合は別途情報を探してください。

  1. カーネルの再構築
     デフォルトのカーネルは、RAID関連がすべてモジュールとしてコンパイルされている。これだとやりたいルートパーティションのRAID化時点で困るので、あらかじめRAID関連モジュールをカーネルに含める(<M>を<*>にする)。終わったら、出来上がったカーネルで起動することを確認する。
     なお、Plamo-4.0ではモジュールのありかを指す文字列が"2.4.26-plamo"という具合に余計なものがついているので、カーネルのバージョンは変わらないが、モジュールのコンパイルはやり直しになる。

  2. sdaのパーティションサイズを調査する
     インストール済みのsdaのパーティションサイズを調査して記録する。sdbをこれと全く同一サイズのパーティション構成にするため。
     参考までに、今回作ったマシンでは、以下のようになっている。
    bash-3.00# fdisk /dev/sda
    
    The number of cylinders for this disk is set to 17849.
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of LILO)
    2) booting and partitioning software from other OSs
       (e.g., DOS FDISK, OS/2 FDISK)
    
    コマンド (m でヘルプ): p
    
    ディスク /dev/sda: ヘッド 255, セクタ 63, シリンダ 17849
    ユニット = シリンダ数 of 16065 * 512 バイト
    
     デバイス ブート   始点      終点  ブロック   ID  システム
    /dev/sda1   *         1      1245  10000431   83  Linux
    /dev/sda2          1246      1276    249007+  82  Linux スワップ
    /dev/sda3          1277      1338    498015   83  Linux
    /dev/sda4          1339     17849 132624607+  83  Linux
    
    

  3. sdbにパーティションを確保する
     上で調べたサイズにする。結果的にはswapパーティションも同一サイズにすることになる。また、sdbのパーティションタイプを0x83(Linux)から0xfd(Linux raid autodetect)にする。swapパーティションもミラーするので、全部こうする。
    bash-3.00# fdisk /dev/sdb
    
    The number of cylinders for this disk is set to 17849.
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of LILO)
    2) booting and partitioning software from other OSs
       (e.g., DOS FDISK, OS/2 FDISK)
    
    コマンド (m でヘルプ): p
    
    ディスク /dev/sdb: ヘッド 255, セクタ 63, シリンダ 17849
    ユニット = シリンダ数 of 16065 * 512 バイト
    
     デバイス ブート   始点      終点  ブロック   ID  システム
    /dev/sdb1   *         1      1245  10000431   fd  Linux raid 自動検出
    /dev/sdb2          1246      1276    249007+  fd  Linux raid 自動検出
    /dev/sdb3          1277      1338    498015   fd  Linux raid 自動検出
    /dev/sdb4          1339     17849 132624607+  fd  Linux raid 自動検出
    

  4. /etc/raidtabを作成
     こういう名前のファイルを新規作成して、下記のように記載する。
    raiddev                 /dev/md0
    raid-level              1
    nr-raid-disks           2
    nr-spare-disks          0
    chunk-size              4
    persistent-superblock   1
    device                  /dev/sdb1
    raid-disk               0
    device                  /dev/sda1
    failed-disk             1
    
    raiddev                 /dev/md1
    raid-level              1
    nr-raid-disks           2
    nr-spare-disks          0
    chunk-size              4
    persistent-superblock   1
    device                  /dev/sdb2
    raid-disk               0
    device                  /dev/sda2
    failed-disk             1
    
    raiddev                 /dev/md2
    raid-level              1
    nr-raid-disks           2
    nr-spare-disks          0
    chunk-size              4
    persistent-superblock   1
    device                  /dev/sdb3
    raid-disk               0
    device                  /dev/sda3
    failed-disk             1
    
    raiddev                 /dev/md3
    raid-level              1
    nr-raid-disks           2
    nr-spare-disks          0
    chunk-size              4
    persistent-superblock   1
    device                  /dev/sdb4
    raid-disk               0
    device                  /dev/sda4
    failed-disk             1
     ここで、raiddevセクションを4つ定義しているが、それぞれ1番目のデバイスにはまだ中身の無いsdbを指定していて、2番目のデバイスである(データの入っている)sdaをfailed-diskにしている点が重要。まだraidが正しく動いていないうちに既存のデータを壊してしまわないためである。

  5. raidtoolsをインストール

    # tar xvfz raidtools-1.00.3.tar.gz
    # cd raidtools-1.00.3

    ※mkraid.cにGCC 3.2では通らないコードがあるので直す。直したコードはコレ、違いはコレ。コレをftp経由でソースツリーに上書きしてからmake。

    # ./configure
    # make
    # make install

  6. raidを作成
    bash-3.00# mkraid /dev/md0
    # mkraid /dev/md1
    # mkraid /dev/md2
    # mkraid /dev/md3

     なお、この時点で以下のようなメッセージが出る事が、かなり高い確率である。

    bash-3.00# mkraid /dev/md0
    handling MD device /dev/md0
    analyzing super-block
    disk 0: /dev/sdb1, 10000431kB, raid superblock at 10000320kB
    /dev/sdb1 appears to be already part of a raid array -- use -f to
    force the destruction of the old superblock
    mkraid: aborted.
    (In addition to the above messages, see the syslog and /proc/mdstat as well
     for potential clues.)

     このようになったときは、ドキュメントをよく読んでみれば答えが書いてあるので、各自チャレンジしてさい。あくまで自己責任で :-p

  7. raidが構築されているか確認
    # cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    md3 : active raid1 sdb4[0]
          132624512 blocks [2/1] [U_]
    
    md2 : active raid1 sdb3[0]
          497920 blocks [2/1] [U_]
    
    md1 : active raid1 sdb2[0]
          248896 blocks [2/1] [U_]
    
    md0 : active raid1 sdb1[0]
          10000320 blocks [2/1] [U_]
    
    unused devices: <none>
     この時点では、sdaがRAIDに参加していないので、いずれも片方しか動作していないことがわかる。この状態を、デグレードRAID(De-grade RAID)というらしい。

  8. 新しいパーティションにファイルシステムを作成
    # mke2fs -jc /dev/md0
    # mke2fs -jc /dev/md2
    # mke2fs -jc /dev/md3
    # mkswap -c /dev/md1
  9. 新しいパーティションに既存データをコピー
    # mount -t ext3 /dev/md0 /mnt
    # mkdir /mnt/var
    # mount -t ext3 /dev/md2 /mnt/var ←今回は/var用としてわけているため
    # mkdir /mnt/home
    # mount -t ext3 /dev/md3 /mnt/home ←今回は/home用としてわけているため
    # cp -a (/mnt, /proc, /lost+found以外) /mnt
    # mkdir /mnt/proc /mnt/mnt
    # chmod 555 /proc
    
     コピー実施後、df -T にて使用済みサイズが同一であることを確認。

  10. 作成したRAIDからブートしてみる
     sdaにあるGrubから起動するので、sda1にある/etc/grub.confを以下のように加筆。
    default 0
    timeout 30
    fallback 1
    splashimage (hd0,0)/boot/grub/grubimg.xpm.gz
    
    title Plamo-4.0 (md0)[RAID]
      root (hd1,0)
       ↑ 2台目のディスクの1つ目のパーティションからブートするの意
      kernel (hd1,0)/vmlinuz root=/dev/md0 ro
       ↑ 2台目のディスクの1つ目のパーティションの/vmlinuzをカーネルとするの意
    
    title Plamo-4.0 (sda1)
     ↑ 通常どおりブートする手段を残す
      root (hd0,0)
      kernel (hd0,0)/vmlinuz root=/dev/sda1 ro
     また、sdbにある/etc/fstabを、RAIDディスクを使うように修正。

    # vi /mnt/etc/fstab
    # cat /mnt/etc/fstab
    /dev/md1        swap    swap     defaults        0   0
    /dev/md0        /       ext3     defaults        1   1
    /dev/md2        /var    ext3     defaults        1   2
    /dev/md3        /home   ext3     defaults        1   2
    ...
    
     また、sdbからも起動できるように、sdbのMBRにGrubをセットアップする。
    # grub
    grub> root (hd1,0)
    grub> setup (hd1)
    grub> quit
     これで再起動する。無事ブートしたら、cat /proc/mdstat にて同様にRAID動作を確認する。

  11. 元のディスクをRAIDに追加する
     /etc/raidtab 内の failed-disk を raid-disk に修正。  
    # vi /etc/raidtab
     元のディスクをRAIDに追加するため、sdaのパーティションタイプも同様にすべて0xfdにする。  
    # fdisk /dev/sda
    # raidhotadd /dev/md0 /dev/sda1
    # raidhotadd /dev/md1 /dev/sda2
    # raidhotadd /dev/md2 /dev/sda3
    # raidhotadd /dev/md3 /dev/sda4
     これで cat /proc/mdstat すると、再ミラーリング状況が確認できるので、いずれも100%になれば完了。ディスクが大きいと所要時間も長いので、気長に待つ。
4.動作確認

 全部のパーティションの再ミラーリングが完了したら、マシンを再起動して正常起動を確認します。
 本来のRAIDの目的から言えば、これで冗長化ができたかどうかを確認したいところです。すなわち、片方を壊して片方だけで動くかどうかということですが、まぁいろんな状況があるので各自で工夫して試してください :-p

 なお、片方が壊れたときに同じサイズの新しいHDDをつけたら自動で再構築するか?という点については、全自動・・・というわけにはいかなそうです(^^; 少なくとも、パーティションの作成とタイプの変更、raidhotaddの再実行は必要でしょう。NetWareならマウントさえしてしまえば勝手に再構築しますが B-p

付録1.参考文献

JFの文書
Software-RAID HOWTO
ユーザサイト
Software RAID めも


Index >> Plamo Linux Fan >> Software-RAID設定メモ
images footer