在QEMU上模拟Android JB

时间:2013-08-28 20:35:30

标签: android-source qemu

我一直在尝试在QEMU上构建和运行Android JellyBean 我有一个为我的目标机器类型(ARM Versatile Express - Cortex A15)构建的内核

我一直在尝试使用我的Android版本的输出构建QEMU图像,但我总是遇到错误,例如
qemu-system-arm -serial stdio -M vexpress-a15 -m 128m -kernel zImage -append "root=/dev/sda1 earlyprintk" android_jb.img

<3>VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "/" or unknown-block(2,0)
Please append a correct "root=" boot option; here are the available partitions:
<0>Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

如果我没有为qemu指定-initrd选项,则会发生这种情况。

当我指定initrd选项时 qemu-system-arm -serial stdio -M vexpress-a15 -m 128m -kernel zImage -append "root=/dev/sda1 earlyprintk" -initrd ramdisk.img android_jb.img(由Android构建过程生成),我收到以下错误

<3>init: cannot find '/system/bin/servicemanager', disabling 'servicemanager'
<3>init: cannot find '/system/bin/vold', disabling 'vold'
<3>init: cannot find '/system/bin/sh', disabling 'setconsole'
<3>init: cannot find '/system/bin/netd', disabling 'netd'
<3>init: cannot find '/system/bin/debuggerd', disabling 'debuggerd'
<3>init: cannot find '/system/bin/rild', disabling 'ril-daemon'
<3>init: cannot find '/system/bin/surfaceflinger', disabling 'surfaceflinger'
<3>init: cannot find '/system/bin/app_process', disabling 'zygote'
<3>init: cannot find '/system/bin/drmserver', disabling 'drm'
<3>init: cannot find '/system/bin/mediaserver', disabling 'media'
<3>init: cannot find '/system/bin/installd', disabling 'installd'
<3>init: cannot find '/system/bin/keystore', disabling 'keystore'
<3>init: cannot find '/system/bin/sh', disabling 'console'

我的android_jb.img包含android_out/root/*android_out/system的内容 其中android_out是我的Android版本的输出 (android_out = out / platform / target / project / armboard_v7a)

2 个答案:

答案 0 :(得分:1)

如果您使用的是-initrd,那么它只会加载只包含少量二进制文件的ramdisk。 系统和其他分区安装在 init.rc 中,似乎你的日志中没有发生挂载。

答案 1 :(得分:1)

几周前我想出了如何做到这一点。

的Android

为VExpress构建Android有点复杂。值得庆幸的是,这些步骤清楚地描述了here

按照这些说明,make PRODUCT-armboard_v7a-eng完成后,请转到输出目录。

我们现在需要创建一个我们将作为SD卡安装在VExpress板上的图像。

例如,我将创建一个包含android的2GB SD图像 dd if=/dev/zero of=android.img bs=512 count=$((2 * 1024 * 1024 * 1024 / 512))

我们现在需要在此图像上创建文件系统和分区表。

sudo /sbin/losetup /dev/loop0 android.img
# cylinders = size / (16 * 63 * 512)
sudo /sbin/sfdisk --no-reread -D -C 4161 -H 16 -S 63 /dev/loop0 << EOF
0,
;
EOF
sudo /sbin/losetup -d /dev/loop0

# Create the partition
sudo /sbin/losetup -o $((63*512)) /dev/loop0 android.img
sudo /sbin/mkfs.ext2 /dev/loop0
sudo /sbin/losetup -d /dev/loop0

现在我们准备好了图片,我们将android文件复制到它上面。

sudo mount -o loop,offset=$((63*512)) android.img /mnt
sudo cp -R <android_out>/target/product/armboard_v7a/root/* /mnt/
sudo cp -R <android_out>/target/product/armboard_v7a/system/* /mnt/system
sudo umount /mnt

内核

这里没什么特别的。 使用vexpress_defconfig

QEMU

我们现在可以使用所有部分运行qemu

qemu-system-arm -kernel zImage -machine vexpress-a9 -cpu cortex-a9 -serial stdio -m 1024 -append 'noinitrd root=/dev/mmcblk0p1 rw mem=1024M console=ttyAMA0,38400n8 rootwait earlyprintk loglevel=8 init=/init' -sd android.img

参考文献:

https://wiki.linaro.org/PeterMaydell/QemuVersatileExpress
http://linux-arm.org/LinuxKernel/LinuxAndroidPlatform
http://www.m5sim.org/BBench-gem5