1. 程式人生 > >使用QEMU模擬搭建ARM開發平臺

使用QEMU模擬搭建ARM開發平臺

在上一篇文章中,搭建的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。