四种网络模式(如何设置网络)

在QEMU中,主要给客户机提供了以下4种不同模式的网络配置方案:

  • 基于网桥(Bridge)的虚拟网卡模式
  • 基于NAT(Network Addresss Translation)的虚拟网络模式
  • QEMU内置的用户模式网络
  • 直接分配网络设备模式(例如,VT-d)

网桥和NAT是基于linux-bridge实现的软件虚拟网络模式,QEMU内置的用户模式网络是QEMU软件虚拟的网络模式。第四种模式是直接物理网卡分配给客户机使用,比方说有eth0和eth1两块网卡,直接把eth0这块网卡给某一客户机使用。

虚拟化网络设备(创建网卡)

在QEMU命令行中,采用前三种网络配置方案对客户机网络的配置都是用“-net”参数来进行配置的。
QEMU命令行中基本的“-net”参数如下:

-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]

主要参数说明:

  • -net nic:这个是必须的参数,表明为客户机创建客户机网卡。
  • vlan=n:表示将建立一个新的网卡,并把网卡放入到编号为n的VLAN,默认为0。
  • macaddr=mac:设置网卡的MAC地址,默认会根据宿主机中网卡的地址来分配;若局域网中客户机太多,建议自己设置MAC地址以防止MAC地址冲突。
  • model=type:设置模拟的网卡的类型,默认为rtl8139。
  • name=name:设置网卡的名字,该名称仅在QEMU monitor中可能用到,一般由系统自动分配。
  • addr=addr:设置网卡在客户机中的PCI设备地址为addr。
  • vectors=v:设置该网卡设备的MSI-X向量的数量为v,该选项仅对使用virtio驱动的网卡有效,设置为“vectors=0”是关闭virtio网卡的MSI-X中断方式。

如果没有配置任何的“net”参数,则默认是用“-net nic -net user”参数,即指示QEMU使用一个QEMU内置的用户模式网络,这种模式是默认的。因此,下面两行命令是等价的:

qemu-system-x86_64 -drive file=./ubuntu14.04.img -net nic -net user
qemu-system-x86_64 -drive file=./ubuntu14.04.img
Virtio驱动(网络设备的虚拟化方式)

在为客户机选择网络设备时,一般来说优先选择半虚拟化的网络设备而不是纯软件模拟的设备。Virtio_net半虚拟化驱动,可以提高网络吞吐量和降低网络延迟,从而让客户机网络达到几乎和原生网卡差不多的性能。使用virtio_net需要两部分的支持,宿主机QEMU工具支持和客户机virtio_net驱动的支持。现在流行的Linux发行版都已经将virtio_net作为模块编译到系统之中,所以,这个问题不用再考虑。(.ko文件是kernel object文件(内核模块))

qemu设置网络 qemu 网络模式_虚拟网络


目前,QEMU提供了对一系列主流网卡的模拟,通过“qemu-system-x86_64 -net nic,model=?”命令可以查询到当前的QEMU工具实现了哪些网卡的模拟。

qemu设置网络 qemu 网络模式_虚拟网络_02

网络Tap设备(从操作系统层面看到的设备及接口)

在QEMU中,网桥模式是一种比较常见的网络连接模式。在这种模式下,客户机和宿主机共享一个物理网络,客户机的IP是独立的,它和宿主机是在同一个网络里面。客户机可以访问外部网络,外部网络也可以访问这台客户机。TUN和TAP设备是Linux内核虚拟网络设备,纯软件实现。
在QEMU命令行中,关于创建网络tap设备“-net tap”的参数如下:

-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,helper=helper][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h][,vhostforce=on|off]

主要参数说明:

  • -net tap:这个参数是必须的,表示创建一个tap设备。
  • vlan=n:设置该设备VLAN编号,默认值为0。
  • name=str:设置网卡的名字。在QEMU monitor里面用到,一般由系统自动分配。
  • fd=h:连接到现在已经打开着的TAP接口的文件描述符,一般让QEMU会自动创建一个TAP接口。
  • ifname=name:表示tap设备接口名字。
  • script=file:表示host在启动guest时自动执行的脚本,默认为/etc/qemu-ifup;如果不需要执行脚本,则设置为“script=no”。
  • downscript=dfile:表示host在关闭guest时自动执行的脚本,默认值为/etc/qemu-ifdown;如果不需要执行,则设置为“downscript=no”。
  • helper=helper:设置启动客户机时在宿主机中运行的辅助程序,包括去建立一个TAP虚拟设备,它的默认值为/usr/local/libexec/qemu-bridge-helper,一般不用自定义,采用默认值即可。
  • sndbuf=nbytes:限制TAP设备的发送缓冲区大小为n字节,当需要流量进行流量控制时可以设置该选项。其默认值为“sndbuf=0”,即不限制发送缓冲区的大小。
使用网桥方式配置客户机网络

(配置之前最好将VMware中的宿主机拍快照)
宿主机中的步骤如下:
(1) 安装所需软件包
要采用网桥模式的网络配置,需要在宿主机中,安装两个配置网络所需的软件包,uml-utilities和bridge-utils,前者是含有建立虚拟网络设备(TAP interfaces)的工具,后者是虚拟网桥桥接工具,可以使用apt-get工具来如下安装:

