でびあんの 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 が出てくる模様。がしかし微妙。