在上一篇文章中,搭建的arm平台只有一个最小化的initramfs,只是可以验证可以启动,但没有实用性,busybox是嵌入式环境中的杀手级应用,将busybox集成进initramfs变得非常实用。

首先要安装qemu, arm toolchain,还要下载busybox源码。我下载的是busybox-1.18.5.tar.bz2

$tar xjf busybox-1.18.5.tar.bz2
$cd busy box-1.18.5
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

选择将busybox编译成静态文件, “Busybox Settings –> Build Options”

$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install

编译安装完成后,会在当前目录下生成_install目录,此为默认的安装目录,也可以在Busybox Settings中设置为别的目录。现在制作initramfs。

$cd _install
$find . | cpio -o -H newc | gzip $HOME/versatile-busybox

现在用qemu模拟。

$cd $HOME
$qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/bin/sh"

这里如果不加rdinit=/bin/sh,那么/linuxrc将会试图挂载根文件系统,并且运行新根文件系统中的init,由于我们没有另外的真正的根文件系统,所以使用rdinit=/bin/sh,启动到sh中,敲入回车,将会出现shell命令提示符。在当前root中,没有/proc,/sys存在,所以例如mount等这些以来/proc, /sys的命令不能正常工作。在虚拟机中执行

#mkdir /proc /sys
#mount -t proc proc /proc
#mount -t sysfs sysfs /sys

也可以将其加入到启动脚本中,关闭虚拟机,然后修改versatile-busybox

$cd busybox-1.18.5/_install
$mkdir -p etc/init.d
$cd etc/init.d
$cat > rcS <<EOF
#!/bin/sh
>mkdir /proc /sys
>mount -t proc proc /proc
>mount -t sysfs sysfs /sys
>mdev -s
EOF
$chmod +x rcS
$cd busybox-1.18.5/_install
$find . | cpio -o -H newc | gzip > $HOME/versatile-busybox

现在用qemu模拟

$ qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/sbin/init"

注意这里的rdinit=/sbin/init,前面之所以是rdinit=/bin/sh,是因为/sbin/init会执行/etc/init.d/rcS,而前面并没有创建这个文件,所以会打印很多错误!特别是由于没有启动mdev。

详细请参考 http://balau82.wordpress.com/2010/03/27/busybox-for-arm-on-qemu/