Yocto构建的raspberrypi3-64镜像无法在QEMU中启动求助
问题描述
用Yocto(scarthgap版本)构建raspberrypi3-64镜像后,通过QEMU启动时无输出且持续挂起,但替换为树莓派官方raspios_arm64镜像中的kernel8.img就能正常启动。两者内核文件类型存在差异:
- Yocto生成的是未压缩内核:
Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages - 官方镜像的
kernel8.img是gzip压缩格式:kernel8.img: gzip compressed data, was "Image", last modified: Mon Apr 3 16:24:22 2023, from Unix, original size modulo 2^32 22407680
使用的QEMU命令如下:
qemu-system-aarch64 \ -machine raspi3b \ -cpu cortex-a53 \ -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootdelay=1" \ -dtb bcm2710-rpi-3-b-plus.dtb \ -drive id=disk0,file=core-image-minimal-raspberrypi3-64.rootfs.rpi-sdimg,if=sd,format=raw \ -kernel kernel_file* \ -m 1G -smp 4 \ -nographic
注:kernel_file*指代Yocto生成的Image或官方的kernel8.img
问题排查与修复方案
1. 未压缩内核的QEMU兼容性问题
QEMU的raspi3b机器模型对未压缩的ARM64内核支持有限,而官方内核是gzip压缩后的格式,能被QEMU正确识别加载。
修复步骤:
将Yocto生成的Image压缩为gzip格式并重命名为kernel8.img:
gzip -c path/to/yocto/Image > kernel8.img
然后修改QEMU命令的-kernel参数为kernel8.img。
2. DTB文件不匹配
当前使用的官方bcm2710-rpi-3-b-plus.dtb可能与Yocto内核不兼容,需使用Yocto构建输出的对应DTB文件。
修复步骤:
找到Yocto构建目录中生成的DTB文件,路径通常为tmp/deploy/images/raspberrypi3-64/bcm2710-rpi-3-b.dtb(对应raspi3b机器),替换QEMU命令中的DTB路径。
3. 启动参数不匹配
Yocto内核可能需要适配的启动参数,可按以下方式调整:
- 确认根分区:用
fdisk -l core-image-minimal-raspberrypi3-64.rootfs.rpi-sdimg查看镜像分区结构,确保root=/dev/mmcblk0p2是正确的根分区。 - 替换
rootdelay=1为rootwait,让内核等待根设备就绪后再挂载。 - 尝试调整串口参数为
console=ttyS0,115200,部分场景下QEMU的raspi3模型对ttyS0支持更好。
调整后的启动参数示例:
-append "rw earlyprintk loglevel=8 console=ttyS0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootwait"
4. Yocto内核配置缺失QEMU兼容选项
Yocto构建的内核可能未开启QEMU模拟所需的配置项,需检查并调整:
在Yocto构建目录中运行bitbake -c menuconfig virtual/kernel,确保以下配置开启:
CONFIG_SERIAL_AMBA_PL011=y(支持PL011串口,对应ttyAMA0)CONFIG_MMC_BCM2835=y(支持树莓派SD卡控制器)CONFIG_VIRTIO_CONSOLE=y(虚拟串口支持)CONFIG_CMDLINE_BOOL=y和CONFIG_CMDLINE="..."(默认启动参数包含必要的console与根文件系统设置)
保存配置后重新构建内核:bitbake virtual/kernel,再重新生成镜像。
内容的提问来源于stack exchange,提问作者bielu000

