抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

KVM一些底层原理

CPU虚拟化

利用命令查看CPU是否支持KVM虚拟化

输出带有vmx或svm,就说明当前CPU支持KVM

$ egrep -o '(vmx|svm)' /proc/cpuinfo

image-20200703140246566

一个KVM虚拟机就是主机中一个qemu-kvm进程

虚拟机中的每一个虚拟vCPU对应qemu-kvm进程中的一个进程

image-20200703140828672

从上图可以看到,主机有两个物理CPU,有两个虚拟机vm1和vm2。vm1有2个vCPU,vm2有4个vCPU,所有vm1有2个线程,vm2有4个线程在两个物理CPU上调度。

注:虚拟机的vCPU总数可以超过物理CPU数量(CPU overcommit)。这样虚拟机可以充分利用宿主机的CPU资源,前提是所有虚拟机不能在同一时刻都满负荷运行。

内存虚拟化

KVM通过内存虚拟机共享物理系统内存,动态分配给虚拟机。

image-20200703142115687

为了能够在一台主机上运行多个虚拟机。KVM实现VA(虚拟内存)->PA(物理内存)->MA(机器内存)之间的地址转换。

虚拟OS控制虚拟地址到客户内存物理地址的映射。VA->PA

KVM负责客户物理内存到实际机器内存的映射。PA->MA

注:内存也可以overcommit。

KVM存储虚拟化

KVM存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。

Storage Pool:主机上可以看到的一片存储空间,可以是多种类型。

Volume:在Storage Pool中划分出的一块空间,主机将Volume分配给虚拟机,Volume在虚拟机视角就是一块硬盘。

下面介绍三种不同类型的Storage Pool:

目录类型的Storage Pool

最常用的Storage Pool类型。

KVM将主机目录/var/lib/libvirt/images/作为默认的Storage Pool。(KVM所有可以使用的Storage Pool都定义在主机的/etc/libvirt/storage目录下,每个Pool都一个xml文件,可以查看其默认位置)

image-20200703143343301

Volume就是该目录下的文件,一个文件就是一个Volume。

image-20200703143006679

文件cirros***.img就是一个Volume。从KVM1视角来看,就是启动磁盘。

为kvm1添加新的磁盘

image-20200703143720656

新的磁盘信息

image-20200703143749153

image-20200703143841683

使用文件做Volume有很多优点:存储方便、移植性好、可复制、可远程访问

远程访问:镜像文件不一定都放置到宿主机本地文件系统中,也可以存储在通过网络连接的远程文件系统(NFS\GlusterFS),使得镜像文件可以在多个主机之间共享,便于虚拟机在不同主机之间做Live Migration。在分布式文件系统中多副本的特性还可以保证镜像文件的高可用性。

KVM支持多种Volume文件格式(raw、qcow2、vmdk)

raw:默认格式(原始磁盘镜像格式),移植性好,性能好,但是大小固定,不能节省磁盘空间。

qcow2:推荐格式,cow表示copy on write,能够节省磁盘空间,支持AES加密,zlib压缩,也支持多快照。

vmdk:VMware的虚拟磁盘格式,VMware可以直接在KVM上跑。

LVM类型的Storage Pool

主机上VG中的LV可以作为虚拟磁盘分配给虚拟机使用。

LV由于没有磁盘的MBR引导记录,不能作为虚拟机的启动盘,只能作为数据盘使用。

主机的VG就是一个Storage Pool,VG中的LV就是Volume。

优点:拥有较好的性能

缺点:管理和移动性方面不如镜像文件,而且不能通过网络远程使用。

Step1:创建VG。命名为HostVG

image-20200703152126565

Step2:创建Storage Pool定义文件Host.xml

image-20200703152140684

Step3:通过virsh命令创建新的Storage Pool “HostVG”并启动HostVG

image-20200703152156354image-20200703153324905

Step4:在Virt-manager中为虚拟机KVM1添加LV的虚拟磁盘

image-20200703153352100

image-20200703153410624

image-20200703153425968

image-20200703153437263

image-20200703153501590

image-20200703153523423

image-20200703153535769

Step5:查看主机上多出来的LV

image-20200703153546105

其他类型的Storage Pool

