でびあんの initrd (8)

mountroot ですが、scripts/local のナニを以下に。
詳細なソレは微妙なんで、まずざっくり版を以下に。

  • scripts/local-top 配下の処理
  • ${ROOT} なデバイスファイルが無い場合の wait とエラー処理
  • mount 主処理
    • FSTYPE 設定
    • scripts/local-premount 配下の処理
    • roflag 設定
    • ${FSTYPE} を modprobe
      • no error checking らしい
    • mount 処理
      • 同様に no error checking らしい
    • scripts/local-bottom 配下の処理

という形になっています。FSTYPE 設定において微妙な箇所あり。

	# Get the root filesystem type if not set
	if [ -z "${ROOTFSTYPE}" ]; then
		eval $(fstype < ${ROOT})
	else
		FSTYPE=${ROOTFSTYPE}
	fi
	if [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then
		FSTYPE=$(/lib/udev/vol_id -t ${ROOT})
		[ -z "$FSTYPE" ] && FSTYPE="unknown"
	fi

${ROOTFSTYPE} が未設定の場合どうなるのだろうか。と。

むむ

微妙なのは ${ROOTFSTYPE} 未設定の場合の以下のソレ。

		eval $(fstype < ${ROOT})

fstype は initramfs の中にある。ちなみに break=premount な環境では

/bin/sh: cannot open /dev/hda1: no such file

で、たしかにデバイスファイルはありません。break=mount あたりではどうか。

(initramfs) eval $(fstype < ${ROOT})
(initramfs)

げ。何がどうなのか意味不明。って FSTYPE を echo してみたら

(initramfs) echo $FSTYPE
ext3
(initramfs)

成程ですか。ポイント高し。ってか微妙なコマンドだなぁ (わら

scripts 配下のナニを確認。まず最初の scripts/local-top 配下から

$ grep PREREQ scripts/local-top/*
scripts/local-top/lvm:PREREQ="mdadm mdrun lvm2"
scripts/local-top/lvm:  echo "$PREREQ"
scripts/local-top/mdrun:PREREQ="udev_helper"
scripts/local-top/mdrun:        echo "$PREREQ"
scripts/local-top/udev_helper:PREREQ=""
scripts/local-top/udev_helper:  echo "$PREREQ"
$

ええと

  • lvm
    • mdadm, mdrun, lvm2 に依存
  • mdrun
    • udev_helper に依存
  • udev_helper
    • 依存ナシ

とゆーコトで

  • udev_helper
  • mdrun
  • lvm

の順で呼び出されるはず。

なかなか進まない

まず udev_helper から、とは言え主処理は以下

# If we're booting from IDE, it might not be a PCI controller,
# but might be an old fashioned ISA controller; in which case
# we need to load ide-generic.
if [ ! -e "${ROOT}" -o "${ROOT}" = "/dev/root" ]; then
	modprobe -q ide-generic
fi
  • ${ROOT} が存在しない
  • ${ROOT} の値が /dev/root

のどちらかだったら ide-generic が modprobe される。

mdrun

明日見ます。mdadm って何だ。それにしても眠い。