apt-get install uml-utilities     #建立虚拟网络设备的工具
apt-get install bridge-utils      #虚拟网桥桥接工具

qemu设置网络 qemu 网络模式_qemu设置网络_03


qemu设置网络 qemu 网络模式_网络设备_04


(2) 使用“ifconfig”命令查看宿主机网络接口名称(eth0或者ens33)

qemu设置网络 qemu 网络模式_网络设备_05


(3) 建立一个bridge,并将其绑定在一个可以正常工作的网络接口上,同时让bridge成为连接本机和外部网络的接口。

主要配置命令如下:

brctl show                 #查看网桥
brctl addbr br0            #增加一个虚拟网桥
br0brctl show              #查看网桥
brctl addif br0 ens33      #在br0中添加一个接口
ens33brctl show            #查看网桥
(如果xshell连接,该命令执行完,xshell会断开,
  eth0或者ens33是宿主机的网络接口的名字,按自己实际的名字配置。)
brctl stp br0 on       #打开STP协议,否则可能造成环路
(STP协议(生成树协议)逻辑上断开环路,防止二层网络的广播风暴的产生。)
brctl show            #查看网桥
ifconfig ens33 0      #将ens33的IP设置为0dh
client br0            #设置动态ip分配给br0配置ip

(如果无法获取ip,可以转到后续步骤(4)手动设置ip信息)

qemu设置网络 qemu 网络模式_虚拟网络_06


再次使用“ifconfig”命令查看网络接口:

qemu设置网络 qemu 网络模式_命令行_07


使用命令“ifconfig br0 up”启动网桥。

如果想要删除某个虚拟网桥和接口,可以使用命令delbrdelif

(4) 手工配置网桥ip

当然,也可以持久化的配置网桥,使用命令“cat /etc/network/interfaces”把配置直接写入文件(etc/network/interfaces),如下所示:

# interfaces(5) file used by ifup(8) and ifdown(8)
auto loiface lo inet loopback

auto br0
iface br0 inet static
bridge_ports eth0
address 192.168.10.239
netmask 255.255.255.0
gateway 192.168.10.250
dns-nameservers 8.8.8.8 222.139.215.195

(5) 准备启动脚本qemu_ifup,功能是在启动虚拟机时创建和打开指定的TAP接口,并将该接口添加到虚拟网桥中。/etc/qemu-ifup脚本代码已提供。

qemu设置网络 qemu 网络模式_虚拟网络_08


查看qemu-ifup文件的权限,如果没有执行权限,使用如下命令修改:

chmod +777 qemu-ifup

qemu设置网络 qemu 网络模式_虚拟网络_09


(6) 准备结束脚本qemu_ifdown,主要功能是退出虚拟机时将该接口从虚拟网桥中移除,然后关闭该接口。一般不用做这个,因为QEMU会自动做。/etc/qemu-ifdown脚本代码已提供。

(7) 查看br0的状态在启动客户机之前,在宿主机上,用命令行看一下此时的br0的状态:

qemu设置网络 qemu 网络模式_虚拟网络_10


(8) 用qemu命令启动bridge模式的虚拟机在宿主机中,用命令行启动客户机,如下:

qemu-system-x86_64 ubuntu14.04.img -m 512 -smp 2 -net nic,model=virtio,macaddr=00:16:3e:22:22:22 -net tap,ifname=tap1,script=qemu-ifup,downscript=no --enable-kvm -vnc :1

qemu设置网络 qemu 网络模式_命令行_11


(9) 启动客户机之后,再用命令行看一下此时的br0的状态和宿主机网络设备:

qemu设置网络 qemu 网络模式_网络设备_12


在创建了客户机之后,添加了一个名为tap1的TAP虚拟网络设备,将其绑定在br0这个bridge上。

虚拟机启动以后,发现共有三个虚拟网络设备,依次为:前面建立好的bridge设备br0,网络回路设备lo(就是一般IP为127.0.0.1的设备)和给客户机提供网络的TAP设备tap1。

使用“ifconfig”命令查看宿主机的网络设备:

qemu设置网络 qemu 网络模式_命令行_13


客户机中的步骤如下:

(10) 在客户机中,使用“ifconfig”命令查看网络是否配置好

qemu设置网络 qemu 网络模式_命令行_14


(11) 网络测试:

使用“ifconfig”命令查看宿主机br0的ip为:192.168.3.131,客户机的eth0的ip为192.168.3.132,发现宿主机能ping通客户机,客户机也能ping通宿主机。

客户机ping宿主机:

qemu设置网络 qemu 网络模式_虚拟网络_15


宿主机ping客户机:

qemu设置网络 qemu 网络模式_qemu设置网络_16


在客户机中ping百度:

qemu设置网络 qemu 网络模式_qemu设置网络_17


(12) 当客户机关闭后,再次在宿主机中查看br0和虚拟设备的状态,如下:

qemu设置网络 qemu 网络模式_命令行_18


由上面的输出信息可知,tap1设备已被删除。