Qemu使用Bridge模式让虚拟机和主系统互访和上网
以前一直用 TUN/TAP模式设置网络,即启动虚拟机时,自动加载网卡接口 tap0并为其分配一个IP(在/etc/qemu-ifup中设置),虚拟机的 eth0启动后相当于和 tap0接在同一个交换机上,两者只要IP设在同一网段即可相互访问。但是虚拟机上网要通过主系统IP伪装才行。网络结构图如下:
202.103.xx.xx
Internet ---- Gateway -------[eth0] Host [tap0] ------- Virtual Machine [eth0]
192.168.0.1 192.168.0.2 10.8.0.1 10.8.0.2
但是这样有时候很不方便,如果主系统所在局域网要访问虚拟机,是无法直接访问的,需要在主系统上面设置端口映射。
有没有像 VMware 桥连模式一样的方式呢?虚拟机如同局域网内另外一台独立的计算机,有和主系统同网段内的IP,虚拟机可以和局域网内所有其他机器互访,并且虚拟机可以上网。
经过一番摸索,终于找到了解决办法。如下:
启动虚拟机时仍然使用 TUN/TAP 模式,但是网卡启动脚本有些变化。
qemu -boot c -hda system.img -net nic -net tap,ifname=tap0,script=/etc/qemu-ifup
启动脚本:/etc/qemu-ifup
### 注释掉原来的脚本
## ifconfig $1 10.8.0.1
## 获取原来主系统 eth0 的 IP 和网关
IP=`ifconfig eth0|grep "inet addr"|awk '{print $2}'|sed 's/addr://'`
GATEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'`
## 删除 eth0 的 IP
ip addr del $IP dev eth0
## 激活 tap0 ($1 是qemu传递过来的网卡名称,即tap0)
ip link set $1 up
## 停止并删除存在的网桥
ip link set br0 down &>/dev/null
brctl delbr br0 &>/dev/null
## 添加网桥接口 br0
brctl addbr br0
## 将 eth0 加入网桥
brctl addif br0 eth0
## 将 tap0 加入网桥
brctl addif br0 $1
## 启动网桥
ifconfig br0 $IP up
## 添加默认路由
route add default gw $GATEWAY
这样当虚拟机启动后,主系统网络接口信息为:
br0 192.168.0.2
eth0 <无IP>
tap0 <无IP>
网关 192.168.0.1
此时虚拟机的eth0可以设置为 192.168.0.3, 网关设为192.168.0.1
这样设置后,主系统可以和虚拟机相互通讯,虚拟机也可以上网了
如果关闭了虚拟机,需要恢复原来的网络设置,可以执行下面的脚本:
## /etc/qemu-ifup.restore
IP=`ifconfig br0|grep "inet addr"|awk '{print $2}'|sed 's/addr://'`
GATEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'`
ip addr del $IP dev br0
ip link set br0 down
brctl delbr br0
ifconfig eth0 $IP up
route add default gw $GATEWAY
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论