emu-kvm主要向客户机提供了如下4种不同模式的网络:
1)基于网桥(bridge)的虚拟网卡
2)基于NAT(Network Addresss Translation)的虚拟网络
3)QEMU内置的用户模式网络(user mode networking)(QEMU/KVM的默认方式)
4)直接分配宿主机上的网络设备的网络(包括VT-d和SR-IOV)
除了特别的需要iptables配置端口映射、数据包转发规则的情况,一般默认将防火墙所有规则都关闭,以避免妨碍客户机中的网络畅通
在QEMU命令行中,对客户机网络的配置(除物理网络设备直接分配外)都是用"-net"参数进行配置的,
如果没有设置任何的"-net"参数,默认使用"-net nic -net user"参数,进而使用完全基于QEMU内部实现的用户模式下的网络协议栈
qemu-kvm提供了对一系列主流和兼容性良好的网卡的模拟,通过"-net nic,model=?"参数可以查询到当前的qemu-kvm工具实现了哪些网卡的模拟
"rtl8139"网卡模式是qemu-kvm默认的模拟网卡类型
"e1000"是提供Intel e1000系列的网卡模拟,纯的QEMU(非qemu-kvm)默认就是提供Intel e1000系列的虚拟网卡。
virtio类型是qemu-kvm对半虚拟化IO(virtio)驱动的支持
qemu-kvm命令行在不加任何网络相关的参数启动客户机后,在客户机中可以看到它有一个默认的RTL8139系列的网卡,当然由于没有进行更多的网络配置,这个模拟的网卡虽然在客户机中可见,但是它使用的是用户模式的网络,其功能非常有限
查看物理机中的网卡信息:
lspci | grep Ethernet
qemu-kvm命令行中基本的"-net"参数的细节如下:
-net nic[, vlan=n ] [,m acaddr=mac] [,model=type ][,name=name] [,addr=addr] [,vectors=v]
执行这个命令行会让QEMU建立一个新的网卡并将其连接到n号VLAN上
其中:
"-net nic"是必需的参数,表明这是一个网卡的配置。
1)vlan=n, 表示将网卡放入到编号为n的VLAN,默认为0。
2)macaddr=mac, 设置网卡的MAC地址,默认会根据宿主机中网卡的地址来分配。若局域网中客户机太多,建议自己设置MAC地址,以防止MAC地址冲突。
3)model= type, 设置模拟的网卡的类型,在qemu-kvm中默认为rtl8139。使用qemu-kvm -net nic,model=? 查询kvm支持的网卡类型
4)name=name, 为网卡设置一个易读的名称,该名称仅在QEMU monitor中可能用到。
5)addr=addr, 设置网卡在客户机中的PCI设备地址为addr。
6)vectors=v, 设置该网卡设备的MSI-X向量的数量为n,仅对使用virtio驱动的网卡有效。设置为"vectors=0"是关闭virtio网卡的MSI-X中断方式。
示例:
-net vlan=0,macaddr=fe:54:00:86:0d:04,model=rtl8139 ,name=eth0,addr=0x0
如果需要向一个客户机提供多个网卡,可以多次使用"-net"参数
客户机(即虚拟机中)中用一些工具查看网卡相关的信息如下:
lspci|grep Ethernet
ethtool -i eth1 #-i选项仅显示驱动信息
ifconfig
在QEMU monitor中查看网络的信息,如下:
info network
一、桥接网络(客户机和宿主机平等,都是局域网中的一个节点,二者网络环境相同,类似vmare中桥接网络)
在QEMU/KVM的网络使用中,网桥(bridge)模式可以让客户机和宿主机共享一个物理网络设备连接网络,客户机有自己的独立IP地址,可以直接连接与宿主机一模一样的网络,客户机可以访问外部网络,外部网络也可以直接访问客户机(就像访问普通物理主机一样)。即使宿主机只有一个网卡设备,使用bridge模式也可知让多个客户机与宿主机共享网络设备
qemu-kvm的命令行中,关于bridge模式的网络参数如下:
-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]
该配置表示连接宿主机的TAP网络接口到n号VLAN中,并且使用file和dfile两个脚本在启动客户机时配置网络和在关闭客户机时取消网络配置
1) tap参数,表明使用TAP设备。TAP是虚拟网络设备,它仿真了一个数据链路层设备(ISO七层网络结构的第二层,需要IP地址,仅有mac地址),它像以太网的数据帧一样处理第二层数据报。而TUN与TAP类似,也是一种虚拟网络设备,它是对网络层设备的仿真。TAP用于创建一个网络桥,而TUN与路由相关。
2) vlan=n, 设置该设备VLAN编号,默认值为0。
3) name=name, 设置名称,在QEMU monior中可能用到,一般由系统自动分配即可。
4) fd=h, h为整数,是连接到已经打开的TAP接口的文件描述符,一般不要设置该选项,而是让QEMU自动创建一个TAP接口。在使用了fd=h的选项后,ifname、script、downscript、helper、vnet_hdr等选项都不可使用了(不能与fd选项同时出现在命令行中)。
5) ifname=name , 设置在宿主机中添加的TAP虚拟设备的名称(如tap1、tap5等),当不设置这个参数时,QEMU会根据系统中目前的情况,产生一个TAP接口的名称。
6) script file, 设置宿主机在启动客户机时自动执行的网络配置脚本。
如果不指定,其默认值为"/etc/qemu-ifup"这个脚本,可指定自己的脚本路径以取代默认值;
如果不需要执行脚本,则设置为"script=no"。
7) downscript=file, 设置宿主机在客户机关闭时自动执行的网络配置脚本。
如果不设置,其默认值为"/etc/qemu-ifdown";
如果户机关闭时宿主机不需要执行脚本,则设置为"downscript=no"。
8)helper=helper, 设置启动客户机时在宿主机中运行的辅助程序,包括建立一个TAP虚拟设备,默认值为/usr/local/libexec/qemu-bridge-helper(编译安装)。一般不用自定义,采用默认值即可。
9) sndbuf=nbytes, 限制TAP设备的发送缓冲区大小为n字节, 当需要流量进行流量控制时可以设置该选项。其默认值为"sndbuf=0", 即不限制发送缓冲区的大小。
示例:
-net tap ifname=vnet0,script=/etc/qemu-ifup,downscript=no
其余几个选项都是与virtio相关的,需要配合virtio使用
1)vnet_hdr =on | off, 设置是否打开TAP设备的"IFF_VNET_HDR"标识:
"vnet_hdr= off''表示关闭这个标识,
"vnet_hdr=on" 表示强制开启这个标识,如果没有这个标识的支持,则会触发错误。
IFF_VNET_HDR是tun/tap的一个标识,打开这个标识则允许发送或接受大数据包时仅做部分的校验和检查。打开这个标识,还可以提高virtio_net驱动的吞吐量。
2)vhost=on | off, 设置是否开启vhost-net这个内核空间的后端处理驱动,只对使用MIS-X中断方式的virtio客户机有效。
3)vhostfs=h,设置去连接一个已经打开的vhost网络设备。
4)vhostforce=on | off,设置是否强制使用vhost作为非MSI-X中断方式的virtio客户机的后端处理程序。
准备环境:
宿主机上进行如下操作
1) 要采用bridge模式的网络配置,首先需要安装两个RPM包,即bridge-utils和tunctl,它们提供所需的brctl和tunctl命令行工具
yum install bridge-utils -y
tunctl工具可选安装,centos 7.x系列需要编译安装
2) 查看tun模块是否加载,如下:
lsmod | grep tun #注意这个模块于是否安装tunctl工具无关
如果tun模块没有加载,则运行"modprobe tun"命令来加载。当然,如果已经将tun编译到内核(可查看内核config文件中是否有"CONFIG_TUN=y"选项),则不需要加载了。如果内核完全没有配置TUN模块,则需要重新编译内核才行
3) 检查/dev/net/tun的权限,需要让当前用户拥有可读写的权限。
ll /dev/net/tun
4) 建立一个bridge,并将其绑定到一个可以正常工作的网络接口上,同时让bridge成为连接本机与外部网络的接口(下面设置是临时生效,重启机器或重启网络服务后,将会失效,最好是写入到网卡配置文件中)
主要的配置命令如下:
brctl addbr br0
brctl addif br0 eth0 #这一步如果是ssh远程连接将会断开
brctl stp br0 on
ifconfig eth0 0
dhclient br0 这一步是自动获取ip地址,可手动设置
route
需要将默认路由设备设置为br0
ping #测试网络,ping外网
5 ) 准备qemu-ifup和qemu-ifdown脚本。
在客户机启动网络前会执行的脚本是由"script"选项配置的脚本(默认为/etc/qemuif-up),该脚本中创建一个TAP设备并将其与bridge绑定起来。
qemu-ifup脚本中"$1"是qemu-kvm命令工具传递给脚本的参数(即ifname选项的值),它是(在宿主机使用ifconfig可看到)客户机使用的TAP设备名称(如tap0、tap1等,或者是前面提及的ifname选项的值)。
另外,其中的"tunctl"命令这一行是不需要的,因为qemu-bridge-helper程序已经会创建好TAP设备,这里列出来只是因为在一些版本较旧的qemu-kvm中可能没有自动创建TAP设备
cat >> /etc/qemu-ifup<<end
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
tunctl -u $(whoami) -t $1
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
end
qemu-kvm工具在客户机关闭时会自动解除TAP设备与bridge绑定,也会自动删除已不再使用的TAP设备,所以qemu-ifdown这个脚本不是必需的,最好设置为"downscript=no"
安装虚拟机:
qemu-kvm --enable-kvm -m 2048 -smp 2 \
-boot order=cd -hda /kvm/os/cs-01.qcow2 \
-cdrom /kvm/iso/CentOS-7-x86_64-Minimal-1804.iso \
-vnc :1 \
-net nic -net tap,ifname=tap0,script=/etc/qemu-ifup.sh,downscript=no \
-daemonize
启动虚拟机:
qemu-system-x86_64 /kvm/os/cs-01.qcow2 -smp 2 -m 2048 \
-net nic -net tap,ifname=tap1,script=/etc/qemu-ifup,downscript=no \
-vnc :0 \
-daemonize
brctl show #如果在br0上绑定了tap设备,说明成功
ls /sys/devices/virtual/net/
使用vncviewer登录到客户机上,设置网络(此时一定要像配置物理机一样配置网络环境)