KVM一些底层原理
CPU虚拟化
利用命令查看CPU是否支持KVM虚拟化
输出带有vmx或svm,就说明当前CPU支持KVM
$ egrep -o '(vmx|svm)' /proc/cpuinfo
一个KVM虚拟机就是主机中一个qemu-kvm进程
虚拟机中的每一个虚拟vCPU对应qemu-kvm进程中的一个进程
从上图可以看到,主机有两个物理CPU,有两个虚拟机vm1和vm2。vm1有2个vCPU,vm2有4个vCPU,所有vm1有2个线程,vm2有4个线程在两个物理CPU上调度。
注:虚拟机的vCPU总数可以超过物理CPU数量(CPU overcommit)。这样虚拟机可以充分利用宿主机的CPU资源,前提是所有虚拟机不能在同一时刻都满负荷运行。
内存虚拟化
KVM通过内存虚拟机共享物理系统内存,动态分配给虚拟机。
为了能够在一台主机上运行多个虚拟机。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文件,可以查看其默认位置)
Volume就是该目录下的文件,一个文件就是一个Volume。
文件cirros***.img就是一个Volume。从KVM1视角来看,就是启动磁盘。
为kvm1添加新的磁盘
新的磁盘信息
使用文件做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
Step2:创建Storage Pool定义文件Host.xml
Step3:通过virsh命令创建新的Storage Pool “HostVG”并启动HostVG
Step4:在Virt-manager中为虚拟机KVM1添加LV的虚拟磁盘
Step5:查看主机上多出来的LV
其他类型的Storage Pool
KVM 还支持 iSCSI,Ceph 等多种类型的 Storage Pool。目前使用最多的就是目录类型。
网络虚拟化
网络虚拟化中两个最重要的东西:Linux Bridge和VLAN。
Linux Bridge
假设主机有1块与外网连接的物理网卡eth0,如何让vm1能够访问外网?
方案一:直接将物理网卡分配给vm1。但是主机和vm2没有网卡,就不能访问外网了。
方案二:利用Linux Bridge作为中间模块,将eth0与vnet0连接起来。
KVM环境下实现Linux Bridge
Step1:配置Linux Bridge br0)(网桥)
Step1-1:查看网络脚本目录,只有以太网卡eth0的配置
Step1-2:查看以太网卡ifcfg-eth0的内容
Step1-3:查看当前连接
Step1-4:新建网桥br0并查看ifcfg-br0
Step1-5:查看当前连接
Step1-6:将网桥br0桥接至eth0并查看刚生成的ifcfg-bridge-slave-eth0文件
Step1-7:查看当前连接
Step1-8:关闭eth0,打开网桥br,查看当前连接
Step2:配置VM1
Step2-2:查看VM1 IP地址以及是否能访问外网
Step2-3:查看VM2 IP地址以及是否能访问VM1和外网
理解virbr0
virbr0是KVM默认创建的一个Bridge,作用是为连接其上的虚拟机网卡提供NAT外网的功能。
virbr0默认分配了一个IP 192.16.8.122.1,并为连接其他虚拟网卡提供DHCP服务。
virbr0使用dnsmasq提供DHCP服务,可以在祖籍中查看该进程信息
可以通过ssh连接VM1,VM2同理
注:使用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中。
交换机的端口有两种配置模式:Access和Trunk。
Access口:端口打上VLAN标签,表明该端口属于哪个VLAN。利用VLAN ID来区分。Access口都是直接与计算机网卡相连,这样从该网卡出来的数据包流入Access口就被打上VLAN标签。
Trunk口:交换机A、B中都有不同标签的VLAN,利用trunk口将其相连。
KVM环境下实现VLAN(未成功)
Brvlan10:Bridge上的其他网络设备自动加入到VLAN10中。
配置解释:主机用软件实现了一个(虚拟)交换机,上面定义了一个VLAN10。eth0.10、brvlan10和vnet0都分别接到VLAN10的Access口。eth0是一个Trunk口。VM1通过vnet0发出来的数据包都会被打上VLAN10的标签。
虚拟交换机(Linux Bridge + VLAN)
KVM网络虚拟化总结:
- VLAN两层功能:交换与隔离。物理交换机存在多个VLAN,每个VLAN拥有多个端口,同一VLAN端口之间可以交换转发,不同VLAN端口之间隔离。
- VLAN实现隔离功能。一个VLAN母设备(eth0)不能拥有两个相同的VLAN ID子设备,也就不能出现数据交换情况。
- Linux Bridge实现交换功能。将同一VLAN的子设备都挂载到一个Bridge上,设备之间就可以交换数据了。