年末から年始に書けて(だけではないが… (*1))、主に RAID-1 設定を行うことを最終目的として initrd 関係を調べていた。
まだ、最善の解決策は見つけられていないのだけど、ある程度分かったことをまとめておく。
◆1 mkinitrd
gentoo に採用されているものをベースにコンパイルする方針んでした。
gentoo のパッチは、機能的な部分とは関係ないようなので、特に当てる必要は無いようだった。
ただそれだけでは、/sbin/mkinitrd が動作しなかった。
しかしこの問題はごく単純なところの問題でした。
/sbin/mkinitrd は、実はシェルスクリプトであり、何と awk (gawk) の場所が Plamo のものとは異なると言うことのが原因であり、しかも awk の呼び出し方が(フルパスだったり gawk だったり awk 立ったりと)バラバラで統一されていないと言う状態で、フルパスのものが引っかかっていたと言う単純な問題だったので AWK でシェル変数を定義して実際のパスを格納してから呼び出し方を統一することで動作した。
◆2 initrd の中身と Fedora core 6 / Debian GNU/Linux 4.0r1
それで出来た initrd 中身を
http://blog.miraclelinux.com/uraura/2006/06/initrd_b3c8.html
の様にしてバラしてみて中身を見てみたのだけど思った以上に単純で(たぶん、mkinitrd が正しく作れていないだろうから)操作しないだろうと判断して、ちょっと棚上げしていました。
# Debian GNU/Linux (serge) のものを見ていたので…そちらはもっと複雑だった。
ためしに Debian をいれてそちら initrd を確認してみましたが、やはり複雑だったが構造的に作成した mkinitrd から作ったものとはまったく異なることになる様だった。
結果として Debian のものを参考に作成したパッケージの mkinitrd の「デキ」を判断することは、困難と分かったので、Fedora のインストールして比較することを考えました。
なお、mkinitrd のバージョン的には、Fedora Core 4 が一番近いのだか、バージョン以前にカーネルとかのバランスが悪くなると思われるので、もう少し新しい方が望ましいと思えた。
結構前のものなので手元にあった一番新しい Ferdora Core 6 (*2,*3)を試しました。
Ferdora Core 6 のインストールは、基本パーティションのみになるようなので既にパーティションを設定済みだったので一時はあきらめかけたが、シリアルATAの追加したハードディスクは未使用の基本パーティションが空いていたのでそちらにインストールした。
---
その後、fdisk -lu でセクタ単位容量を確認して同じ容量で確保した拡張パーティションに fedora の物をまとめて移動しましたが…。
話はそれましたが Fedora の initrd は、作成したパッケージの mkinitrd で作ったものとあまり変わりないようで、パッケージとしては問題ないのかもと思えるようになりました。
initrd の中身を検証しながら見て行くには、以下の URL を参考にしてください。
http://blog.miraclelinux.com/uraura/2006/06/initrd_b3c8.html
以前の Linux/TOWNS の initrd は、Slackware のもので minix や Plamo/TOWNS では ext2 をループバックデバイスで使っていたので、形式は色々あるかと思います。
最近のものは、cpio と gzip を併用しているようで、以下のようにして initrd 作成して中身を確認できるかと思います。
# mkinitrd --with=raid1 --with=md-mod -f /boot/initrd-2.6.23.9-plamoSMP 2.6.23.9-plamoSMP
# mkdir initrd-2.6.23.9-plamoSMP.new
# gzip -cd /boot/initrd-2.6.23.9-plamoSMP | ( cd initrd-2.6.23.9-plamoSMP.new ; cpio -c -i )
1984 blocks
◆3 mkinitrd で作られた (Fedora系の) initrd が単純な訳
initrd の中の /bin などが単純なのは、どうやら nash に sh の機能の他に mount/umount などのシステムコマンドを組込みコマンドとして実装しているようで、そのため /bin, /sbin の代わりになるようです。
つまり、initrd を展開して得られるファイルの中で init の中身にあるシステムコマンドは、nash の組込みコマンドのようでした。
raid1 の設定する前と設定をした後に作成した initrd では、raid を構成するコマンドが追加されることが分かります。
以下は、raid 関係が組み込まれていないものと組み込まれている initrd の起動スクリプトと差です。
root@athlon:/home/digit# diff -u {initrd-2.6.23.9-plamoSMP.dir,initrd-2.6.23.9-plamoSMP.new}/init
--- initrd-2.6.23.9-plamoSMP.dir/init 2007-12-25 18:11:31.000000000 +0900
+++ initrd-2.6.23.9-plamoSMP.new/init 2008-01-06 23:34:26.000000000 +0900
@@ -5,6 +5,14 @@
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
+echo "Loading md-mod.ko module"
+insmod /lib/md-mod.ko
+echo "Loading raid1.ko module"
+insmod /lib/raid1.ko
+raidautorun /dev/md0
+raidautorun /dev/md1
+raidautorun /dev/md2
+raidautorun /dev/md3
echo Creating block devices
mkdevices /dev
echo Creating root device
RAID モジュールの組み込みと raidautorun が追加されています。
なお、この initrd を使用して起動するとモジュールの組み込みは行われるものの /dev/md0〜md3 までは使用できる状態ではありませんでした。
なお、ソフトウェアレイドの /dev/md* の状態を確認するには、/proc/mdstat で調べることが出来ます。
構成されていないとき。
$ cat /proc/mdstat
Personalities : [raid1]
unused devices: <none&bt;
ソフトウェアRAIDが、RAID1で片肺で構成されている不完全なとき。
$ cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda2[1]
15631168 blocks [2/1] [_U]
md2 : active raid1 sda3[1]
31254336 blocks [2/1] [_U]
md3 : active raid1 sda5[1]
3911680 blocks [2/1] [_U]
md0 : active raid1 sda1[1]
987840 blocks [2/1] [_U]
unused devices: <none&bt;
◆4 raid1 をモジュール化するときとカーネルに組み込むときの差
上記のように raid をモジュール化して構成する場合、(特に現在の Plamo の場合は、かなり面倒な)課題がついて来ることになるかと思いますが、raid1 の機能をカーネルに直接組み込むと実はあっさり使えるようになります。
このことは実は最初の時点で確認していたのですが、「モジュールにするとインストーラなどで(raid1 or raid5 などの)構成を調整しやすい」のでいいのではないかと思ってモジュール化して initrd 起動を試していました。でも、Debian では結構作りこんで対応しているようなので Fedora のものを調べ様としたことになります。
話は少し戻りまして先ほどの「initrd では、RAID(/dev/md*)が再構成されない」ことの調査です。
まず、nash で raidautorun の動作を確認します。(Red Hat と表示されていますが、Plamo Linux で確認しています。)
RAID1 が再構成されない raid1 をモジュール化されている 2.6.23.9 カーネルを使用した場合
# echo 'raidautorun /dev/md0' | nash
(running in test mode).
Red Hat nash version 4.2.0.3 starting
raidautorun: RAID_AUTORUN failed: 19
RAID1 が自動的に再構成された raid1 を直接組み込んだ 2.6.23.9 カーネルを使用した場合
# echo 'raidautorun /dev/md0' | nash
(running in test mode).
Red Hat nash version 4.2.0.3 starting
上記のようにモジュール化した場合のみエラーを返します。
理由ですが nash のソースには、ioctl(fd, RAID_AUTORUN, 0) を呼び出しているのみです。
と言うことは、ioctl() で RAID_AUTORUN を処理しているカーネル側のコードを見る必要があるので、探してみると以下のようになっています。
$ find /usr/src/linux-2.6.23.9 -type f -print | xargs grep -n 'RAID_AUTORUN'
《中略》
/usr/src/linux-2.6.23.9/drivers/md/md.c-4397- case PRINT_RAID_DEBUG:
/usr/src/linux-2.6.23.9/drivers/md/md.c-4398- err = 0;
/usr/src/linux-2.6.23.9/drivers/md/md.c-4399- md_print_devices();
/usr/src/linux-2.6.23.9/drivers/md/md.c-4400- goto done;
/usr/src/linux-2.6.23.9/drivers/md/md.c-4401-
/usr/src/linux-2.6.23.9/drivers/md/md.c-4402-#ifndef MODULE
/usr/src/linux-2.6.23.9/drivers/md/md.c:4403: case RAID_AUTORUN:
/usr/src/linux-2.6.23.9/drivers/md/md.c-4404- err = 0;
/usr/src/linux-2.6.23.9/drivers/md/md.c-4405- autostart_arrays(arg);
/usr/src/linux-2.6.23.9/drivers/md/md.c-4406- goto done;
/usr/src/linux-2.6.23.9/drivers/md/md.c-4407-#endif
/usr/src/linux-2.6.23.9/drivers/md/md.c-4408- default:;
/usr/src/linux-2.6.23.9/drivers/md/md.c-4409- }
どうやら、一般的にはモジュール化されたときは、RAID_AUTORUN の ioctl() は無効化されているようです。
# Debian GNU/Linux 環境でも同様です。
Fedora Core 6 の環境は、raid1 をモジュール化しても raidautorun が機能するようです。
[root@athlon digit]# /sbin/lsmod | grep raid
raid1 27073 4
[root@athlon digit]# echo 'raidautorun /dev/md0' | /mnt/sbin/nash
(running in test mode).
Red Hat nash version 4.2.0.3 starting
と言うことは、Fedora Core ではモジュール化しても RAID_AUTORUN の ioctl() が有効となるようになっていると思われます。
*1 実際のところ、2007年04月14日ぐらいからなのでかなり前から…。
*2 最新の Fedora 8 より比較しやすそうに思えたので…。
*3 実は、DVD のイメージをダウンロードして書き込みが可能なマシンと空き容量が無かった。
最近のコメント