QEMU系统模式如何桥接外网
一、引言
qemu是一种通用的开源计算机仿真器和虚拟器。qemu共有两种操作模式:
- 系统模式:能够在任意支持的架构上为任何机器运行一个完整的操作系统
- 用户模式仿真:能够在任意支持的架构上为另一个Linux/BSD运行程序
在进行IoT固件模拟的过程中,我们需要进调试的时候需要能够启动系统级的qemu模拟,那么就需要使用系统模式,有的环境需要连网络,那么就需要使用桥接的方法,本文介绍了系统模式的无网络情况、内网情况和外网连接的情况的模拟方式,满足大部分实际需求。
二、环境准备
测试主机为Ubuntu 20.04 64位系统,以mips架构的Linux系统模拟为例。
1、qemu安装
方法一:apt源安装
sudo apt install qemu-system
方法二:源码安装(可以使用较新版本的qemu)
wget https://download.qemu.org/qemu-8.2.0.tar.xz
tar xf qemu-8.2.0.tar.xz
cd qemu-8.2.0
./configure
make
make install
安装好后,查看是否能正常运行
2、下载镜像
选择其中2个进行下载:
wget https://people.debian.org/~aurel32/qemu/mips/debian_squeeze_mips_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/mips/vmlinux-2.6.32-5-4kc-malta
三、QEMU系统模式-无网络
测试是否能够正常启动,启动命令:
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -nographic
启动完成后,输入账户root,密码root登录系统
四、QEMU系统模式-内网
使用上面的启动命令,启动的系统是没有网络的,如果需要加入网络,可以使用以下命令:
# 安装工具
sudo apt install -y bridge-utils uml-utilities
# 创建网桥
sudo brctl addbr br0
sudo ifconfig br0 192.168.88.1/24 up
# 创建tap0接口,并添加到网桥
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.88.10/24 up
sudo brctl addif br0 tap0
启动系统,设置IP
# 启动系统
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -nographic -netdev tap,id=tapnet,ifname=tap0,script=no -device e1000,netdev=tapnet
设置IP与tap0一个网段,可以ping通同网段主机,但不能连接外网
五、QEMU系统模式-桥接外网
配置桥接网络,如果是静态IP,需要手动设置。
sudo ifconfig ens33 down # 首先关闭宿主机网卡ens33接口
sudo brctl addbr br1 # 添加名为 br1 的网桥
sudo brctl addif br1 ens33 # 在 br1 中添加一个接口
sudo brctl stp br1 off # 如果只有一个网桥,则关闭生成树协议
sudo brctl sethello br1 1 # 设置 br1 的 hello 时间
sudo ifconfig br1 0.0.0.0 promisc up # 启用 br1 接口
sudo ifconfig ens33 0.0.0.0 promisc up # 启用 宿主机网卡ens33接口
sudo dhclient br1 # 从 dhcp 服务器获得 br1 的 IP 地址
sudo ifconfig ens33 up # 再次启动宿主机网卡ens33接口
sudo tunctl -t tap1 # 创建一个 tap1 接口
sudo brctl addif br1 tap1 # 在虚拟网桥中增加一个 tap1 接口
sudo ifconfig tap1 0.0.0.0 promisc up # 启用 tap1 接口
启动镜像
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -nographic -netdev tap,id=net1,ifname=tap1,script=no -device e1000,netdev=net1
启动后,镜像中可以ping通外网了。