でびあんの initrd (7)

冷たい水を飲みすぎて腹痛い。水アタり、というか腹をヒヤしたのでしょうか。
等と言いつつ帰宅後にシマ酒水割りを呑んでるあたりが性懲りも無い。

それは良いとして

init をざっくり眺め直してて気になったのが以下。

maybe_break mount
log_begin_msg "Mounting root file system..."
. /scripts/${BOOT}
parse_numeric ${ROOT}
mountroot
log_end_msg

BOOT って初期設定されてない?
とりあえず break=top で止めて変数の値を確認。

(initramfs) echo $BOOT

(initramfs)

むむ。break=mount だと?

(initramfs) echo $BOOT

(initramfs)

同じ。これ、debug も付けた方が良さげ。break=bottom でリトライするも結果は同じ。おかしいのう、と言いつつ過去エントリを検索してみたら、conf/initramfs.conf にて BOOT に local を代入している事が判明。
# 過去記事から、ではないあたりが微妙
って環境変数じゃないから見えなくて当たり前なのか。微妙だなぁ。

話を元に戻す

流れ的には

  • /scripts/${BOOT} を source する
    • 基本 BOOT は nfs か local (デフォルトは local)
  • parse_numeric ${ROOT} する
    • これ、lilo コンパチとコメントあり
  • mountroot 呼び出し

という形。ちょっとざっくりそれぞれメモ。まず parse_numeric() 手続き。

# lilo compatibility
parse_numeric() {
	case $1 in
	"")
		return
		;;
	/*)
		return
		;;
	*:*)
		minor=${1#*:}
		major=${1%:*}
		;;
	*)
		value=$(( 0x${1} ))
		minor=$(( ${value} % 256 ))
		major=$(( ${value} / 256 ))
		;;
	esac

	mknod /dev/root b ${major} ${minor}
	chmod 600 /dev/root
	ROOT=/dev/root
}

これ、scripts/functions にて定義されてるんですが、例えば

  • root=9:0
  • root=0x900

みたいなソレに対応するためな模様。自分はこれ式の指定をしたコトはないのですが、昔のドキュメントにはこうしたデバイスの指定があった模様。通常の指定は parse_numeric() 手続きではスルー。

mountroot

あたりで PREREQS なナニが効いてくるのだと思いますが今日はもうクタバります。