initrdを展開してみる

これまでの作業でtelnetdを起動させ、dpkg/aptコマンドが使えるようになったが、他人の作ったシステムというのは何があるかわからないので、迂闊にさわることができない。
自前のシステムを作るためには、とりあえずinitrdを乗っ取って、debootstrapで作成した環境から起動できるようにしなくてはならない。
まずは、initrdの実体を調べてみる。
通常、u-bootで使われるinitrdは、mkimageコマンドで属性情報を付加したアーカイブになっている。
アーカイブは作成時に指定されれば圧縮されている。

# file /boot/initrd
/boot/initrd: PPCBoot image

PPCBootは、現在のu-bootの前進となるブートローダーであるので、u-boot形式で間違いはないようだ。
mkimageコマンドがあれば、属性情報を"-l"オプションで表示することができるが、作業はセルフで行っているのでmkimageコマンドは含まれていないため使えない。


属性情報は、先頭64バイトになるので、それを削除してやればアーカイブを取り出すことができる。
u-bootの開発元が公開しているFAQにある手順が使えそうだ。
http://www.denx.de/wiki/view/DULG/HowToAddFiles

# mount -o remount,rw /
# cp /boot/initrd /home/
# cd /home/
# dd if=initrd bs=64 skip=1 of=initrd_uboot.gz
44552+1 records in
44552+1 records out
2851351 bytes transferred in 2.618202 seconds (1089049 bytes/sec)
# ls -al initrd_uboot.gz
-rw-r--r--  1 root ftp 2851351 Apr 10 18:05 initrd_uboot.gz
# file initrd_uboot.gz
initrd_uboot.gz: gzip compressed data, was "initrd", from Unix, max compression

どうやらうまくいったようだ。

# gzip -d initrd_uboot.gz
# ls -al initrd_uboot
-rw-r--r--  1 root ftp 16777216 Apr 10 18:05 initrd_uboot
# file initrd_uboot
initrd_uboot: Linux rev 1.0 ext2 filesystem data

通常のext2イメージファイルが取得できた。


マウントして中をのぞいてみる。

# mkdir /media
# mount -o loop ./initrd_uboot /media/
# cd /media/
# ls
bin  dev  etc  home  lib  linuxrc  lost+found  mnt  proc  sbin  sys  tmp  usr  var
# find ./
./
./lost+found
./bin
./bin/busybox
./bin/ash
./bin/cat
./bin/chgrp
./bin/chmod
./bin/chown
./bin/cp
./bin/date
./bin/dd
./bin/df
./bin/dmesg
./bin/echo
./bin/egrep
./bin/false
./bin/fgrep
./bin/getopt
./bin/grep
./bin/gunzip
./bin/gzip
./bin/hostname
./bin/ip
./bin/ipaddr
./bin/ipcalc
./bin/iplink
./bin/iproute
./bin/kill
./bin/ln
./bin/login
./bin/ls
./bin/mkdir
./bin/mknod
./bin/mktemp
./bin/more
./bin/mount
./bin/mv
./bin/netstat
./bin/pidof
./bin/ping
./bin/ps
./bin/pwd
./bin/rm
./bin/rmdir
./bin/sed
./bin/sh
./bin/sleep
./bin/stty
./bin/su
./bin/sync
./bin/tar
./bin/touch
./bin/true
./bin/umount
./bin/uname
./bin/usleep
./bin/vi
./bin/zcat

./dev
(多いので略。無駄なものもたくさんあって気持ちはよくないな。)
./dev/btndrv
./dev/btndrv_hdlgl
./dev/r8read
./dev/r8write

./etc
./etc/rc.d
./etc/rc.d/httpd.sh
./etc/rc.d/disklabel.sh
./etc/rc.d/usbdetect.sh
./etc/rc.d/r8buzled.sh
./etc/rc.d/resetdetect.sh
./etc/rc.d/verifydetect.sh
./etc/rc.d/archdetect.sh
./etc/rc.d/initprobe.sh
./etc/rc.d/mddetect.sh
./etc/fstab
./etc/securetty
./etc/mtab
./etc/passwd
./etc/group
./etc/magic_gt.bin
./etc/httpd.conf
./etc/localtime
./etc/version

./home
./home/httpd
./home/httpd/cgi-bin
./home/httpd/cgi-bin/select.cgi
./home/httpd/cgi-bin/query.cgi
./home/httpd/index.html
./home/httpd/contents.css

