KVM中的网络简介(qemu-kvm)

Posted liliyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM中的网络简介(qemu-kvm)相关的知识,希望对你有一定的参考价值。

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, 表示将网卡放入到编号为nVLAN,默认为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网络接口到nVLAN,并且使用file和dfile两个脚本在启动客户机时配置网络和在关闭客户机时取消网络配置

 

1)  tap参数,表明使用TAP设备。TAP是虚拟网络设备,它仿真了一个数据链路层设备(ISO七层网络结构的第二层,需要IP地址,仅有mac地址),它像以太网的数据帧一样处理第二层数据报。而TUNTAP类似,也是一种虚拟网络设备,它是对网络层设备的仿真。TAP用于创建一个网络桥,而TUN与路由相关。

2)  vlan=n, 设置该设备VLAN编号,默认值为0。

3)  name=name, 设置名称,QEMU monior中可能用到,一般由系统自动分配即可

4)  fd=h, h为整数,是连接到已经打开的TAP接口的文件描述符,一般不要设置该选项,而是让QEMU自动创建一个TAP接口。在使用了fd=h的选项后,ifnamescriptdownscripthelpervnet_hdr等选项都不可使用了(不能与fd选项同时出现在命令行中)

5) ifname=name , 设置在宿主机中添加的TAP虚拟设备的名称(如tap1tap5等),当不设置这个参数时,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_HDRtun/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登录到客户机上,设置网络(此时一定要像配置物理机一样配置网络环境)

 






以上是关于KVM中的网络简介(qemu-kvm)的主要内容,如果未能解决你的问题,请参考以下文章

Qemu-kvm的网络模式

虚拟化网络之QEMU-KVM虚拟机模拟net-space功能

kvm虚拟化2-qemu-kvm

qemu-kvm简单使用

qemu-kvm部署虚拟机

使用字符界面 qemu-kvm 创建虚拟机