initramfs (3)

でびあんには mkinitramfs というナニがある模様 (パケジ的には initramfs-tools)。試しに作って色々いぢくり回してみる事に。

# mkinitramfs -o ./initrd.img
# mkdir tmp
# zcat initrd.img |(cd tmp; cpio -iuvmd)
# cd tmp
# ls
bin  conf  etc  init  lib  sbin  scripts
#

で init の中身を見るにあの難解なソレなのですが、もしかして最後らへんの

# Chain to real filesystem
maybe_break init
exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console
panic "Could not execute run-init."

のあたりを

exec /bin/sh

ってヤッてあげたら busybox のシェルが動くの?
や、もしかして以下?

exec /bin/busybox

試験してみます。

と、言いつつ

色々確認。

# which mkinitramfs
/usr/sbin/mkinitramfs
# file /usr/sbin/mkinitramfs
/usr/sbin/mkinitramfs: POSIX shell script text executable
#

中身確認。ケツのあたりにある以下のナニが出力している箇所か。

[ "${verbose}" = y ] && echo "Building cpio ${outfile} initramfs"
(cd "${DESTDIR}" && find . | cpio --quiet --dereference -o -H newc | gzip >"${outfile}") || exit 1

修正後、上記コマンドで再構築、な方向で。

とりあえず

/bin/sh からナニ。

# emacs -nw init
# rm -f init~
# cd ..
# cd tmp && find . |cpio --quiet --dereference -o -H newc | gzip > /tmp/initrd.binsh.img
# cd /tmp; cp initrd.binsh.img /boot/.
# reboot

ええとこれで grub からナニですな。一連の出力の後に以下となった。

BusyBox v1.10.2 (Debian 1:1.10.2-2) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/bin/sh: can't access tty; job control turned off
/ #

これって exec /bin/sh しなくって良いってコト?
仮想マシンを reset してもいっこも試験してみる。

とゆーコトで

  • exec /bin/busybox なソレと
  • 何もしないナニ

を用意してそれぞれ initrd な image を用意。/boot は色々な image が御座います。って image 置いときゃ grub が読みこめる、というのも lilo と比べりゃ楽ですな。
で、試してみた所、

  • exec /bin/busybox なソレも Kernel panic した
  • 何もしないナニは Kernel panic した

あら、何で busybox を exec するソレは kernel panic なのかなぁ。一応中身を改めてみたんですが、exec /bin/busybox してますな。再確認。

うーん

Currently define functions: なソレには busybox がありません。ちなみに sh は御座いますな。とりあえず exec /bin/sh で起動してコマンドプロンプトから busybox をナニしたら色々ツールが使える模様。
ただ proc の中身が空。mount してみるか。

/ # mount -t proc none /proc
/ # mount -t sysfs none /sys
/ # ifconfig
/ #

うーん。おかしいな。基本 init 実行しているハズだから /proc とか /sys とかは mount されているはずなんですが ...
しかも /proc を mount したら df も出た。

/ # df
Filesystem           1k-blocks      Used Available Use% Mounted on
ndev                     10240        28     10212   0% /root/dev
/dev/hda1              3889892   3331984    360312  90% /root
/ #

root partition が /root に mount されておる。あ、なるほど。proc とか sys が mount されてるのは /root 配下の proc とか sys なのか。
そーゆー意味では適切なオプションで run-init したら起動が再開なのか。試してみます。

/ # exec run-init /root /sbin/init </root/dev/cosole >/root/dev/console
(略

あらら。あっとゆー間にコンソールにログインプロンプトが出た。なんとなく消化不良ッス。init のケツは以下になってるのですが

exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console

この init にどんな引数が与えられてるのか、を調べるにはどうしたら良いのやら。