【问题标题】:Emulating Android JB on QEMU在 QEMU 上模拟 Android JB
【发布时间】:2013-08-28 20:35:30
【问题描述】:

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

【问题讨论】:

    标签: android-source qemu


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      安卓

      为 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 2015-05-06
        • 2021-10-20
        • 2013-09-01
        • 2021-07-07
        相关资源
        最近更新 更多