./lib
./lib/ld-linux.so.2
./lib/ld-2.3.2.so
./lib/librt-2.3.2.so
./lib/libgcc_s.so.1
./lib/libc.so.6
./lib/libc-2.3.2.so
./lib/libblkid.so.1
./lib/libblkid.so.1.0
./lib/libcom_err.so.2
./lib/libcom_err.so.2.1
./lib/libcrypt-2.3.2.so
./lib/libcrypt.so.1
./lib/libe2p.so.2
./lib/libe2p.so.2.3
./lib/libext2fs.so.2
./lib/libext2fs.so.2.4
./lib/libm-2.3.2.so
./lib/libm.so.6
./lib/libpthread-0.10.so
./lib/libpthread.so.0
./lib/librt.so.1
./lib/libuuid.so.1
./lib/libuuid.so.1.2
./lib/modules
./lib/modules/2.6.12.6-arm1
./lib/modules/2.6.12.6-arm1/kernel
./lib/modules/2.6.12.6-arm1/kernel/drivers
./lib/modules/2.6.12.6-arm1/kernel/drivers/cdrom
./lib/modules/2.6.12.6-arm1/kernel/drivers/cdrom/cdrom.ko
./lib/modules/2.6.12.6-arm1/kernel/drivers/scsi
./lib/modules/2.6.12.6-arm1/kernel/drivers/scsi/sr_mod.ko
./lib/modules/2.6.12.6-arm1/kernel/drivers/block
./lib/modules/2.6.12.6-arm1/kernel/drivers/block/as-iosched.ko
./lib/modules/2.6.12.6-arm1/kernel/drivers/block/cfq-iosched.ko
./lib/modules/2.6.12.6-arm1/kernel/drivers/block/deadline-iosched.ko
./lib/modules/2.6.12.6-arm1/kernel/drivers/block/loop.ko
./lib/modules/2.6.12.6-arm1/kernel/fs
./lib/modules/2.6.12.6-arm1/kernel/fs/isofs
./lib/modules/2.6.12.6-arm1/kernel/fs/isofs/isofs.ko
./lib/modules/2.6.12.6-arm1/kernel/fs/minix
./lib/modules/2.6.12.6-arm1/kernel/fs/minix/minix.ko
./lib/modules/2.6.12.6-arm1/kernel/fs/nls
./lib/modules/2.6.12.6-arm1/kernel/fs/nls/nls_iso8859-1.ko
./lib/modules/2.6.12.6-arm1/kernel/fs/fat
./lib/modules/2.6.12.6-arm1/kernel/fs/fat/fat.ko
./lib/modules/2.6.12.6-arm1/kernel/fs/vfat
./lib/modules/2.6.12.6-arm1/kernel/fs/vfat/vfat.ko
./lib/gidlib.so
./linuxrc
./mnt
./mnt/hda1
./mnt/hda2
./mnt/hda5
./mnt/hda6
./mnt/usb1
./mnt/usb2
./mnt/usb3
./mnt/usb4
./mnt/md1
./mnt/md2
./mnt/md5
./mnt/md6
./proc
./sbin
./sbin/fdisk
./sbin/freeramdisk
./sbin/fsck.minix
./sbin/getty
./sbin/hdparm
./sbin/ifconfig
./sbin/ifdown
./sbin/ifup
./sbin/init
./sbin/insmod
./sbin/klogd
./sbin/logread
./sbin/lsmod
./sbin/mkswap
./sbin/modprobe
./sbin/pivot_root
./sbin/poweroff
./sbin/reboot
./sbin/rmmod
./sbin/route
./sbin/start-stop-daemon
./sbin/sulogin
./sbin/swapoff
./sbin/swapon
./sbin/sysctl
./sbin/syslogd
./sbin/udhcpc
./sbin/tune2fs
./sbin/findfs
./sbin/fsck
./sbin/fsck.ext3
./sbin/badblocks
./sbin/mkfs.ext3
./sbin/sfdisk
./sbin/halt
./sbin/hwclock
./sbin/fsck.ext2
./sbin/e2fsck
./sbin/mkfs.ext2
./sbin/mke2fs
./sbin/mdadm
./sbin/mkfs.xfs
./sys
./tmp
./usr
./usr/sbin
./usr/sbin/chroot
./usr/sbin/httpd
./usr/sbin/telnetd
./usr/sbin/udhcpd
./usr/sbin/ethtool
./usr/sbin/smartctl
./usr/bin
./usr/bin/[
./usr/bin/awk
./usr/bin/basename
./usr/bin/bunzip2
./usr/bin/bzcat
./usr/bin/cal
./usr/bin/clear
./usr/bin/cmp
./usr/bin/cut
./usr/bin/dirname
./usr/bin/du
./usr/bin/dumpleases
./usr/bin/env
./usr/bin/expr
./usr/bin/find
./usr/bin/free
./usr/bin/head
./usr/bin/hexdump
./usr/bin/id
./usr/bin/install
./usr/bin/killall
./usr/bin/logger
./usr/bin/md5sum
./usr/bin/mkfifo
./usr/bin/nslookup
./usr/bin/od
./usr/bin/passwd
./usr/bin/patch
./usr/bin/printf
./usr/bin/readlink
./usr/bin/renice
./usr/bin/reset
./usr/bin/sort
./usr/bin/tail
./usr/bin/tee
./usr/bin/telnet
./usr/bin/test
./usr/bin/top
./usr/bin/tr
./usr/bin/tty
./usr/bin/uniq
./usr/bin/unzip
./usr/bin/uptime
./usr/bin/wc
./usr/bin/wget
./usr/bin/which
./usr/bin/whoami
./usr/bin/xargs
./usr/bin/yes
./usr/bin/diff
./usr/local
./usr/local/sbin
./usr/local/sbin/R8contd
./usr/local/sbin/alarm_off
./usr/local/sbin/alarm_on
./usr/local/bin
./usr/local/bin/R8event
./usr/local/bin/R8event-initrd.sh
./usr/local/bin/R8fwrite
./usr/local/bin/fw_printenv
./usr/local/bin/fw_setenv
./usr/local/bin/spot_repair
./var
./var/run
./var/lock

busyboxを主体とした小さなシステムに仕上がっている。
次はlinuxrcをシンプルにしてしまって、ハードディスクからdebianのrootfsを起動するだけにしてみよう。
セルフで続けるには、u-bootからmkimageをコンパイルする必要がある。どっかにARM用のバイナリがあれば簡単だけど、ちょっと探したくらいでは見当たらなかった。
コマンドが入ってないということは、開発時にはセルフでは行ってないようだ。