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 的来宾内核
- 使用更新版本的来宾内核,它修复了地址截断错误
(从第一个开始检查我的诊断是否正确。)
当我有 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 的来宾内核
- 使用更新版本的来宾内核,它修复了地址截断错误
(从第一个开始检查我的诊断是否正确。)