KVM 还支持 iSCSI,Ceph 等多种类型的 Storage Pool。目前使用最多的就是目录类型。

网络虚拟化

image-20200703155256207

网络虚拟化中两个最重要的东西:Linux BridgeVLAN

Linux Bridge

假设主机有1块与外网连接的物理网卡eth0,如何让vm1能够访问外网?

方案一:直接将物理网卡分配给vm1。但是主机和vm2没有网卡,就不能访问外网了。

方案二:利用Linux Bridge作为中间模块,将eth0与vnet0连接起来。

image-20200703235514169

KVM环境下实现Linux Bridge

Step1:配置Linux Bridge br0)(网桥)

Step1-1:查看网络脚本目录,只有以太网卡eth0的配置

image-20200704165259203

Step1-2:查看以太网卡ifcfg-eth0的内容

image-20200704165332017

Step1-3:查看当前连接

image-20200704165413499

Step1-4:新建网桥br0并查看ifcfg-br0

image-20200704165502602

Step1-5:查看当前连接

image-20200704165519080

Step1-6:将网桥br0桥接至eth0并查看刚生成的ifcfg-bridge-slave-eth0文件

image-20200704165541305

image-20200704165559338

Step1-7:查看当前连接

image-20200704165639479

Step1-8:关闭eth0,打开网桥br,查看当前连接

image-20200704165658562

Step2:配置VM1

image-20200704170308796

Step2-2:查看VM1 IP地址以及是否能访问外网

image-20200704171953868

image-20200704171917822

Step2-3:查看VM2 IP地址以及是否能访问VM1和外网

理解virbr0

virbr0是KVM默认创建的一个Bridge,作用是为连接其上的虚拟机网卡提供NAT外网的功能。

virbr0默认分配了一个IP 192.16.8.122.1,并为连接其他虚拟网卡提供DHCP服务。

image-20200705103705538

virbr0使用dnsmasq提供DHCP服务,可以在祖籍中查看该进程信息

image-20200705103948976

可以通过ssh连接VM1,VM2同理

image-20200705104242064

image-20200705104341912

注:使用NAT的虚拟机可以访问外网,但外网无法直接访问VM1,因为VM1发出的网络包源地址并不是192.168.122.53,而是被NAT替换为主机的IP了。

与br0不同的是:在br0情况下,VM1通过自己的IP直接与外网通信,而不需经过NAT地址转换。

VLAN

LAN(Local Area Network)本地局域网,通常使用Hub和Switch来连接LAN中的计算机。

一个LAN代表一个广播域。LAN中的所有成员都会收到任意一个成员发出的广播包。

VLAN(Virtual LAN)。VLAN将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的VLAN中。

交换机的端口有两种配置模式:AccessTrunk

Access口:端口打上VLAN标签,表明该端口属于哪个VLAN。利用VLAN ID来区分。Access口都是直接与计算机网卡相连,这样从该网卡出来的数据包流入Access口就被打上VLAN标签。

Trunk口:交换机A、B中都有不同标签的VLAN,利用trunk口将其相连。

image-20200705105437408

KVM环境下实现VLAN(未成功)

image-20200705110421224

Brvlan10:Bridge上的其他网络设备自动加入到VLAN10中。

配置解释:主机用软件实现了一个(虚拟)交换机,上面定义了一个VLAN10。eth0.10、brvlan10和vnet0都分别接到VLAN10的Access口。eth0是一个Trunk口。VM1通过vnet0发出来的数据包都会被打上VLAN10的标签。

image-20200705110924214

虚拟交换机(Linux Bridge + VLAN)

KVM网络虚拟化总结:

  1. VLAN两层功能:交换与隔离。物理交换机存在多个VLAN,每个VLAN拥有多个端口,同一VLAN端口之间可以交换转发,不同VLAN端口之间隔离。
  2. VLAN实现隔离功能。一个VLAN母设备(eth0)不能拥有两个相同的VLAN ID子设备,也就不能出现数据交换情况。
  3. Linux Bridge实现交换功能。将同一VLAN的子设备都挂载到一个Bridge上,设备之间就可以交换数据了。

参考文章

  1. Centos8如何配置网桥

  2. nmcli命令详解

评论