如何用QEMU模拟树莓派3的Ubuntu Core?模拟失败求助
成功用QEMU模拟树莓派3 Ubuntu Core的可行方案
我之前成功搞定过QEMU模拟树莓派3的Ubuntu Core,踩过不少和你一样的坑,给你分享下可行的步骤:
一、别再混用Raspbian内核了——Ubuntu Core需要专属启动文件
Ubuntu Core的启动逻辑和Raspbian不一样,而且树莓派3支持64位,我们要对应使用arm64版本的Ubuntu Core镜像,以及配套的Ubuntu官方树莓派启动文件,具体要准备这些:
- 树莓派3对应的Ubuntu Core arm64镜像(比如Ubuntu Core 20/22的arm64版本)
- 适配的64位内核文件:
kernel8.img(不是Raspbian的kernel.img,那是32位的) - 树莓派3的设备树文件:
bcm2710-rpi-3-b.dtb - 树莓派启动固件:
bootcode.bin、start.elf、fixup.dat(这些是引导内核必须的)
你可以从Ubuntu Core镜像的boot分区里提取kernel8.img和dtb文件;启动固件可以从Ubuntu官方的raspi-firmware包中获取,或者从一台已安装Ubuntu的树莓派上复制。
二、准备镜像和启动文件的操作步骤
- 挂载Ubuntu Core镜像,提取boot分区内容:
# 先查看镜像的分区信息 fdisk -l ubuntu-core-20-arm64.img # 挂载boot分区(假设p1的起始扇区是8192,每个扇区512字节,计算偏移量:8192*512=4194304) mkdir -p ./boot-mount mount -o loop,offset=4194304 ubuntu-core-20-arm64.img ./boot-mount # 复制需要的文件 cp ./boot-mount/kernel8.img ./ cp ./boot-mount/bcm2710-rpi-3-b.dtb ./ umount ./boot-mount - 把启动固件(
bootcode.bin、start.elf、fixup.dat)放到和内核、镜像同目录下。
三、正确的QEMU启动命令
用这条命令启动,注意参数要对应arm64架构和raspi3机器:
qemu-system-aarch64 \ -M raspi3 \ -kernel kernel8.img \ -dtb bcm2710-rpi-3-b.dtb \ -sd ubuntu-core-20-arm64.img \ -append "console=ttyAMA0,115200 root=/dev/mmcblk0p2 rw rootwait" \ -serial stdio \ -usb \ -device usb-mouse \ -device usb-kbd
这里的关键参数说明:
-M raspi3:指定模拟树莓派3硬件-append里的root=/dev/mmcblk0p2:Ubuntu Core的根分区是镜像的第二个分区,必须指定正确-serial stdio:把串口输出定向到终端,方便看启动日志排查问题
四、你之前失败的可能原因
- 用了32位的
kernel.img:树莓派3的64位系统需要kernel8.img,混用32位内核会导致无法加载根文件系统 - 启动固件不全:缺少
bootcode.bin这些文件的话,QEMU没法引导内核启动 - 根分区指定错误:如果你的Ubuntu Core镜像分区结构不同,要先用
fdisk确认根分区的编号
内容的提问来源于stack exchange,提问作者Rustam Isaev
相关产品推荐
相关产品推荐

