1

我一直在尝试在 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)

如果我没有指定-initrdqemu 的选项,就会发生这种情况。

当我指定 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 构建的内容android_out/root/*和输出android_out/system 在哪里 (android_out = out/platform/target/project/armboard_v7a)android_out

4

2 回答 2

1

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

于 2013-11-26T22:11:28.633 回答
1

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

安卓

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

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

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

例如,我要创建一个 2GB 的 SD 映像,其中包含 android.
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

于 2015-07-29T17:59:28.160 回答