kvm学习---虚拟机(客户机)网络配置

今天学习了 在QEMU中,如何给客户机进行网络配置

1、四种网络模式(如何配置网络)

  • 基于网桥(Bridge)的虚拟网卡模式
  • 基于NAT的虚拟网络模式
  • QEMU内置的用户模式网络
  • 直接分配网络设备模式

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

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

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

-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 

3、Virtio驱动

在为客户机选择网络设备时,一般来说优先选择半虚拟化的网络设备而不是纯软件模拟的设备。Virtio_net半虚拟化驱动,可以提高网络吞吐量和降低网络延迟,从而让客户机网络达到几乎和原生网卡差不多的性能。

使用virtio_net需要两部分的支持,宿主机QEMU工具支持和客户机virtio_net驱动的支持。(现在流行的Linux发行版已经将virtio_net作为模块嵌入到系统中)

通过“qemu-system-x86_64 -net nic,model=?”命令查询当前的QEMU工具实现了哪些网卡的模拟

root@ubuntu:/home/img# qemu-system-x86_64 -net nic,model=?
warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

4、网络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”,即不限制发送缓冲区的大小。

5、使用网桥方式配置客户机网络

5.1、安装所需软件包

采用网桥模式的网络配置,需要在宿主机中,安装两个配置网络所需的软件包,`uml-utilities`和`bridge-utils`,前者是含有建立虚拟网络设备(TAP interfaces)的工具,后者是虚拟网桥桥接工具,可以使用apt-get工具来如下安装:
root@ubuntu:/home/img# apt install -y uml-utilities 
root@ubuntu:/home/img# apt install -y bridge-utils

5.2、 查看宿主机网络接口名称

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

