CentOS で試験 (3)

debian の initrd 使えば云々、が昨晩寝る前の結論。

色々試行錯誤中。

  • 途中で停止していると思っていた
    • quiet なパラメータ省略したら処理に時間がかかっているだけだった
    • がしかし、結局 root partition がナニでプロンプト表示
    • panic しない作りになっている模様 (これはこれでラッキー
    • ちなみに sid では exec なキックに失敗したら panic している
  • プロンプトから /dev の中を ls してみたら微妙
    • /dev/VolGroup00 が無い
    • lsmod なコマンドが無い
    • /proc/modules 見てみたら lvm なドライバ (dm_*) がナニ
  • scripts/local-top に lvm というスクリプトを発見
    • scripts/init-top にコピーしてココの diff 手動盛り込み
  • conf/modules に insmod したいドライバを列挙すれば良い模様
    • dm_mod, dm_snapshot, dm_zero, dm_mirror を記述
  • vgchange が bin に無い
    • コピーして initrd.img を作成
    • まだ root partition が mount されない
    • /dev/VolGroup00 はある
    • 無理矢理 mount したらできた
  • init で mountroot を呼び出してますが何が呼び出されているか不明
  • むりやり . /scripts/local を呼び出す
    • 中で scripts/local-top を呼んでいる
  • mv scripts/init-top/lvm scripts/local-top/lvm してみた

↑今ここ

つづき

上記を盛り込んでリトライ中ですが微妙な箇所で停止してます。debug 付けたら微妙なのかなぁ。カーネルパラメータから quiet を取り除くのみにしてリトライ。
がしかし

Begin: Waiting for root file system... ...

で止まる。状況としては同じっぽい。ここでやたらに時間がかかるんです。なんとかならんかなぁ。

プロンプトが出たので見てみたら /dev/VolGroup00 が無い。vgchange されてないのか。よく見たら lvm なスクリプトの中で modprobe しとるな。/etc/modules からエントリを消そうか。
ちなみに vgchange したら /dev/VolGroup00 が見えた。うーん。。。
とりあえず、/etc/modules からエントリを消してリトライしてみる事に。これで dm_* なモジュールが /proc/modules になかったらわしの理解が微妙という事になりますな。

なんだか気がついたら initrd なソレの size が 16MB くらいになってるし。
負けずに /boot にコピーして reboot 中。結構時間がかかってプロンプト出力。/proc/modules を見てみたら dm_* は無い。とほほなハマり方だなぁ。
えーと、ちょっと init の中身を修正する事に。

  • オプションの root が /dev/VolGroup* だったら BOOT に local セット
  • script/local は呼び出さない形

がしかし、_Waiting for root file system... ..._でだんまり。
待つの面倒なのでケツの二行は echo だけさせる方向にすべきか。そりゃええんですが dm_* が /proc/modules にありませんな。当たり前ですが /dev にもデバイスファイルは無い。ちなみにこんなカンジにしてます。

        root=*)
                ROOT=${x#root=}
                case $ROOT in
                LABEL=*)
                        ROOT="/dev/disk/by-label/${ROOT#LABEL=}"
                        ;;
                UUID=*)
                        ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
                        ;;
                /dev/nfs)
                        BOOT=nfs
                        ;;
                /dev/VolGroup*)
                        BOOT=local
                        ;;
                esac
                ;;

仕方が無いので boot=local とかしてみる?

駄目

な模様。とりあえずケツの二行のアタマを echo にしといて local の中の mountroot に呼び出しが判別可能な echo を仕込む位しか手立てが無い。
とりあえず盛り込んで再度 reboot。henrich さんが twitterqemu 云々との事。今からヤると絶対ハマるんで別途。
って以下な出力があるのを確認

Begin: Mounting root file system... ...
Begin: Running /scripts/local-top ...
Done.
Begin: Waiting for root file system... ...

なんでこれを探さなかったのか、と小一時間 (ry
どこでコケてるのかが判明。scripts/local な模様。ええと /dev/VolGroup00/LogVol00 が無いので panic してるのか。しかも panic するまでに結構な秒数 wait してますな。
あら? この時点で modprobe されて vgchange されてないと駄目なのか。
# ってそうなってるのが前提なはずですよね。

続々

えーと、scripts/local-top/lvm にも echo でナニを盛り込んでました。ちょっと確認必要ですね。run_scripts な手続きの定義が以下。

run_scripts()
{
        initdir=${1}
        get_prereqs
        reduce_prereqs
        call_scripts
}

もう駄目

正直 busybox 使って汎用性は無いけど動くソレを作った方が早い。RHL 独特の LVM なソレもなんとかできるはず。
しかしこのままではなんとなく悔し。途中で /bin/sh を kick してコマンドをタタくというのも手か。