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用のバイナリがあれば簡単だけど、ちょっと探したくらいでは見当たらなかった。
コマンドが入ってないということは、開発時にはセルフでは行ってないようだ。