IT pass HikiWiki - [EPA]Software RAID 環境の構築と設定 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

本文書の内容は 2008/02/21 の時点では EPA サーバでは実施されていない.
2008 年度にサーバを再構築する際に導入される内容なので注意されたい.

{{toc}}

== 始めに

本文書は EPA サーバ予備機(tako)において
Software RAID 環境を構築した際の作業ログ, およびその解説である.

現在 EPA サーバ, および予備機で使用しているマザーボードは
((<ASUS P5B|URL:http://www.unitycorp.co.jp/backup_unity/products/775/detail/p5b/p5b.html>)) であり,
マザーボード上に,
いわゆる FakeRAID コントローラ((-CPU を用いてパリティ演算を行なう, 使用には OS にドライバを組込む必要がある RAID コントローラ-))が存在している.  
この FakeRAID コントローラ(JMicron) のドライバ自体は
Linux カーネルに存在するので
EPA サーバで FakeRAID を使用することは可能である.
しかしながら

* ディスクを接続する口の一方が筐体の外側に面しており, 運用上の利便性に欠ける
* パリティ演算等に CPU を使用するため Software RAID と性能的に大差無い
* kernel の再構築が必要となり, 構築が面倒((-良い勉強なのでやったら良い, という意見もあるかも.-))

という点から, Software RAID 環境を構築してみた.

環境構築作業には

* ((<URL:#OS の install 時に環境構築>))
* ((<URL:#既存のシステムに環境構築>))

という二通りの選択肢が存在する.
以下, それぞれの場合について必要な作業をまとめる.

== OS の install 時に環境構築

sarge 以降の Debian Installer には,
「ディスクのパーティショニング」の際に
「ソフトウェア RAID の設定」というメニューが存在しており,
このメニューから RAID デバイスの構築を行なことができる.
以下の作業は
「ディスクのパーティショニング」まで通常の
install と同様に作業を進めた後に行なう.

=== ディスクのパーティショニング

今回は SATA 接続(容量 512GB) の二つのディスクで RAID デバイスを作成する.
パーティションは以下の様に作成した.
なお, 容量は install 終了後に cfdisk で確認した容量である
(sda1, sdb1 は 128MB で良かったんだが, 128MB としても kb 単位で指定しても,
表の様になってしまった. byte 単位で指定したら望み通りだったのかな).

# RT
SCSI パーティション, 基本/論理, 容量(作成時の指定値), 利用方法
sda1/sdb1,  基本, 131.61MB(128MB),     RAID の物理ボリューム
sda2/sdb2,  基本, 3997.49MB(4 GB),     RAID の物理ボリューム
sda3/sdb3,  基本, 495976.16(残り全部), RAID の物理ボリューム

一応, sda1, sdb1 には Boot フラグを立てておく(不要かもしれない).

=== ソフトウェア RAID の設定

パーティションを切り終えたら,
メニュー最上部の「ソフトウェア RAID の設定」を選択する.
以下では, メニューと選んだ選択肢を記述する.

* ソフトウェア RAID の設定
  * MD デバイスの作成(MD はマルチディスクの略)
* マルチディスクデバイスのタイプ
  * RAID1 (RAID0, RAID1, RAID 5 から選べる)
* RAID1 アレイのアクティブデバイスの数
  * 2 (default は 2 のハズ, このまま)
* RAID1 アレイのスペアデバイスの数
  * 0 (default は 0 のハズ, このまま)
* RAID1 アレイのアクティブデバイスの選択
  * /dev/sda1, /dev/sdb1 を順に選択する.

以上の操作を残りのデバイスについてもくりかえす.
sda, sdb のパーティション構成の上に, md デバイスの項目が表れる.
この後で, ファイルシステムの作成とマウントポイントの指定を行なう.
結果,

# RT
デバイス,     フラグ,        容量,     ファイルシステム
md0(sda1+sdb1),  Boot,    131.61MB,     ext3
md1(sda2+sdb2),      ,   3997.49MB,     swap
md2(sda3+sdb3),      , 495976.16MB,     ext3

となる(swap を RAID 化する必要があったのだろうか?).  

アクティブデバイス, スペアデバイスは勘違いしやすいが, 両方アクティブに
しておかないと同期されないようだ. 間違ってアクティブ 1, スペア 1 にした
場合には((<URL:#後から md デバイスをアクティブにする>)) を参照されたい.

この後は通常の install 作業と同様にソフトウェアの追加等残りの install
作業を行なう. install 作業後は((<URL:#実際の運用>))へ進まれたい.

== 既存のシステムに環境構築

既に稼動しているシステムにおいて Software RAID 環境を構築する場合は,

* 別のディスクにパーティションを作成
  * 既存のディスクと同一のパーティション構成, サイズにする.
* md デバイスの作成
* md デバイスをアクティブにする(同期を取る)

という作業が必要になる. パーティションの作成については割愛する.
以下では

* 「既存のシステム = /dev/sda1, sda2, sda3」
* 「RAID の為に追加したディスク = /dev/sdb1, sdb2, sdb3」

として記述している.

=== 必要なソフトウェアの install

mdadm パッケージを install する.

$ sudo -s
# aptitude install mdadm

=== md デバイスの作成

md デバイスの作成は以下の通り.

$ sudo -s
# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1
# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb2
# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb3

mdadm の設定は /etc/mdadm/mdadm.conf に記述されている. これを更新する.

$ sudo -s
# echo 'DEVICE /dev/sd[a-z]*' > /etc/mdadm/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

initrd を更新しておく.

# mkinitrd -r /dev/md2 -o /boot/initrd.img-`uname -r`

ファイルシステムの構築

$ sudo -s
# mkfs.ext3 -f /dev/md0
# mkfs.ext3 -f /dev/md2
# mkswap /dev/md1

既存のシステムをコピーするためにシングルユーザモードへ移行する. この際, 現在稼動しているプロセスは終了するので注意されたい.

$ sudo -s
# telinit 1

ファイルをコピーする

# mount /dev/md0 /mnt
# cd /boot
# cp -ax ./ /mnt
# umount /mnt
# mount /dev/md2 /mnt
# cd /
# cp -ax ./ /mnt
# umount /mnt

/etc/fstab 内の /dev/sda? を /dev/md? に変更する.
$ vi /etc/fstab
... 編集

その後, 再起動し grub の画面で 「e」を押しコマンドモードへ移行し,
root=/dev/sda2 を root=/dev/md2 に変更して起動してみる.

=== md デバイスをアクティブにする.

上記 md デバイスの追加の最後で root=/dev/md2 として起動できた後に,
/dev/sda? を RAID に参加させる.

$ sudo -s
# mdadm /dev/md0 -a /dev/sda1
# mdadm /dev/md1 -a /dev/sda2
# mdadm /dev/md2 -a /dev/sda3

/etc/mdadm/mdadm.conf の更新

$ sudo -s
# echo 'DEVICE /dev/sda[a-z]*' > /etc/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

同期の監視. 結構時間がかかると思われるが気長に待つ.

$ watch cat /proc/mdstat

全ての同期が終わったら, 再び mdadm.conf および initrd の更新を行なう.

$ sudo -s
# echo 'DEVICE /dev/sda[a-z]*' > /etc/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# mkinitrd -r /dev/md2 -o /boot/initrd.img-`uname -r`

以上で Software RAID 環境の構築は終了である. この後は((<URL:#実際の運用>))に進まれたい.

== 実際の運用

=== grub のエントリの更新

/dev/sda, /dev/sdb どちらかにディスク不良が発生した時の為に,
どちらからでも起動できるようにしておく.

# grub
...以下 grub のコマンドプロンプト内での作業...
# device (hd0) /dev/sda
# root (hd0,0)
# install /grub/stage1 (hd0) /grub/stage2 p /grub/menu.lst
# device (hd0) /dev/sdb
# root (hd0, 0)
# install /grub/stage1 (hd0) /grub/stage2 p /grub/menu.lst

この後で, BIOS において /dev/sda か /dev/sdb のどちらかを disable にし
て起動を試してみると良い.

=== md デバイスの監視

RAID デバイスの監視は mdadm デーモンによって行なわれている. ディスクの
同期が取れない場合には /etc/mdadm/mdadm.conf 内の MAILADDR に設定された
メールアドレスにメールが飛ぶ.

EPA サーバの場合は

MAILADDR epaadmin[at]epa.scitec.kobe-u.ac.jp

と指定しておくと良いだろう.

また cron による定期的な監視は /etc/cron.d/mdadm によって行なわれている.
中身は

6 1 * * 0 root [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ] && /usr/share/mdadm/checkarray --cron --all --quiet

となっており, 毎月第1日曜日 の 01:06 に実行される様になっている.
このファイル内の内容を参考に適宜 /etc/cron.daily や /etc/cron.weekly 等
に監視スクリプトを作成しておくと良いだろう.

実際にディスク障害があった場合には, エラーのあったパーティションが md
デバイスから切り離される. 切り離されたパーティションを検査し, md デバイ
スに追加するなり, 新たなディスクのパーティションを md デバイスに追加す
るなりすれば良いだろう.

例えば md2 デバイスから /dev/sda3 を除き /dev/sdc3 を追加する場合には

$ sudo -s
# mdadm /dev/md2 --add /dev/sdc3 --remove /dev/sda2

となる.

== 後から md デバイスをアクティブにする

RAID1, RAID5 の場合のアクティブ, スペアは

* アクティブは現在 md デバイスに参加しているパーティション,
* スペアはアクティブなパーティションに障害が発生した場合にアクティブになる

となっている. そのため
install の段階でアクティブ 1, スペア 1 にした場合には
実際には RAID1 として運用されていない.

この場合には

$ sudo -s
# mdadm --grow /dev/md0 -n2
# mdadm --grow /dev/md1 -n2
# mdadm --grow /dev/md2 -n2

などとすれば良い.
実際に同期されているかは, /proc/mdstat を見てみると良いだろう.


== 参考文献

* ((<Debian GNU((:/:))Linux 徹底入門 第3版 Sarge 対応|URL:http://www.amazon.co.jp/exec/obidos/ASIN/4798102865/youheisasakis-22/ref=nosim/>))
* ((<Wikipedia, RAID|URL:http://ja.wikipedia.org/wiki/RAID>))
* man(8) mdadm
* man(5) mdadm