资讯动态

QEMU虚拟化华为路由器固件:ARM系统启动与网络配置实战

发布时间:2026/10/3 14:16:10 来源:尧图企业网站定制
最近有个朋友问我能不能在电脑上直接跑一套华为路由器的固件用来做功能验证和实验。我第一反应是这事能干而且QEMU就是干这个的。现在手头正好有一套华为路由器固件前几天刚在QEMU里把它跑起来网络也全部打通了整个过程的坑和关键步骤都还热乎着。这篇文章就把完整流程写下来核心就三件事怎么把华为路由器固件转成QEMU能启动的虚拟磁盘怎么选QEMU的ARM模拟参数以及最折磨人的网络配置怎么一步步搞定。最终你会得到一个能在宿主机上启动、能当真实路由器用的虚拟化环境适合固件开发调试、组网实验、学习嵌入式Linux启动流程的读者参考。1. 为什么要在QEMU里跑路由器固件1.1 这能解决什么实际问题很多人听到虚拟化路由器固件第一反应是用不上但实际接触过固件开发或者网络设备调试的人都懂真实设备太金贵了刷错一次变砖返修来回一周。用QEMU把固件虚拟化之后我可以在宿主机上随意折腾改坏了就删掉镜像重来几分钟恢复原状完全不用心疼硬件。另一个典型场景是网工实验。你想验证一套 VLAN 划分、策略路由或者 DHCP 分配的配置与其在真机上改来改去不如先在虚拟化环境里跑一遍。QEMU 的灵活之处在于它可以把路由器的 WAN 口和 LAN 口分别接到不同的虚拟网段构造出完整的外网-路由器-内网环境。我之前做组网实验就是用 QEMU 同时跑三个路由器固件模拟两级路由和旁路防火墙这在实机上得凑三台设备成本和场地都不划算。还有一个容易忽略的价值是学习和分析。路由器固件本质上是一套嵌入式 Linux 系统通过 QEMU 启动它你能完整观察 Linux 内核的启动过程、服务初始化顺序、配置文件的加载机制。我建议嵌入式入门的读者找个固件做一次这样的实验比自己看一万行文档都有用。QEMU 的串口和控制台就像是给你装了个内窥镜能看清整个系统的运行脉络。1.2 方案选型为什么偏偏选 QEMU市面上的虚拟化方案不少VirtualBox、VMware、WSL2 都能跑 Linux但它们的重心都在 x86/AMD64 架构上对 ARM 架构的模拟支持非常弱。华为路由器这类网络设备绝大多数使用 ARM 架构的 SoC固件里的内核和根文件系统也都是专门为 ARM 编译的x86 虚拟机根本启动不了。QEMU 是少数能够在普通 PC 上模拟完整 ARM 环境的开源项目这是选它的首要原因。第二个原因是 QEMU 支持多种网络设备模型还能通过 TAP/TUN 接口和桥接技术把宿主机网络借给虚拟机用。这对路由器实验是刚需。你在一台 PC 上启动固件后它要同时扮演 DHCP 服务器、NAT 网关、路由表维护者的角色必须有多块虚拟网卡暴露给固件系统每个网卡对应真实的网络链路。QEMU 做这件事非常顺手不仅能定义多块网卡还能单独指定每块网卡的连接目标。第三个原因则是可控性。可以用命令行一条指令启动虚拟机不需要点鼠标点半天支持 QCOW2 镜像的增量写入和快照功能做实验之前拍个快照搞坏了回滚只要一条命令。相比桌面上那些自带图形界面的方案QEMU 虽然在配置上多花点心思但把逻辑理清之后效率非常高。2. 环境准备与固件获取2.1 宿主机准备与 QEMU 安装我这次实验用的是 Ubuntu 22.04 宿主机但思路不挑系统。在 Debian/Ubuntu 上直接执行sudo apt update sudo apt install qemu-system-arm qemu-utils不想用 apt 也可以去 QEMU 官网下载二进制包但没有特殊需求没必要。qemu-system-arm 是 ARM 32 位和 64 位通用的模拟器前端qemu-utils 提供 qemu-img 等磁盘工具。别忘了单独装binwalk用于后面的固件分析sudo apt install binwalkWindows 平台一样可行。如果用的是 WSL2先确认 Windows 侧 BIOS 里虚拟化已经打开然后在 WSL2 内部同样走 apt 路线安装。这里要提醒一点WSL2 的虚拟机嵌套性能不如裸机 Linux但做纯功能性实验没有问题。macOS 用户用brew install qemu也一样能装。安装完成后检查版本qemu-system-aarch64 --version我用的是 QEMU 8.x 版本整体稳定。如果你拿到的是太老的版本建议升级因为新版对 virtio 网络设备和 ARM 平台的支持更完善后面网络调参时少走弯路。2.2 固件获取与格式确认固件从哪来正规渠道是从官方支持页面下载整包升级固件。如果你手头有现成的路由器设备也可以使用官方工具备份固件但注意不同型号备份出来的格式差异很大有些带 512 字节头部有些直接是 raw 格式。我用的是官方发布的升级包文件后缀最常见的是.bin。拿到固件后别急着扔进 QEMU先做一次体检。在终端里运行file 你的固件.bin我手上这个固件输出的信息类似于data或者u-boot legacy uImage。uImage对人体贴得多说明它是一个标准的 U-Boot 镜像里面一般包含内核如果输出是data就需要用binwalk做一次结构扫描binwalk 你的固件.binbinwalk 会列出一堆偏移量重点看有没有gzip压缩段或者 squashfs 文件系统。路由器固件常见的结构是头部 U-Boot 内核 根文件系统squashfs/jffs2。我之前遇到一种情况binwalk 什么也没扫出来仔细一看是文件头被厂商加了一层自定义加密这种情况需要查找特定芯片的密钥工具来解包。还有一个关键信息是确认架构。固件解包后用file查看内核镜像文件binwalk -e 你的固件.bin file _你的固件.bin.extracted/内核文件名如果输出包含ARM aarch64说明是 64 位用qemu-system-aarch64如果是ARM且不带aarch64大概率是 32 位用qemu-system-arm。我用的是 64 位 ARM 固件所以下面的命令都基于qemu-system-aarch64。3. 将固件制作成 QEMU 可启动的虚拟磁盘3.1 解包并分析固件启动结构华为路由器固件解包后通常能看到一个类似下面这样的结构- boot.img 或 kernel.imgLinux 内核 - rootfs.imgsquashfs 根文件系统 - 其他配置分区镜像启动顺序一般是 U-Boot 加载内核内核挂载根文件系统。QEMU 可以模拟这个启动过程但前提是你要给它提供三个东西处理器型号、内核镜像、根文件系统镜像。为了拿到内核和根文件系统先解包mkdir firmware_extract cd firmware_extract binwalk -e ../你的固件.bin如果固件本身是完整的裸镜像binwalk 拆出来的可能是多个分区文件。常见的根分区格式是 squashfs直接用unsquashfs解出完整根目录树unsquashfs rootfs.img解出来的目录就是路由器的整个文件系统里面会有/etc、/bin、/usr、/etc/init.d等目录。这个步骤的意义不只是提取内核更重要的是你能提前查看路由器的启动脚本、网口名称和配置文件这对后面配虚拟化网络极其重要。比如我在根文件系统里看到了/etc/init.d/rcS里面包含了网口初始化和防火墙加载逻辑这直接决定了固件在 QEMU 里启动后网卡能不能正常工作。3.2 制作可启动的 QCOW2 镜像QEMU 对块设备更友好所以把根文件系统做成一个磁盘镜像再把它格式化成一个可启动的磁盘。我用qemu-img创建空镜像再用dd把根文件系统的内容放进去qemu-img create -f qcow2 rootfs.qcow2 512M这里 512M 一般够用如果固件的根文件系统超过这个大小就调大。注意 QCOW2 采用稀疏技术创建时 512M 并不会真的占 512M 磁盘只是逻辑大小。然后格式化分区mkfs.ext4 rootfs.qcow2但是直接 mkfs 到 qcow2 在部分系统会报错更稳妥的做法是用 raw 镜像做中间层qemu-img create -f raw rootfs.raw 512M mkfs.ext4 rootfs.raw mkdir /tmp/rootfs_mount sudo mount -o loop rootfs.raw /tmp/rootfs_mount这时候把前面解包出来的rootfs.img/里的所有文件复制到/tmp/rootfs_mount/下sudo cp -a firmware_extract/_你的固件.bin.extracted/squashfs-root/* /tmp/rootfs_mount/ sudo umount /tmp/rootfs_mount最后把 raw 转成 qcow2qemu-img convert -O qcow2 rootfs.raw rootfs.qcow2很多人在这儿踩坑直接拿 squashfs 的镜像作为虚拟磁盘启动指望内核能直接挂载。说实话 squashfs 本身是只读且可以做根文件系统的但 QEMU 启动时如果固件内核没有对应的 squashfs 模块或者没有写入保护配置很容易起不来。我这里推荐把它转成一个 ext4 的磁盘镜像兼容性最好。3.3 分析固件内核支持的硬件环境拿到 rootfs 不代表大功告成还需要确认内核用了什么串口、什么中断控制器、什么网卡驱动。这几点决定了 QEMU 的哪些虚拟设备和你的固件能配合工作。我解包后检查了内核模块目录find firmware_extract/ -name *.ko | head -20如果看到virtio.ko、virtio_net.ko这类模块说明固件内核支持 virtio 半虚拟化设备那 QEMU 这边就可以用virtio-net-pci虚拟网卡和virtio-blk-device虚拟磁盘性能好很多。但有些精简固件把 virtio 模块删了只保留了特定的网卡驱动这时候你需要用-device e1000或者-device smc91c111这类 QEMU 兼容的网卡型号。检查内核支持的平台还有一个方法看rootfs里/etc/modules或/etc/modprobe.d/下的配置。极限情况是内核完全没有任何模块所有驱动都编进了内核这种就得靠启动时串口日志来辨认设备有没有被发现。一般情况下只要固件是通用的 ARM 嵌入式 Linux 内核virtio-net 和 virtio-blk 大概率是能用的。我这次实验用的固件就很配合启动后网卡直接识别成eth0和eth1。4. QEMU 启动参数与平台选型4.1 用 QEMU 的 virt 平台模拟平台选择直接决定启动成败。QEMU 针对 ARM 提供了很多模拟平台比如virt、versatilepb、realview-pbx-a9、mcimx6ul-evk等。我用的是virt平台它是 QEMU 专门为 ARM 虚拟化设计的通用平台好处是对内存、中断、串口、PCIe 的模拟更加完善linux kernel 对virt平台的支持也最成熟。virt平台配合cortex-a15或者cortex-a53乃至cortex-a72的 CPU 都能跑。需要注意的是有些路由器固件是为特定 SoC 编译的它依赖一些板级硬件比如特定型号的 UART、看门狗这种固件在virt平台下可能启动到一半就卡住。这时候就要换用和真实设备 SoC 相近的开发板平台。华为部分老款路由器用的是海思芯片对应平台不一定存在只能靠 virt 加上 GPIO 回避或者看门狗禁用来碰运气。如果只是想快速跑起来一个能当路由用的系统virt 是首选如果是验证真实设备的驱动逻辑你需要严格遵守固件本身的硬件编码预期。4.2 编写启动脚本启动脚本是我整个流程里最核心的部分。先把完整命令放出来然后逐行解释。#!/bin/bash exec qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -smp 2 \ -m 512 \ -kernel kernel.img \ -drive filerootfs.qcow2,ifnone,formatqcow2,idhd0 \ -device virtio-blk-device,drivehd0 \ -nodefaults \ -nographic \ -serial mon:stdio \ -device virtio-net-device,netdevwan0 \ -netdev tap,idwan0,ifnametap0,scriptno,downscriptno \ -device virtio-net-device,netdevlan0 \ -netdev tap,idlan0,ifnametap1,scriptno,downscriptno \ -append root/dev/vda rw consolettyAMA0 mem512M几个关键参数说明-machine virt选择通用 ARM 虚拟平台。-cpu cortex-a72指定 CPU 型号实测比 cortex-a15 表现好但如果你内核编译时选的 CPU 是 cortex-a9也可以用 cortex-a9 来对齐。-kernel kernel.img指向解包出来的内核镜像。这个内核必须和你的固件匹配否则启动到一半就 panic。-drive ... -device virtio-blk-device把 rootfs.qcow2 挂成 virtio 磁盘。里面idhd0相当于给设备起名后面设备引用这个 ID。-nographic关闭图形窗口输出走终端。服务器没有图形界面也可以跑。-serial mon:stdio把串口重定向到当前终端同时把 QEMU monitor 也绑定到 stdio。这个很有用固件里的串口日志直接可见还能按Ctrl-a c切换进 QEMU monitor。两块virtio-net-device分别接tap0和tap1对应固件里看到的eth0和eth1。-append里的consolettyAMA0指定内核串口root/dev/vda指定根分区位置。是不是/dev/vda取决于 virtio-blk 在 virt 平台下的设备命名一般是 vda。这里有两个细节很容易踩坑第一个是-nodefaults它禁止 QEMU 创建默认的-serial、-monitor等设备避免串口暴错。加了这个参数后必须手动指定-serial和-netdev不熟的人容易漏掉。第二个是ifnone的写法老一点的 QEMU 版本允许-drive file...,formatqcow2直接接 virtio-blk但新版经常报错推荐显式指定ifnone然后单独用-device挂载。4.3 进入固件系统后做基础验证启动后终端会看到 U-Boot 或内核输出等系统执行完初始化脚本登录到 shell。华为固件的默认 shell 一般是 busybox 提供很多命令是裁剪过的但ip、ifconfig、route基本都在。先用cat /proc/cmdline确认启动参数传进去了cat /proc/cmdline正常应该输出你传入的root/dev/vda rw consolettyAMA0 mem512M。再检查网络接口ip link show如果看到eth0和eth1说明两块虚拟网卡已经被内核识别。到这里整套虚拟化环境已经算跑通了真正的重头戏是在这个系统上配置网络。4. 网络配置指南重点4.1 虚拟网络拓扑设计华为路由器固件在真实设备上至少承担两类角色WAN 口对接上一级网络LAN 口对接内网设备。虚拟化环境要完整复现这个拓扑需要在宿主机上构造两条独立链路。拓扑上我做的是tap0对应固件 eth0作为 WAN 口桥接到宿主机外部网络。在实验环境里我把 tap0 连接到宿主机已有的br0这样固件里的 WAN 口能拿到上级路由分配的 IP并且能访问宿主机所在局域网的其他机器。tap1对应固件 eth1作为 LAN 口单独创建一个桥接br-lan不给它物理网卡只让 tap1 和实验用的其他虚拟机网卡接进去。这样固件里的 DHCP 服务会把内网地址分配给连到 br-lan 的其他虚拟设备。打开宿主机的 IPv4 转发开关这样固件内部的 NAT 才能把数据包从 LAN 转发到 WAN。不开启转发的话内网设备能拿地址能 ping 网关但出不了外网。4.2 宿主机侧创建 tap 与网桥先清理旧的接口防止踩到残留配置sudo ip link delete tap0 2/dev/null sudo ip link delete br-lan 2/dev/null sudo ip link delete br0-master 2/dev/null创建两个 tap 接口并启用。这里有一个细节QEMU 启动时如果指定scriptno就不调用 QEMU 默认的桥接脚本你需要手动把 tap 配置好再启动 QEMU 脚本。sudo ip tuntap add dev tap0 mode tap user $(whoami) sudo ip tuntap add dev tap1 mode tap user $(whoami) sudo ip link set tap0 up sudo ip link set tap1 up将 tap0 加入已有的桥接。如果你宿主机本身用的是 NetworkManager 管理的有线网卡eth0桥接物理网卡时可以先创建一个br0sudo ip link add name br0 type bridge sudo ip link set eth0 master br0 sudo ip link set tap0 master br0 sudo ip link set br0 up ip addr add 192.168.1.10/24 dev br0这里提示一下如果物理机器是通过 DHCP 获取地址桥接后记得在 br0 上重启 DHCP 客户端比如sudo dhclient br0否则宿主机会断网。tap1 单独放在br-lan上不给它物理网卡这样固件的 LAN 口下方是隔离的虚拟内网sudo ip link add name br-lan type bridge sudo ip link set tap1 master br-lan sudo ip link set br-lan up开启 IPv4 转发sudo sysctl -w net.ipv4.ip_forward1为了让重启宿主机后转发依然生效建议写进/etc/sysctl.confnet.ipv4.ip_forward 1完成宿主机侧的配置后再执行上一节的 QEMU 启动脚本。记住必须在创建 tap 之后再启动 QEMU因为 QEMU 启动时-netdev tap,ifnametap0需要找到这个现成的接口。4.3 在固件内配置 WAN 口与默认路由进入固件系统的 shell 后先在 eth0WAN 口上启用 DHCP 客户端。华为固件可能已经内置了自动获取 WAN 地址的脚本但虚拟化环境下脚本未必能自动识别 eth0手动配置最稳udhcpc -i eth0如果知道上级网络是静态 IP也可以手动设置ifconfig eth0 192.168.1.20 netmask 255.255.255.0 up ip route add default via 192.168.1.1配置完成后去验证ip addr show eth0 ping -c 4 192.168.1.1 ping -c 4 223.5.5.5如果你把 WAN 口桥接到了宿主机外部局域网在宿主机上顺手ping 192.168.1.20也能通说明 WAN 链路没问题。如果 ping 不通外网第一个要查的是net.ipv4.ip_forward第二个是 eth0 有没有拿到默认路由第三个则是宿主机侧的 iptables FORWARD 链是否放行。我用的是实验环境直接暂时清掉 FORWARD 限制sudo iptables -P FORWARD ACCEPT生产环境别这么干实验环境图省事。4.4 在固件内配置 LAN 口与 DHCP 服务接着配置 eth1LAN 口给它设置一个私网地址ifconfig eth1 192.168.10.1 netmask 255.255.255.0 up然后启动 dnsmasq 提供 DHCP 服务。有些路由器固件里 dnsmasq 是预装的直接改配置即可华为固件的 dnsmasq 配置文件通常在/etc/dnsmasq.conf。我在里面添加interfaceeth1 dhcp-range192.168.10.100,192.168.10.200,12h dhcp-optionoption:router,192.168.10.1 dhcp-optionoption:dns-server,192.168.10.1重启 dnsmasq/etc/init.d/dnsmasq restart同时确认固件系统启用了 NAT 转发。busybox 环境下一般通过 iptables 做源地址转换iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT搞定之后你可以在宿主机上创建另一个终端用sudo qemu-system-aarch64再启动一个简易 ARM 虚拟机当作内网 PC也可以直接用宿主机的ping测试。不过宿主机要模拟内网设备需要把它的某个接口放进br-lan最简单的方式是创建一个tap2并把它接到 br-lan然后ifconfig tap2 192.168.10.50/24 up再尝试ping 192.168.10.1能通说明固件内部路由和 DHCP 服务正常工作。这一步走通后整套虚拟化网络配置就算闭环了。4.5 让配置重启后不丢失手动命令在重启固件后全部丢失。为了省事可以在根文件系统里预先改好启动执行脚本。路由器固件一般会在开机脚本里调用/etc/init.d/rcS或者在/etc/rc.local里执行自定义命令。将网络配置写进/etc/rc.local#!/bin/sh # WAN udhcpc -i eth0 # LAN ifconfig eth1 192.168.10.1 netmask 255.255.255.0 up /etc/init.d/dnsmasq restart iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT exit 0防止多次执行规则叠加在脚本开头先清理旧的 iptables 规则再添加新规则。修改完 rootfs 后记得重新生成 rootfs.qcow2。方法是在宿主机上挂载镜像替换文件。但其实更简单的思路是先把公共配置写进镜像实验中的临时命令就靠串口终端手动敲毕竟虚拟机的核心优势就是随便折腾不怕坏。5. 启动与网络问题排查实录5.1 启动卡住串口无输出或内核 panic我最早启动时QEMU 命令行后面啥都没有一个字符都不输出。这种情况八成是-machine virt和-cpu的组合不对或者是内核并没有把输出打到ttyAMA0。先检查 console 参数consolettyAMA0对大多数 ARM 平台是对的但有些固件用的是ttyS0或者ttyAMA后面的数字不同。宁可多试几种把-append里的 console 换成ttyS0看看有没有输出。还有一种情况是内核起了一半刷了一堆 CRC 错误或者 Kernel panic。常见原因是我提前制作的 rootfs 与固件内核不匹配。比如固件内核里没有 ext4 驱动你给它一个 ext4 根文件系统它铁定 panic。解决办法是在启动参数里加root/dev/ram0或把 rootfs 重新做回固件自带的文件系统格式。具体格式用file看解包出来的原始 rootfs 文件如果是 squashfs 就保留 squashfs创建镜像时对分区执行mksquashfs。5.2 WAN 口不通宿主机转发与防火墙排查WAN 口不通是最常见的问题但我所见到的原因五花八门。第一个要确认 tap0 是否真的加入到了桥接。在宿主机执行bridge link show看到tap0状态是state UP才行。如果没加入重新执行sudo ip link set tap0 master br0第二个检查点是宿主机 iptables。Ubuntu 默认 FORWARD 链可能是 DROP来自 br-lan 到 br0 的数据包会被丢掉。临时开放sudo iptables -I FORWARD -i br-lan -o br0 -j ACCEPT sudo iptables -I FORWARD -i br0 -o br-lan -j ACCEPT第三个点往往被忽略固件自身的防火墙。华为路由器的配置一般自带安全规则会把默认的forward策略设为 DROP导致内网到 WAN 的报文被静默丢弃。进到固件系统里检查iptables -L -n -v iptables -t nat -L -n -v如果看到默认策略是 DROP执行iptables -P FORWARD ACCEPT再清空规则iptables -F iptables -t nat -F做实验时图形界面不重要规则越简单越好别急着复刻生产配置。5.3 DHCP 获取不到地址固件内部的 dnsmasq 可能会只监听它认识的物理接口。如果启动时固件把网卡名改成了wan和lan而 QEMU 里报的设备名是eth0、eth1dnsmasq 就会找不到接口而拒绝启动。用dnsmasq --interface明确指定接口名或者检查/etc/init.d/dnsmasq里的监听参数。另一个常见坑是 dnsmasq 绑定了/etc/resolv.conf里的上游 DNS但没有配置no-resolv导致它尝试读取宿主机真实 DNS 失败而拒绝服务。在 dnsmasq.conf 里加no-resolv可以避免这个问题。DHCP 客户端拿不到地址时也别急着怪服务端先看服务端日志。busybox 系统中直接在前台运行 dnsmasq就能看到详细输出/usr/sbin/dnsmasq -d --interfaceeth1 \ --dhcp-range192.168.10.100,192.168.10.200,12h-d让 dnsmasq 在前台运行并打印日志排查问题极其好用。观察有没有收到 DHCP DISCOVER以及它给出的 DHCP OFFER 是什么。如果 DISCOVER 到了但 OFFER 发不出来大概率是防火墙规则挡住了 UDP 67/68 端口流量。5.4 宿主性能与稳定性调优QEMU 默认做的动态二进制翻译性能开销不小。如果宿主机 CPU 支持硬件虚拟化扩展大多数 x86 平台都支持可以在 QEMU 中开启 KVM 加速但前提是需要开启嵌套虚拟化。WSL2 或者部分云服务器默认不支持嵌套虚拟化这时候不能用-enable-kvm。在命令行加上-cpu host -enable-kvm注意-cpu host和 KVM 要一起用而且这只能加速同架构的虚拟机。我们是 x86 宿主机跑 ARM 虚拟机不能用 KVM纯靠 TCG 翻译。所以别指望性能能和真机一样实验环境能跑通、能出结果就好。提升性能的几个实用技巧内存别给太少ARM 路由器固件虽然精简但 512M 已经够用如果系统频繁 OOM 就加到 1G。-smp 2双核比单核明显流畅至少给两个 vCPU。使用 virtio 半虚拟化设备磁盘和网络都别用默认的模拟设备I/O 性能好不少。关闭不必要的模拟设备加了-nodefaults后只用需要的设备启动速度也快一些。5.5 快照与实验回滚做实验最怕越改越乱最后忘了改了什么。QEMU 的 qcow2 镜像天然支持快照在 QEMU monitor 界面操作很简单。启动时按Ctrl-a c进入 monitor执行savevm snapshot_before_network想回滚时同样进入 monitor执行loadvm snapshot_before_network快照会记录 CPU 状态、内存状态和设备状态相当于把整个虚拟机冻结恢复起来非常方便。你也可以在启动命令行加-snapshot参数所有写入都只写到临时层面退出即丢弃。不过这个模式对想保存实验结果的场景就不好用了要按需选择。6. 基于个人实测的体验与扩展建议这一套流程跑通之后我最大的感受是虚拟化网络设备这件事真正的门槛不在 QEMU 命令本身而是在于搞懂目标固件的启动流程、硬件依赖和网络初始化逻辑。把这三块想清楚QEMU 参数反而是好写的东西。华为路由器固件在虚拟化后的表现比较稳定只要 rootfs 格式匹配网络配置基本一次就能通。如果后续还想扩展可以考虑在两个方向加深。一个是在 QEMU 里跑多台路由器组成完整的虚拟组网环境用不同 tap 接口分别模拟 WAN、LAN、DMZ这样可以做更复杂的静态路由、策略路由实验。另一个是把虚拟固件接入 Packet Tracer 或 GNS3 这类网络模拟工具但注意工具本身对 QEMU 的集成方式有限需要手动封装 QEMU 启动模板工作量和收益要自己权衡。对我来说QEMU 模拟 ARM 路由器最大的价值就是低成本、高可复现、随便折腾这是真机给不了的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