virtualization - Ubuntu升级后qemu无法启动OpenWRT
问题描述
当我拥有 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
现在,升级到 Ubuntu 19.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 中默认启用的新功能和来宾内核错误的组合,它被设备树信息宣传该新功能所混淆。
较新的 QEMU 版本的“virt”板提供了一些设备,包括 PCI 窗口的扩展,地址超过 4GB。这应该没问题,因为 32 位非 LPAE 内核应该将这些地址视为不可访问而忽略,并继续使用低于 4GB 标记的较小 PCI 窗口。不幸的是,旧版本的 Linux 32 位 Arm 内核中的一个错误意味着他们截断了设备树中的 64 位地址,并认为与其他设备发生冲突,并且根本拒绝启用 PCI。(在您的问题中未引用的引导日志部分中可能有一条关于此的消息。)
可能的修复:
- 添加
-machine highmem=off
到 QEMU 命令行,禁用额外功能 - 构建具有 LPAE 支持的来宾内核
- 使用更新版本的来宾内核,该内核修复了地址截断错误
(从第一个开始检查我的诊断是否正确。)
推荐阅读
- mysql - Laravel-如何插入到已经在 mysql 中创建外键的多对多相关表中?
- amazon-web-services - 将角色分配给 S3 存储桶需要哪些权限?
- java - 递归算法建立对元素的级别或找到主元素
- python - 访问共享内存然后从文件加载需要更长的时间?
- android - 如何在工具栏中将箭头颜色设为白色
- java - CDI 活动
通过生产者方法在类中注入 - angular - 是否可以在不使用仅材料引导的情况下以 6 角打开模态?
- entity-framework - 如何将select转换为linq而不会出现转换错误?
- python - 熊猫数据框:如何将 1 和 0 的列合并到新列
- java - 了解 KMP 解决方案 - 蛮力