如何在Yocto中使用QEMU构建NanoPi NEO Air镜像及运行
用QEMU运行Yocto构建的NanoPi NEO Air镜像方案
好的,我来帮你搞定这个问题,要让Yocto构建的NanoPi NEO Air镜像在QEMU里跑起来,需要分几步调整配置、适配内核,最后再启动QEMU,具体如下:
1. 调整Yocto构建配置,启用QEMU支持
首先打开你Yocto构建目录下的build/conf/local.conf,添加以下配置项:
- 启用虚拟化和QEMU相关特性:
DISTRO_FEATURES += "virtualization qemu" - 让镜像包含QEMU工具(如果需要在镜像内部运行用户态QEMU的话):
CORE_IMAGE_EXTRA_INSTALL += "qemu qemu-system-arm" - 生成QEMU友好的磁盘镜像格式(qcow2比raw更适合虚拟机):
IMAGE_FSTYPES += "qcow2" - 可选:启用内核调试符号和串口输出,方便调试:
KERNEL_DEBUG = "1" SERIAL_CONSOLES = "115200;ttyAMA0"
2. 适配内核以支持QEMU虚拟硬件
NanoPi NEO Air的默认内核是针对真实全志H3硬件编译的,缺少QEMU虚拟设备的驱动,需要调整内核配置:
方法一:通过menuconfig手动配置
执行以下命令打开内核配置界面:
bitbake -c menuconfig linux-sunxi
在界面中找到并启用以下选项:
Device Drivers -> Block devices -> Virtio block driver supportDevice Drivers -> Network device support -> Virtio network driverDevice Drivers -> Character devices -> Virtio consoleDevice Drivers -> Virtio drivers -> Generic virtio busDevice Drivers -> Virtio drivers -> Virtio MMIO driver
保存配置后,执行以下命令保存默认配置,后续构建会自动沿用:
bitbake -c savedefconfig linux-sunxi
方法二:通过bbappend文件自动配置
如果不想每次手动配置,可以创建内核配方的追加文件:
- 在你的layer里创建
recipes-kernel/linux/linux-sunxi_%.bbappend文件,内容如下:FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI += "file://qemu-virtio.cfg" - 在同目录下创建
files/qemu-virtio.cfg文件,添加以下内核配置项:CONFIG_VIRTIO=y CONFIG_VIRTIO_BLK=y CONFIG_VIRTIO_NET=y CONFIG_VIRTIO_CONSOLE=y CONFIG_VIRTIO_MMIO=y
这样后续构建内核时会自动启用这些QEMU虚拟设备驱动。
3. 重新构建镜像
完成上述配置后,重新执行构建命令(这里以core-image-minimal为例,你可以换成自己用的镜像配方):
bitbake core-image-minimal
构建完成后,镜像文件会生成在tmp/deploy/images/nanopi-neo-air/目录下,你需要用到这几个文件:
core-image-minimal-nanopi-neo-air.rootfs.qcow2:磁盘镜像zImage:内核文件sun8i-h3-nanopi-neo-air.dtb:设备树文件
4. 在QEMU中启动镜像
使用以下命令启动QEMU(注意替换成你的实际路径和镜像名称):
qemu-system-arm \ -M vexpress-a9 \ -cpu cortex-a7 \ -m 512 \ -drive file=tmp/deploy/images/nanopi-neo-air/core-image-minimal-nanopi-neo-air.rootfs.qcow2,if=sd,format=qcow2 \ -kernel tmp/deploy/images/nanopi-neo-air/zImage \ -dtb tmp/deploy/images/nanopi-neo-air/sun8i-h3-nanopi-neo-air.dtb \ -append "root=/dev/mmcblk0p1 rw console=ttyAMA0,115200 rootwait" \ -serial stdio \ -net nic,model=virtio \ -net user,hostfwd=tcp::2222-:22
参数说明:
-M vexpress-a9:指定QEMU模拟的通用armv7机器(QEMU对全志H3直接模拟支持有限,vexpress-a9兼容性更好)-cpu cortex-a7:模拟NanoPi NEO Air的Cortex-A7核心-m 512:分配512MB内存(和真实设备一致)-drive:挂载生成的qcow2镜像作为虚拟SD卡-kernel/-dtb:指定Yocto构建的内核和设备树-append:内核启动参数,指定根分区、串口控制台-serial stdio:将串口输出重定向到终端,方便查看启动日志-net:配置虚拟网络,把主机的2222端口映射到镜像的22端口,方便后续用SSH连接
常见问题排查:
- 如果启动后无法挂载根文件系统,可以尝试把
root=/dev/mmcblk0p1换成root=/dev/vda1(如果使用virtio块设备),同时确保内核已启用virtio块驱动。 - 如果没有网络,检查内核是否启用了virtio网络驱动,或者调整
-net nic的model参数为rtl8139试试。
内容的提问来源于stack exchange,提问作者Mohammed Harris
相关产品推荐
相关产品推荐

