2007/08/25

The Software-RAID HOWTO
- Reference: http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO.html

ふいに気がついたら、メインのCentOS 4.5マシンで、httpdがCGIを実行する時にファイルの権限が読み取れないというエラーメッセージを大量に出力していました。
どういうわけか、httpd_tドメインに許可を全て出しているSELinux上で、ホームディレクトリ以下へのアクセスが制限された状態になってしまった模様。

restoreconで直りそうな気はしつつ、permissiveモードに変更してなかった事にしたけれど、最初はfilesystemが壊れたかと思いました。
関係なかったものの現状のRAID 0では本当にファイルシステムが壊れた時に取り返しが付かないので、RAID1 or 5を構成することにしました。

だいたいの構成は、次のような感じ。

Cent OS 4.5

  • 用途: なんちゃって開発用メインマシン
  • 現状: SATAディスク2台で、/boot は RAID1、 / は RAID 0
  • 作業内容: さらに同容量のディスクを追加して、RAID 5
  • 変更のポイント: データがなくなる機会を減らす

セカンドマシンのUbuntu 6.06

  • 用途: NFS, DNSサーバーなど比較的重要
  • 現状: PATAのディスク1台で /, /boot
  • 作業内容: SATA-IIなディスクを2つ追加して、RAID 1
  • 変更のポイント: ローカルのpdumpfs用とCentOSからNFSマウントしてやはりpdumpfsでバックアップ
さっそく作業手順をみつけようとしたけれど、日本語版のLinux Software-RAID HOWTOでは mdadm を使用した説明がないらしい。そこで英語版を参考にしつつ、mdadmコマンドで構成してみました。

作業前、Ubuntu 6.06ではSATA-II 320GBなディスク2つを/dev/sda, /dev/sdb として認識しています。
fdiskを使用してパーティションをそれぞれ作成し、't'でパーティションの種類を0xfd (linux raid auto)に変更しました。これで作成されたパーティションは /dev/sda1, /dev/sdb1 の2つ。

さらに、これを /dev/md0 にするために、次のようなコマンドを実行します。

sudo mdadm --create --verbose /dev/md0 --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1
実行後のメッセージは2行だけで、一瞬で作業が完了しました。
$ sudo mdadm --create --verbose /dev/md0 --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1
Password:
mdadm: size set to 312568576K
mdadm: array /dev/md0 started.
さっそくext3ファイルシステムを作成しようとしますが、この作業には"-c"を指定したおけげで、時間がかかりました。
sudo mkfs.ext3 -c /dev/md0
RAID1で320GBの領域に対して作業時間はおおよそ1時間40分ほど。

続いて、tune2fs でfsckが走らないようにします。
まず実行前に'-l'オプションで内容を確認します。

$ sudo tune2fs -l /dev/md0
tune2fs 1.38 (30-Jun-2005)
...
Maximum mount count:      20
...
Check interval:           15552000 (6 months)
...
このままだと20回のマウント後と6ヶ月のどちらか早い方のタイミングでfsckが走ります。

tune2fsを実行して、自動的にfsckがかからないように、これらの値を変更します。

sudo tune2fs -i 0 -c 0 /dev/md0
tune2fs 1.38 (30-Jun-2005)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds
さらに'-l'付きでtune2fsを実行して内容が変更されている事を確認します。
$ sudo tune2fs -l /dev/md0
...
Maximum mount count:      -1
...
Check interval:           0 ()
...
さて問題がおこったとして、そのリカバリー方法をシミュレーションしてみます。
  1. 仮に/dev/sda1に問題が起ったとして、これを切り離す
  2. 一度 /dev/sda1 を何か別のファイルシステムにしてしまって、完全に内容を消す
  3. 再び0xfdな"linux raid auto"領域にして、/dev/md0に追加する
一度デバイスの名前を確認しておきます。
$ sudo mdadm --detail /dev/md0
Password:
/dev/md0:
        Version : 00.90.03
  Creation Time : Sat Aug 25 23:12:44 2007
     Raid Level : raid1
     Array Size : 312568576 (298.09 GiB 320.07 GB)
    Device Size : 312568576 (298.09 GiB 320.07 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Sun Aug 26 01:20:49 2007
          State : active, resyncing
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

 Rebuild Status : 42% complete

           UUID : fdf9005b:01e8f646:c5035d04:9b4f4505
         Events : 0.10

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
最後の2行で、/dev/sda1, /dev/sdb1 で構成されている事がわかるので これを /raid/0/ にマウントします。

これで準備ができたので、/dev/sda1を切離すことにして、いきなりは切離せないので、不良ディスクとする/dev/sda1を'-f'でマークします。
続いて、'--remove'で削除します。

$ sudo mdadm /dev/md0 -f /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md0
$ sudo mdadm /dev/md0 --remove /dev/sda1
mdadm: hot removed /dev/sda1
"sudo mdadm --detail /dev/md0" でディスクが一つになっている事を確認して、次に/dev/sda1を一度、関係のない用途に転用して内容を削除します。
$ sudo fdisk /dev/sda
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83
Changed system type of partition 1 to 83 (Linux)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
一度ext2でフォーマットする事で内容も書き換えてしまう。
$ sudo mke2fs /dev/sda1
....
ここで再び、fdiskを使用してパーティションのコードを'83'から'fd'に変更する。
$ sudo fdisk /dev/sda
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): w
ここまで再起動はしておらず、カーネルがもつディスク毎のパーティション情報はちょっとおかしくなっているかもしれない。 さて最後にこの新しい/dev/sda1を追加する。
$ sudo mdadm /dev/md0 --add /dev/sda1
mdadm: hot added /dev/sda1
$ sudo mdadm --detail /dev/md0
....
    Number   Major   Minor   RaidDevice State
       0       0        0        -      removed
       1       8       17        1      active sync   /dev/sdb1

       2       8        1        0      spare rebuilding   /dev/sda1
"rebuilding"とあるので、同期を取っているようですが、 /proc/mdstat の内容も確認しておきましょう。
$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[2] sdb1[1]
      312568576 blocks [2/1] [_U]
      [>....................]  recovery =  0.0% (179200/312568576) finish=4911.7min speed=1058K/sec
この結果から、およそ1MB/secのスピードだとわかるので、320GBの領域の同期に完了する時間はおおよそ、(320[GB] * 1000)[MB] / 1[MB/sec] = 320000[sec] = 533[min]と、およそ8時間だとわかります。

今日はこのぐらいにして、明日の朝にまた結果を確認してみます。

0 件のコメント: