でびあんの initrd (9)
scripts/local-top/mdrun をさくっと眺めてるんですが、mdadm というか raid 関連疎くてどうしたものやら、と。
# スルーするかどうか、というあたりが微妙。
ざっくり流れのみ以下に。
- /scripts/local-top/mdadm が存在したら exit
- hd[a-z][0-9]* な存在するデバイスファイルについて
- mdadm --examine した結果を level で grep して 'Raid Level : ?' な ? を取り出して raidlvl にセット
- examine な mdadm はデバイスファイルを指定する必要がある模様。
- 出力は "Raid Level : raid5" な形式みたい
- test "$raidlvl" が真なら modprobe -q ${raidlvl} して gotraild に y を代入
- test "" は偽。test "raid5" は真だった。
- mdadm --examine した結果を level で grep して 'Raid Level : ?' な ? を取り出して raidlvl にセット
- ${gotraid} が y なら exit
- /conf/mdrun.conf を source する
- デフォルトではこのファイルはありません
- mdadm コマンド発行
- /sbin/mdrun コマンド発行
通常は mdadm --examine でデバイスが見つかるんでしょうね。最後らへんはある意味微妙な措置であるように見えます。
software raid もなかなか面白そうな theme ではありますが (ry
コードも以下に。
#!/bin/sh PREREQ="udev_helper" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac if [ -e /scripts/local-top/mdadm ]; then exit 0 fi unset raidlvl gotraid=n # Detect raid level for x in /dev/hd[a-z][0-9]* /dev/sd[a-z][0-9]*; do if [ ! -e ${x} ]; then continue fi raidlvl=$(mdadm --examine ${x} 2>/dev/null | grep "Level" | sed -e 's/.*Raid Level : \(.*\)/\1/') if [ "$raidlvl" ]; then modprobe -q ${raidlvl} 2>/dev/null gotraid=y fi done [ "${gotraid}" = y ] || exit # source the presumed root md and it's info . ./conf/mdrun.conf # assemble root raid first due to initrd-tools compatibility mdadm -A ${rootraiddev} -R -u $uuid $devices # assemble all raid devices /sbin/mdrun /dev
lvm も
見ておきます。ざっくりな流れを以下に。
- /scripts/local-top/lvm2 があったら exit
- /sbin/vgchange が無かったら exit
- modprobe -q で必要なモジュールを load
- dm-mod
- dm-snapshot
- dm-mirror
- activate_vg の呼び出し
- $ROOT を引数に呼び出し
- $resume を引数に呼び出し
activate_vg は lvm にて定義されてます。これもざっくりベースで処理の流れを以下に。
- 引数指定が略された場合 return
- 引数文字列が
- fe[0-9]* なら vgchange -ay して exit
- /dev/root なら vgchange -ay して exit
- 引数文字列から /dev/mapper/ の後の文字列を取り出す
- 取り出した文字列と引数文字列が同じ (マッチしなかった) 場合は return
- 引数文字列に "-" (dash) がない場合 return
- コメントによれば logical volume から volume group を取り出して vgchange -ay する
最後のソレは微妙です。ちなみに RHL 系列なソレに持ってった時には引数文字列が /dev/VolGroup00/LogVol* なら、という分岐を追加しましたな。これもコードを以下に。
#!/bin/sh PREREQ="mdadm mdrun lvm2" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac activate_vg() { local vg="$1" # Make sure that we have a non-empty argument if [ -z "${vg}" ]; then return 1 fi # Take care of lilo boot arg, risky activating of all vg case $vg in fe[0-9]*) vgchange -ay exit 0 ;; # FIXME: check major /dev/root) vgchange -ay exit 0 ;; esac # Make sure that we have a d-m path vg=${vg#/dev/mapper/} if [ "$vg" = "$1" ]; then return 1 fi # Make sure that the device includes at least one dash if [ "$(echo -n "$vg" | tr -d -)" = "$vg" ]; then return 1 fi # Split volume group from logical volume. vg=$(echo ${vg} | sed -e 's#\(.*\)\([^-]\)-[^-].*#\1\2#') # Reduce padded --'s to -'s vg=$(echo ${vg} | sed -e 's#--#-#g') vgchange -ay ${vg} } if [ -e /scripts/local-top/lvm2 ]; then exit 0 fi if [ ! -e /sbin/vgchange ]; then exit 0 fi modprobe -q dm-mod modprobe -q dm-snapshot modprobe -q dm-mirror activate_vg "$ROOT" activate_vg "$resume" exit 0
この後
同じ調子で
- /scripts/local-premount 配下の確認
- /scripts/local-bottom 配下の確認
の後、どうなるんでしょ。init に戻って mountroot 呼び出し以降のソレを確認、という方向でしょうか。ほぼ終息なんですがいっちゃん最後の run-init がナニ。