Slackware 10.2 のシステムパーティションを RAID 1 にしてみる
SOFTWARE REPORT
Slackware 10.2 でミラーリングを行ってみる
先日に EZ-NET レポート: Slackware 10.2 を Virtual Server 2005 へインストールしてみる でお話した Slackware 10.2 のシステムを、パーティションをミラーリング (RAID1) してみることにしました。
そこまでする必要はないかとも思ったのですけど、先日に別件で Linux システムの RAID を見る必要があって、せっかくだし既存のシステムをミラーリングするところから始めてみれば、別のシステムとかで何か障害が発生した時にでも少しは慌てずに済むかなと思ったのも今回のお話のきっかけです。
なにはともあれ個人的な印象ですけど、Slackware はあまり便利さというか手軽さを追求していないディストリビューションだと思うので、上手く出来るかわからないところではありますけど、判ればそれなりに見通しも効くようになるかなとおもって、やってみようと思います。
既存のシステムを RAID 0 へ移行する
Slackware 10.2 の起動は LILO で行われますので、それを想定した設定となるようです。
インストール時には "adaptec.s" 構成の起動イメージを選択してあったのですけど、この場合はそれはどうやらモジュールとしてではなくカーネルの方に RAID 関連のシステムが組み込まれるようなので、起動パーティションを RAID 構成にしても大丈夫そうです。そうでない場合はカーネルの "Mutli-device support" のところで RAID 機能を組み込んでやるか、または "mkinitrd --with-raid1" を実行するかなどして、システムを RAID パーティションから実行できるようにしておく必要があるとのことでした。
ハードディスク構成は、今回は Microsoft Virtual Server 2005 上のシステム環境となっていますので、sda と sdf を丸ごと 1 パーティションとして利用して、それらをミラーリングするという形になります。
それでは、 sda1 には既に RAID 機能が組み込まれた Slackware 10.2 がインストールされて起動できる状態にあり、そこに sdf を新規追加したところからお話しを始めて行こうと思います。
複製を保存するハードディスクの準備をする
とりあえず、まずはミラーリング用として用意した sdf の準備を行っておきます。
fdisk /dev/sdf
このようにして fdisk を起動して、パーティションを作成しました。今回は sdf を丸ごとひとつ sdf1 として利用することにしますので、そのように作成したら、さらにそれのパーティションタイプを "Linux raid autodetect" (0xfd) に変更しておくのも忘れないようにします。
これでハードディスクの準備は完了です。
このまますぐにいろいろやっても良いのかもしれないですけど、そういえば Slackware のインストールの時には fdisk を行ってそのまますぐだとインストールがうまく行かなかった記憶がありますので、念のためここで Linux を再起動しておきましょう。
起動パーティションを RAID パーティションに差し替える
【注意】
作業手順を間違えたり、複製したいディスクの指定を間違うなど RAID デバイスの構築に失敗すると、データを丸ごと失うことになりますので、必ずバックアップを取って、そして泣かない覚悟を決めてから行ってください。
作業の方向性としては、マウントされているパーティションをいきなり RAID デバイスとして構築することはできないため、まずはミラー用に追加した /dev/sdf1 を用いて RAID デバイスを構築し、そこへ Linux システムファイルを全てコピーします。
そして RAID デバイスから Linux を起動したら、今まで使用していた /dev/sda1 を起動ディスクの RAID ミラーディスクとして組み込みなおす感じです。
RAID 構成ファイル ( /etc/raidtab ) を用意する
パーティションを RAID として割り当てられるように、まずは次のような構成情報を /etc/raidtab へ書き込みます。
いろいろな設定を調べていても /etc/raidtab にインデントや空白行を含めてないものばかりが目に付きましたけど、各行ごとに TAB を入れてもぜんぜん問題はないようでした。なので、ブロック的に見やすくするために TAB を入れています。
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 32
persistent-superblock 1
devicd /dev/sda1
failed-disk 0
device /dev/sdf1
raid-disk 1
最初の "raiddev" で、構築したい RAID デバイス名を指定します。デバイス名は "/dev/md?" という感じで、 ? のところに 0 から 15 までの数値で指定するようですが、最初のデバイスでもあるので 0 を指定しておくことにしました。
つづいて "raid-level" では、そのデバイスの RAID タイプを指定します。今回はミラーリング (RAID 1) なので 1 を指定します。そして "nr-raid-disks" のところでは RAID 構成に使用するパーティションの数を、"nr-spare-disks" では予備として待機させておくパーティションの数を指定します。"chunk-size" は一度にどれくらいのデータを取り扱うかという設定だそうですけど、RAID1 には特に影響はしないというような話を耳にしました。
重要なのが "persistent-superblock" で、これを設定しておかないと RAID デバイスを自動検出してくれないため、特に起動パーティションとして RAID デバイスを使用したい場合には必須となるとのことでした。
そして "device" のところでは、RAID の構築に使用するパーティションを設定する感じとなります。ここでは必要な数だけ device を記載する感じになり、それとセットで "raid-disk", "failed-disk", "spare-disk" といった、そのパーティションの取り扱いを指定する形となるようでした。
"raid-disk" は RAID の構築に実際に使用されるパーティションで、そのパーティションを何番目の構成ディスクとして使用するかを添えて指定します。"failed-disk" は、RAID を構成しているディスクが故障した時にそれを明示的に知らせるために使用するもので、添える番号は "raid-disk" と同じく、何番目の構成ディスクであるかを指定する感じになるようです。
"spare-disk" については、RAID が故障した際の待機用として用意していることを示すもので、これに添える番号は、その予備ディスクのうちの何番目であるかを指定する感じになるようでした。
既存の起動パーティションを "Linux raid autodetect" (0xfd) に切り替える
素直に Linux システムをインストールしていた場合には、そのパーティションは "Linux" (0x83) になっていると思います。
RAID を構成する場合にはパーティションタイプを "Linux raid autodetect" としないといけないようなので、次のようにして fdisk を起動した上で、パーティションタイプを 0xfd に変更しておきます。
fdisk /dev/sda
パーティションタイプを変更すると、Linux システムがまだ古いパーティションタイプとして認識しているようなメッセージが表示されましたので、そのまま設定を継続して良いのか判らなかったため、念のため再起動をかけておきました。
必ず成功する保障までは出来ませんけど、とりあえずパーティションタイプを変更した状態では、Linux の再起動に支障をきたすことはないような感じでした。
RAID デバイスを構築する
/etc/raidtab を適切に準備したら、次のようにして RAID デバイスの構築を行います。
mkraid /dev/md0
このようにしたら、続いて /dev/md0 を初期化しておきましょう。ここでは raiserfs にて初期化を行っていますけど、お好みに応じて "mke2fs" などを使用します。
mkraiserfs /dev/md0
容量にもよりますけどけっこう時間がかかるので、気長に待つ感じとなりました。特に mkraiserfs の場合、"Initializing journal" というメッセージで 100% をむかえてからは何の通知もないままなので、いつ終わるのやら良く判らない感じです。
ファイルシステム構成 (/etc/fstab) を調整する
起動パーティションが RAID デバイスになった場面を見越して、/etc/fstab のそれに関する部分を修正します。
/dev/sda1 / reiserfs defaults 1 1
書き換えるのはこの部分です。最初の段階では /dev/sda1 を / パーティションとしてマウントするような設定になっているので、ここを /dev/md0 に差し替えてあげる感じになります。ファイルシステムも同じものにしましたので、パーティションの指定以外は特にいじらず、次のような感じとしておきました。
/dev/md0 / reiserfs defaults 1 1
LILO の設定を調整する
続いて Slackware 10.2 が採用しているブートローダー LILO の設定を調整します。
ミラーリングで起動する場合は物理的には複数台の起動ディスクが存在することになりますので、そのどちらからでも正常に起動を行えるように、それぞれの設定ファイルを用意しておくのが良いようです。
今回は /dev/sda1 と /dev/sdf が /dev/md0 の構成パーティションとなりますので、それぞれ用として "/etc/lilo.conf.sda" と "/etc/lilo.conf.sdf" を用意しておくことにします。
これらのファイルを作成するために、まずは既存の "/etc/lilo.conf" をコピーします。
cp /etc/lilo.conf /etc/lilo.sda.conf
cp /etc/lilo.conf /etc/lilo.sdf.conf
そうしたら、現在でも起動ディスクとして使用している /dev/sda1 用の "lilo.sda.conf" には、その "boot = /dev/sda" の記載の前に次の 2 行を追加します。なお bios=0x80 となっているのは、システム上の最初のハードディスクとして接続されているためです。
disk = /dev/md0
bios = 0x80
また "lilo.sdf.conf" ファイルについては、上記の 2 行と合わせて "boot = /dev/sda" の部分も調整します。ここで bios=0x81 となっているのは、/dev/sdf がシステム上の 2 つめ以降のハードディスクとして接続されているためです。
disk = /dev/md0
bios = 0x81
boot = /dev/sdf
"lilo.sda.conf" と "lilo.sdf.conf" のどちらとも、カーネルイメージを指定する部分についても調整しておきましょう。修正点は "root" の部分で、ここのパーティションを RAID デバイスにしておきます。
image = /boot/vmlinuz
root = /dev/md0
label = Linux
read-only
現在の OS ファイルをコピーする
ここまで準備が終わったら、現在のシステムのデータを全て /dev/md0 へコピーします。
そのためにまずは念のため、次のようにしてシングルユーザーモードにしておきましょう。
init s
続いて /dev/md0 を /mnt にマウントします。
mount /dev/md0 /mnt
そして、次のようにして /proc をのぞくローカルディレクトリ全てを "os-copy.tar.gz" としてアーカイブにまとめます。
tar -cvzf /mnt/os-copy.tar.gz --one-file-system --preserve-permission --same-owner --exclude /proc /
そうしたら /mnt ディレクトリへ移動して、先ほど作成したアーカイブを展開してあげれば、これでデータの移動は完了です。
cd /mnt
tar xvzpf os-copy.tar.gz
データの移動が完了したら、アーカイブ時に除外していた /proc ディレクトリを作成します。
mkdir /mnt/proc
こうしておくことで、後は再起動時に自動的に OS 関連のファイルがこの中に出来上がります。逆にこれをしないと、そういったファイルの生成がなされないため注意が必要です。
その他にも除外したディレクトリがある場合には、必要に応じてそのあたりの整備をしておきましょう。
LILO を更新する
これで準備が整ったので、次のようにして、それぞれのパーティションに対して LILO を組み込みます。
lilo -C /etc/lilo.sda.conf
lilo -C /etc/lilo.sdf.conf
あとは再起動すれば、RAID デバイス (/dev/md0) から Linux が起動してくれるはずです。
起動しなかった場合には、どこかしらで設定や手順を間違えていたりするはずですので、起動ディスクやインストール CD-ROM などから Linux を起動して、/dev/md0 や /dev/sda1 などをマウントしたりして、間違いを修正しましょう。
ミラーリングを完成する
/dev/sdf1 だけが有効な /dev/md0 を構築して OS の正常起動を確認したら、いよいよ /dev/sda1 も /dev/md0 へ参加させ、ミラーリングを完成させます。
そのためにはまず /etc/raidtab を編集して、/dev/sda1 の "failed-disk" として設定していたところを "raid-disk" に直します。
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 32
persistent-superblock 1
devicd /dev/sda1
raid-disk 0
device /dev/sdf1
raid-disk 1
こうしたら "raidhotadd" という命令に "対象となる RAID デバイス" および "追加するデバイス" を引数として渡すことで、ミラーリングが有効となります。
raidhotadd /dev/md0 /dev/sda1
ただし、これで良いのかとおもったのですけど、その後でそのまま再起動してみると、Linux の起動が LILO の最初の時点で失敗してしまいました。何に起因するのかはわかりませんけど、どうやら LILO の情報が壊れてしまったような感じです。なので以下でもまた触れますけど、とりあえず RAID デバイスに追加したら、念のため次のようにして LILO を書き直しておくのが良さそうでした。
lilo -C /etc/lilo.sda.conf
lilo -C /etc/lilo.sdf.conf
RAID の状態を確認するには
RAID の状態を把握するためには "/proc/mdstat" の内容を参照するのが簡単のようです。
これを実行すると、例えば次のような感じの表示がなされます。
md0 : active raid1 sda1[2] sdf1[1]
8385792 blocks [2/1] [_U]
[>....................] recovery = 0.5% (50240/8385792) finish=66.2min speed=2093K/sec
unused devices: <none>
これをみると、"md0" という RAID デバイスは "raid1" で構成されていて、それを担うパーティションは "sda1" と "sdf1" であることが判ります。また、未使用のデバイスは "なし" です。
そして、ちょうど "sda1" を追加した直後だったので、現在 0.5% の複製が進んでいるというのもわかります。ミラーリングは片方さえ準備が整っていればシステムは稼動を続けることが出来ますので、複製中も問題なく Linux を利用することが出来ますから、複製中なんだなって思っておく程度で基本的には大丈夫です。
ただ、通常には起動ディスクとなり得る /dev/sda1 の方を新たに再構したからなのかどうなのか、この状態で Linux を再起動を再起動してみたところ、LILO がいきなりハングアップしてしまいました。とりあえず Slackware 10.2 のインストール CD で起動してみたところ RAID の再構築が自動的に始まり、そして複製は完了しましたが、やはり LILO は起動してはくれませんでした。
そんなことから、とりあえず新たに RAID デバイスへパーティションを追加した場合には、それが起動ディスクである場合には念のため LILO の情報を書き直しておくのが良さそうです。
ちなみに RAID デバイスの複製が終わると、次のような感じの表記となりました。
md0 : active raid1 sdf1[1] sda1[0]
8385792 blocks [2/2] [UU]
unused devices: <none>
この中の [UU] というのが、正常な状態を示すとのことでした。
そのほかの細かい情報はわかりませんでしたけど、とりあえず [2/2] というのが、何台のパーティションが組み込まれていてそのうちのいくつが利用されているかというのを示していそうな感じがしますし、[_U] だった場合は、active raid1 のうちのどちらのパーティションに情報が複製されているかというのを示しているのかな…という感じです。
再構築中は sda1 の番号がなんだか不安なところでしたけど、終わってみるとちゃんと raidtab に示したとおりの [0] になってくれたようです。
起動不能を回復するには…
今回は最後の最後で起動不能に陥ってしまったので、そんなついでにその時の直したやり方を紹介しておこうと思います。
とりあえず今回は LILO が失敗することによるのが問題ですので、もう一度、起動ディスクに対して LILO の情報を書き込んであげる感じで復旧を試みます。そのためにまずは Slackware 10.2 のインストール CD-ROM で Linux システムを立ち上げます。
そうしたら、次のようにして /mnt ディレクトリへ /dev/md0 をマウントします。
mount /dev/md0 /mnt
そうしたら "/mnt/etc/lilo.sda.conf" と "/mnt/etc/lilo.sdf.conf" を用いて LILO の情報を更新することになるのですけど、このとき、このファイル内に記載されているカーネルイメージファイルが存在していないとエラーとなってしまうので、本来だったらあるべき場所に、/mnt 内のカーネルイメージのシンボリックリンクを作成します。
たとえば本来は "/boot/vmlinuz" がそれならば、次のような感じです。
mkdir /boot
ln -s /mnt/boot/vmlinuz /boot/vmlinuz
これで準備が整いましたので、次のようにして LILO をハードディスクへ組み込みます。
lilo -C /etc/lilo.sda.conf
lilo -C /etc/lilo.sdf.conf
これで LILO が正常な状態に戻りましたので、その辺りでの間違いがなければ、これで起動可能となるはずです。