まずsyslinuxを落としてきて
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.xz
xzcat syslinux-6.03.tar.xz | tar x
適当なワークディレクトリにbootディレクトリとisolinuxディレクトリを掘って
isolinux.binとldlinux.c32をisolinuxにコピーします。
mkdir iso9660
mkdir iso9660/boot
mkdir iso9660/isolinux
cp syslinux-6.03/bios/core/isolinux.bin iso9660/isolinux/
cp syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 iso9660/isolinux/
そのディレクトリにisolinux/isolinux.cfgを作成します。
default 1 label 1 kernel /boot/bzImage initrd /boot/initrd.gz append root=/dev/ram0 rdinit=/sbin/init
カーネルを落としてきてビルドします。
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.6.tar.xz
xzcat linux-4.9.6.tar.xz | tar x
cd linux-4.9.6/
make defconfig
make bzImage
cp arch/x86/boot/bzImage ../iso9660/boot/
cd ..
busyboxを落としてきて
wget https://busybox.net/downloads/busybox-1.26.2.tar.bz2
bzcat busybox-1.26.2.tar.bz2 | tar x
cd busybox-1.26.2/
menuconfigで
make menuconfig
スタティックにリンクするように
Busybox Settings --->
[*] Build BusyBox as a static binary (no shared libs)
を設定して
makeして_installをinitrdとか適当な名前でコピーします。
make install
cp -r _install/ ../initrd
cd ..
その中にprocディレクトリとsysディレクトリとetc/init.dディレクトリを作って
mkdir initrd/proc
mkdir initrd/sys
mkdir -p initrd/etc/init.d
etc/init.d/rcSを作って
#!/bin/sh mount -t proc none /proc mount -t sysfs none /sys /sbin/mdev -s
実行権限を付けて
chmod a+x initrd/etc/init.d/rcS
boot/initrd.gzにまとめます。
cd initrd/
find . | cpio --create --format=newc --owner=root:root | gzip > ../iso9660/boot/initrd.gz
cd ..
最後にiso9660のイメージを作成。
cd iso9660/
mkisofs -o ../busybox.iso -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table .
buildrootは色々やってくれてありがたいんですが、しくじったときに何が悪いのか分かりにくいです。
自分でisolinuxとカーネルとbusyboxを用意した方がトラブルシューティングは楽かと。
ただし上記のやり方はクロスコンパイルしてないので32bit環境なら32bit用、64bit環境なら64bit用が出来てしまいます。
ちなみに buildrootでブータブルCDを作成する で作ったCDイメージは約5.5Mbyteで、上記の方法だと約7.8Mbyteでした。
menuconfigで真面目に設定するならこっちの方が小さくできるはずですが。