当前位置:操作系统 > Unix/Linux >>

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

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,