root@ubuntu:/home/img# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.70.135  netmask 255.255.255.0  broadcast 192.168.70.255
        inet6 fe80::9e22:64c9:d4ef:35a8  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:e3:84:38  txqueuelen 1000  (Ethernet)
        RX packets 46703  bytes 62726662 (62.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8159  bytes 672364 (672.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 300  bytes 23672 (23.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 300  bytes 23672 (23.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

5.3、 查看当前用户是否有可读写权限

检查/dev/net/tun,查看当前用户是否有可读写权限。

root@ubuntu:/home/img# ll /dev/net/tun 
crw-rw-rw- 1 root root 10, 200 Jun  6 01:00 /dev/net/tun

5.4、建立一个bridge

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

root@ubuntu:/home/img# brctl addbr br0 			# 增加一个虚拟网桥br0

root@ubuntu:/home/img# brctl show				# 查看网桥
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29e38438	no	
	
root@ubuntu:/home/img# brctl addif br0 ens33    # 在br0中添加一个接口ens33
# (如果xshell连接,该命令执行完,xshell会断开,eth0或者ens33是宿主机的网络接口的名字,按自己实际的名字配置)

root@ubuntu:/home/img# brctl show				# 查看网桥
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29e38438	no		ens33

root@ubuntu:/home/img# brctl stp  br0 on        #打开STP协议,否则可能造成环路(STP协议(生成树协议)逻辑上断开环路,防止二层网络的广播风暴的产生。)

root@ubuntu:/home/img# brctl show				# 查看网桥
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29e38438	yes		ens33

root@ubuntu:/home/img# ifconfig ens33 0         #将ens33的IP设置为0

root@ubuntu:/home/img# dhclient br0				#设置动态ip分配给br0配置ip(如果无法获取ip,可以转到后续步骤(5)手动设置ip信息)

root@ubuntu:/home/img# route					 #显示路由表信息
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    0      0        0 br0
default         _gateway        0.0.0.0         UG    20100  0        0 ens33
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 br0
192.168.70.0    0.0.0.0         255.255.255.0   U     0      0        0 br0
192.168.70.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

root@ubuntu:/home/img# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.70.135  netmask 255.255.255.0  broadcast 192.168.70.255
        inet6 fe80::20c:29ff:fee3:8438  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:e3:84:38  txqueuelen 1000  (Ethernet)
        RX packets 140  bytes 12328 (12.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 156  bytes 15727 (15.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.70.135  netmask 255.255.255.0  broadcast 192.168.70.255
        inet6 fe80::9e22:64c9:d4ef:35a8  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:e3:84:38  txqueuelen 1000  (Ethernet)
        RX packets 47358  bytes 62778102 (62.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8682  bytes 718906 (718.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 613  bytes 51565 (51.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 613  bytes 51565 (51.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

使用命令“ifconfig br0 up”启动网桥
如果想要删除某个虚拟网桥接口,可以使用命令delbrdelif

5.5、手工配置网桥ip

持久化的配置网桥,把配置直接写入文件(etc/network/interfaces

# 写入之前
root@ubuntu:/home/img# cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

# 写入之后
#root@kvm-host:~# cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface 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.6、准备启动脚本qemu_ifup

在启动虚拟机时创建和打开指定的TAP接口,并将该接口添加到虚拟网桥中

# 查看qemu-ifup文件是否有执行权限
root@ubuntu:/home/img# ll qemu-ifup 
-rwxrw-rw- 1 xyc xyc 1148 Jun  6 03:23 qemu-ifup*

5.7、查看br0的状态

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

root@ubuntu:/home/img# ls /sys/devices/virtual/net/
br0  lo
root@ubuntu:/home/img# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29e38438	yes		ens33

5.8、 用qemu命令启动bridge模式的虚拟机

在宿主机中,用命令行启动客户机

root@ubuntu:/home/img#  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

5.9、查看br0状态

启动客户机之后,再用命令行看一下此时的br0的状态

xyc@ubuntu:~$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29e38438	   yes		ens33
							            tap1

在创建了客户机之后,添加了一个名为tap1的TAP虚拟网络设备,将其绑定在br0这个bridge上。
再次使用“ls /sys/devices/virtual/net/”查看宿主机网络设备

xyc@ubuntu:~$ ls /sys/devices/virtual/net/
br0  lo  tap1

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

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

在客户机操作

5.10、查看网络是否配置好

在客户机中,使用“ifconfig”命令查看网络是否配置好。
kvm学习---虚拟机(客户机)网络配置_第1张图片

5.11、网络测试

使用“ifconfig”命令查看
宿主机br0的ip为:192.168.70.135
客户机的eth0的ip为192.168.70.136

客户机ping宿主机
kvm学习---虚拟机(客户机)网络配置_第2张图片
宿主机ping客户机
kvm学习---虚拟机(客户机)网络配置_第3张图片
客户机ping百度
kvm学习---虚拟机(客户机)网络配置_第4张图片
发现都可以ping通,说明我们配置成功。。。

qemu-ifup文件

#! /bin/sh
# Script to bring a network (tap) device for qemu up.
# The idea is to add the tap device to the same bridge
# as we have default routing to.

# in order to be able to find brctl
PATH=$PATH:/sbin:/usr/sbin
ip=$(which ip)

if [ -n "$ip" ]; then
   ip link set "$1" up
else
   brctl=$(which brctl)
   if [ ! "$ip" -o ! "$brctl" ]; then
     echo "W: $0: not doing any bridge processing: neither ip nor brctl utility not found" >&2
     exit 0
   fi
   ifconfig "$1" 0.0.0.0 up
fi

switch=$(ip route ls | \
    awk '/^default / {
          for(i=0;i<NF;i++) { if ($i == "dev") { print $(i+1); next; } }
         }'
        )

# only add the interface to default-route bridge if we
# have such interface (with default route) and if that
# interface is actually a bridge.
# It is possible to have several default routes too
for br in $switch; do
    if [ -d /sys/class/net/$br/bridge/. ]; then
        if [ -n "$ip" ]; then
          ip link set "$1" master "$br"
        else
          brctl addif $br "$1"
        fi
        exit	# exit with status of the previous command
    fi
done

echo "W: $0: no bridge for guest interface found" >&2

你可能感兴趣的:(KVM学习)