でびあんの initrd (2)

ええと、機械的に控えを残す。
とりあえず update_progress() から再開。

update_progress()
{
	[ -d /dev/.initramfs ] || return

	if [ -z "$PROGRESS_STATE" ]; then
		export PROGRESS_STATE=0
	fi

	PROGRESS_STATE=$(($PROGRESS_STATE + 1))
	echo "PROGRESS_STATE=${PROGRESS_STATE}" > /dev/.initramfs/progress_state

	if [ -x /sbin/usplash_write ]; then
		/sbin/usplash_write "PROGRESS $PROGRESS_STATE"
	fi
}
  • /dev/.initramfs がディレクトリなら return
  • $PROGRESS_STATE が NULL (って言い方微妙) なら PROGRESS_STATE に 0 を代入して export
  • PROGRESS_STATE の値を増分して echo したソレを /dev/.initramfs/progress_state にリダイレクト
  • /sbin/usplash_write が実行可能なら $PROGRESS_STATE を出力

結局、usplash_write がよく分かってないので理解微妙。PROGRESS_STATE も init とかを grep してみた方が良さげに思えます。
次は panic() ですが、これは基本 /bin/sh に制御を渡す手続き。

panic()
{
	if [ -x /sbin/usplash_write ]; then
		/sbin/usplash_write "QUIT"
	fi
	# Disallow console access
	if [ "${panic}" = 0 ]; then
		reboot
	fi
	modprobe -q i8042
	modprobe -q atkbd
	echo $@
	PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
}
  • /sbin/usplash_write が実行可能なら "QUIT" を出力
  • $panic が 0 なら reboot する
    • 起動オプションにおいて panic=0 ってしとくと reboot するんだろうか
  • i8042 と atkbd を modprobe して引数を echo して PS1 をセットして
  • /bin/sh をナニ

次は maybe_break() 手続き。これは maybe_break() に渡された最初の引数の値と $break が同値だった場合、panic する。

maybe_break()
{
	if [ x$1 = x${break} ]; then
		panic "Spawning shell within the initramfs"
	fi
}

次。render() 手続き。定義は以下。

render()
{
	eval "echo -n \${$@}"
}

eval って微妙にニガ手。shell な環境で試してみたのは以下。

$ render()
> {
> eval "echo -n \${$@}"
> }
$ X="1 1 3"
$ render X
1 1 3$

何故に -n なのか。ってかなんか微妙。そろそろ限界ッスか??
# 直後の手続きで render が出てくる模様。がしかし微妙。