Ubuntu 升级后 qemu 无法启动 OpenWRT

qemu can't start OpenWRT after Ubuntu upgrade

当我有 Ubuntu 18.04 时,我使用以下命令声明了 OpenWRT:

qemu-system-arm -machine virt -cpu cortex-a15 -nographic -netdev bridge,id=lan,br=br-lan,helper=/usr/lib/qemu/qemu-bridge-helper -device virtio-net-pci,id=devlan,netdev=lan,mac=52:54:00:32:52:3a -netdev bridge,id=wan,br=br-wan,helper=/usr/lib/qemu/qemu-bridge-helper -device virtio-net-pci,id=devwan,netdev=wan,mac=52:54:00:35:04:84 -kernel openwrt-armvirt-32-zImage -drive file=openwrt-armvirt-32-root.ext4,format=raw,if=virtio -append root=/dev/vda rootwait

现在升级到Ubuntu19.10后,无法用qemu启动OpenWRT。由于无法安装 /dev/vda 设备,引导过程停止:

[    0.358902] Concatenating MTD devices:
[    0.359031] (0): "0.flash"
[    0.359113] (1): "0.flash"
[    0.359193] into device "0.flash"
[    0.378013] rtc-pl031 9010000.pl031: rtc core: registered pl031 as rtc0
[    0.382185] NET: Registered protocol family 10
[    0.392266] Segment Routing with IPv6
[    0.392847] NET: Registered protocol family 17
[    0.394003] 8021q: 802.1Q VLAN Support v1.8
[    0.395030] 9pnet: Installing 9P2000 support
[    0.395488] Registering SWP/SWPB emulation handler
[    0.403133] rtc-pl031 9010000.pl031: setting system clock to 2020-01-02 08:17:06 UTC (1577953026)
[    0.415460] Waiting for root device /dev/vda...

怎么了?新版本的qemu有什么变化吗?谢谢。

我的第一个猜测是您 运行 结合了较新 QEMU 中默认启用的新功能和来宾内核错误,它被设备树信息广告所混淆新功能。

'virt' 板的较新 QEMU 版本提供了一些设备,包括 PCI window 的扩展,地址超过 4GB。这应该没问题,因为 32 位非 LPAE 内核应该忽略那些无法访问的地址,并继续使用 4GB 标记以下的较小 PCI window。不幸的是,旧版本 Linux 32 位 Arm 内核中的一个错误意味着他们截断了设备树中的 64 位地址,并认为与其他设备发生冲突,因此根本拒绝启用 PCI。 (在你的问题中你没有引用的引导日志部分中可能有关于此的消息。)

可能的修复:

  • 添加 -machine highmem=off 到 QEMU 命令行,禁用额外功能
  • 构建支持 LPAE 的来宾内核
  • 使用更新版本的来宾内核,它修复了地址截断错误

(从第一个开始检查我的诊断是否正确。)