
KVM基础(一)
Linux 虚拟化技术基础- KVM
一、 虚拟化
1.1 什么是虚拟化
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
例如:vmware workstation ,XEN, hyper-v ,KVM,EXSI
总结一句话:虚拟化技术指的是将物理的资源抽象化,并将抽象后的资源按需分配,提高IT资源的利用率。
1.1.2 虚拟化技术的分类
1.1.2.1 从资源提供的角度来分类
1)、平台虚拟化
如果把x86平台的CPU,内存和外设做为资源,那对应的虚拟化技术就是平台虚拟化,在同一个x86平台上面,可以虚拟多个x86平台,每个平台可以运行自己独立完整的操作系统。
例如:QEMU.KVM,XEN Server,EXSi,Hyper-V等所管理的虚拟机
2)、操作系统虛拟化
如果把操作系统及其提供的系统调用作为资源,那虚拟化就表现为操作系统虚拟化,例如Linux容器虚拟化技术,就是在司一个Linux操作系统之上,虛拟出多个同样的操作系统,每个应用程序认为自己运行在一个独立的OS。
例如:LXC或Docker,podman,container等所管理的容器
1.1.2.2 从hypervisor技术的角度分类
先了解一下Hypervisor是什么?
Hypervisor一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。
Hypervisor是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisor不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。
I型:虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机"型
裸机型在虚拟化中Hypervisor直接管理调用硬件资源,不需要底层操作系统,也可以将Hypervisor看作一个很薄的操作系统。这种方案的性能处于主机虛拟化与操作系统虛拟化之间。

II型:虚拟机运行在传统操作系统(HOST OS)上,同样创建的是硬件全仿真实例,被称为"“托管(宿主)"型。托管型/主机型Hypervisor运行在基础操作系统上,构建出一整套虛拟硬件平台 ( CPU/Memory/Storage/Adapter )使用者根据需要安装新的操作系统和应用软件,底层和上层的操作系统可以完全无关化,如Windows运行Linux操作系统。主机虚拟化中VM的应用程序调用硬件资源时需要经过内核->Hypervisor->主机内核,因此相对来说,是三种虚拟化技术中最差的。

III型:虚拟机运行在传统操作系统上,创建一个独立的虛拟化实例(容器),指向底层托管操作系统,被称为'操作系统虚拟化”。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最少。但是缺点是底层和上层必须使用同一种操作系統,如底层操作系統运行的是Windows系统,则VPS就必须运行Windows

1.1.2.3 虚拟机和容器的对比
1.2 KVM
KVM 即 Kernel-based Virtual Machine 基于内核的虚拟机。
kvm是红帽公司5.4(kernel 2.6.20)版本后所推出的最新虚拟化技术产品(内核模块)。它和vpc,virtual box都属于完全虚拟化产品,而Xen是属于半虚拟化产品。虽说kvm是完全虚拟化,但在关键的硬盘和网卡上支持半虚拟化virtio,在很大程度上提高了性能,kvm是轻量级虚拟化的代表,也需要硬件vt技术的支持,另外从操作界面上看,xen和kvm都是用virt-manager工具,差别不是很大,但不可以在同一台机器上同时安装且运行Xen和KVM;另外kvm在只能运行在红帽企业版64位系统上,同时需要关闭selinux。KVM是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。增加 KVM 到 Linux 内核是Linux 发展的一个重要里程碑,这也是第一个整合到 Linux 主线内核的虚拟化技术。
KVM所使用的方法是通过简单地加载内核模块而将Linux 内核转换为一个系统管理程序。这个内核模块导出了一个名为 /dev/kvm 的设备,它可以启用内核的客户模式(除了传统的内核模式和用户模式)。有了 /dev/kvm 设备,VM 使自己的地址空间独立于内核或运行着的任何其他 VM 的地址空间。设备树(/dev)中的设备对于所有用户空间进程来说都是通用的。但是每个打开 /dev/kvm 的进程看到的是不同的映射(为了支持 VM 间的隔离)。KVM安装 KVM 之后,您可以在用户空间启动客户操作系统。每个客户操作系统都是主机操作系统(或系统管理程序)的一个单个进程
1.2.1 KVM虚拟机的管理工具:QEMU
软件模拟虛拟化、可以模拟多种硬件,包括X86架构处理、AMD64架构处理、ARM、SPARC 与 PowerPC架构等。效率低,一般用于研充测试场景。此处使用QEMU的主要目的是为了方便管理KVM虚拟机镜像文件
注:
QEMU由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,通过一个特殊的”重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。
准确来说,KVM仅是Linux 内核中的一个模块。管理和创建完的 KVM 虚拟机,需要更多的辅助工具。
QEMU-KVM:在 Linux 系统中,首先我们可以用 modprobe 命令加载 KVM 模块,如果用 RPM 安装 KVM 软件包,系统会在启动时自动加载模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有 KVM 模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。关于用户空间的工具,KVM 的开发者选择了已经成型的开源虚拟化软件 QEMU。QEMU 是一个强大的虚拟化软件,它可以虚拟不同的 CPU 构架。比如说在 x86 的 CPU 上虚拟一个Power的CPU,并利用它编译出可运行在 Power 上的程序。KVM使用了QEMU的基于 x86 的部分,并稍加改造,形成可控制 KVM 内核模块的用户空间工具QEMU-KVM。所以 Linux 发行版中分为 内核部分的 KVM 内核模块和 QEMU-KVM 工具。这就是 KVM 和 QEMU 的关系。
总结:
KVM负责模拟CPU,内存等资源,QEMU负载各类IO设备的模拟
1.2.2 libvirt
libvirt 是一个管理 hypervisor 的上层软件,它通过不同的驱动统一管理不同类型的 hypervisor ,并对外提供统一、稳定的应用程序接口。
在云场景中,业内广泛使用 libvirt 管理大规模的虚拟机。用户可以通过 libvirt 对应的 XML 文件描述一个虚拟机,包括虚拟机名称、CPU、磁盘等。
libvirt是目前使用最为广泛的对kvm虚拟机进行管理的工具和应用程序接口,而且一些常用的虚拟机管理工具(如virsh,virt-install,virt-manager等)和云计算框架平台(QpenStack,OpenNebula,Eucalyptus等)都在底层使用libvirt的应用程序接口。
尽管libvirt项目最初是为Xen支持也是非常得好,libvirt支持多种虚拟化方案,即支持包括KVM,QEMU,Xen,VMware,VirtualBox等在内的平台虚拟化方案,又支持QpenVZ,LXC等linux容器虚拟化系统,还支持用户态linux(UML)的虚拟化。
libvirt的作用:
1、它提供统一、稳定、开放的源代码的应用程序接口(API)、守护进程 (libvirtd)和和一个默认命令行管理工具(virsh)。
2、它提供了对虚拟化客户机和它的虚拟化设备、网络和存储的管理。
3、它提供了一套较为稳定的C语言应用程序接口。目前,在其他一些流行的编程语言中也提供了对libvirt的绑定,在Python、Perl、Java、Ruby、PHP、OCaml等高级编程语言中已经有libvirt的程序库可以直接使用。
4、它对多种不同的 Hypervisor 的支持是通过一种基于驱动程序的架构来实现的。libvirt 对不同的 Hypervisor 提供了不同的驱动,包括 Xen 的驱动,对QEMU/KVM 有 QEMU 驱动,VMware 驱动等。在 libvirt 源代码中,可以很容易找到 qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c 这样的驱动程序源代码文件。
5、它作为中间适配层,让底层 Hypervisor 对上层用户空间的管理工具是可以做到完全透明的,因为 libvirt 屏蔽了底层各种 Hypervisor 的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。
6、它使用 XML 来定义各种虚拟机相关的受管理对象。
主要提供的功能:
1、虚拟机生命周期管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU。
2、本地&&远程访问:通过在本地运行libvirt daemon,本机和远程机器,都可以访问并使用libvirt的功能。远程一般通过简单配置SSH即可。
3、存储管理:除了虚拟机管理,任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享等。
4、虚拟网络管理:可以用来管理和创建虚拟网络,管理物理和逻辑的网络接口。
1.2.3 配置 KVM 结构拓扑图:
1)、把虚拟机内存调成 2G 以上,因为我们要在 VMware 虚拟中安装 KVM,然后在 KVM 中再安装虚拟机
2)、开启 vmware 中虚拟化支持,大家安装 KVM 时,只需要把这个打上对勾。
注: 只有 64 位 RHEL6 以上系统支持 KVM。 32 位系统不支持。
3)、查看 CPU 是否支持硬件虚拟化技术。 CPU 要支持
查看自己的 CPU 是否支持全虚拟化虚拟化技术且是 64 位的
Intel:cat /proc/cpuinfo | grep --color vmx
AMD :cat /proc/cpuinfo | grep --color svm
看看 flag 有没有上面的 vmx 戒者是 svm,有的话就是支持全虚拟化技术
4)、开启 BIOS 虚拟化支持。 查找 VT 改为: enable 。BIOS 中也要打开,默认很多机器没有打开。
查看 CPU 是否支持虚拟化
Intel 酷睿 i7 12700参数
https://detail.zol.com.cn/1395/1394648/param.shtml
AMD Ryzen 5 5600G
https://g.pconline.com.cn/product/cpu/amd/1379967_detail.html
例 : 排错:
安装虚拟机出现 intel vt -x 处于禁用状态,打开 处理方式
处理方式
4.1) 进 入 bios
以华硕主板为例:
步骤: 进入高级模式---进入高级菜单---开启 intel 虚拟技术
情况 2: 传统的BIOS界面,找到这个
F10 保存退出。
4.2)、操作系统必须是 RHEL6 64 位以上的系统
1.2.4 各虚拟化产品的对比
KVM: 是基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。是第一个整合到 Linux 内核的虚拟化技术。在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。
一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己的内核和用户模式)
XEN :需要升级内核,只能支持和物理机系统一样的操作系统。 xen 虚拟上可以运行 windows , KVM: 支持 linux 以外的其它系统。比如:windows
QEMU:是一套由 Fabrice Bellard 所编写的以 [GPL]许可证分发源码的模拟处理器,在 [GNU/Linux ]平台上使用广泛。QEMU 具有高速度和跨平台的特性,QEMU 能模拟至接近真实电脑的速度。
QEMU 能模拟整个电脑系统,包括[中央处理器]及其他周边设备。QEMU 和 vmware 一样都是支持仿真虚拟化,效率比较低。
二、 安装 KVM 虚拟机
2.1 开机后查看 CPU 是否支持全虚拟化
2.1.1 查看 CPU 是否支持硬件虚拟化技术
查看自己的 CPU 是否支持全虚拟化虚拟化技术且是 64 位的
Intel:cat /proc/cpuinfo | grep --color vmx
AMD :cat /proc/cpuinfo | grep --color svm
看看 flag 有没有上面的 vmx 戒者是 svm,有的话就是支持全虚拟化技术
[root@hopu Desktop]# cat /proc/cpuinfo | grep --color vmx
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq vmx ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes xsave avx hypervisor lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi ept vpid
如果没有看到vmx,是因为 VMware CPU 没有开启 VT 技术
2.2 安装 KVM
注意: 关闭防火墙,关闭selinux
2.2.1 安装 KVM
[root@localhost ~]# yum install -y libvirt bridge-utils virt-manager qemu-kvm-tools qemu-kvm virt-viewer virt-v2v libguestfs-tools virt-install
[root@localhost ~]# rpm –qa|grep –E 'qemu|libvirt|virt' #查看装了哪些包
# 安装软件包说明:
libvirt-client #是libvirt的客户端,最重要的功能之一就是在宿主机关机时可以通知虚拟机也关机,使虚拟机系统正常关机,而不是被强制关机,导致数据丢失
libvirt-python #是libvirt为Python提供的API
python-virtinst #是一套python的虚拟机安装工具
qemu-kvm #是KVM在用户空间运行的程序
virt-manager #是基于libvirt的图形化虚拟机管理软件
libvirt #是用于管理虚拟机,它提供了一套虚拟机操作API,可以使用virsh等命令
virt-viewer #用于虚拟机的控制台的console
virt-top #用于类似于top命令,查看虚拟机的资源使用情况
virt-what #在虚拟机内部执行,查看虚拟机运行的虚拟化平台
qemu-img #用于操作虚拟机硬盘镜像的创建、查看和格式化
bridge-utils #安装网络支持,设置桥接
kvm软件包包含有kvm内核模块,它可以默认Linux内核中提供kvm管理程序
说明:
qemu-kvm : kvm 主程序, KVM 虚拟化模块virt-manager: KVM 图形化管理工具
libvirt: 虚拟化服务
virt-install : 安装虚拟机的实用工具 。比如 virt-clone 克隆工具就是这个包安装的
2.2.2 查看安装完kvm后的服务:
[root@hopu ~]# systemctl enable --now libvirtd #启动libvirtd 服务并设置开机启动
2.2.3 确定正确加载 kvm 模块
[root@localhost ~]# modprobe kvm
[root@localhost ~]# lsmod | grep kvm
kvm_intel 282624 0
kvm 667648 1 kvm_intel
irqbypass 16384 1 kvm
2.3 使用命令:virt-manager 建立虚拟机
将 kvm 管理工具从英文界面,切换成中文界面:
[root@hopu ~]# echo $LANG #查看当前的字符集
en_US.UTF-8
[root@hopu ~]# LANG='zh_CN.UTF-8' #临时设置字符集
[root@localhost ~]# cat /etc/locale.conf #永久性的修改
LANG="zh_CN.UTF-8"
解决中文乱码问题:
[root@hopu ~]# yum groupinstall -y "Fonts"
2.3.1 安装linux虚拟机
注意:图形化支持需要安装xmanager
(1)、执行 virt-manager 后,弹出如下界面:
2)、点击文件---新建虚拟机,进入虚拟机创建界面
3)默认提供4种安装方式,点击本地安装介质(ISO光盘)
注意:提前将你的镜像上传到宿主机中
选择使用ISO镜像
4)、选择 “本地浏览”,找到你存放镜像的位置,双击确定
5)配置保持默认,后面我们需要自定义
6)选择存储位置
7)设置虚拟机名字(域名),并进入自定义配置
8)设置CPU配置
9)设置内存信息
10)设置磁盘驱动类型为:virtio(半虚拟化驱动)
11)设置网卡的驱动也是virtio
12)设置VNC连接方式,并设置键盘映射为en-us
注意:未截图配置项保存默认即可,接下来点击“开始安装”
安装过程和我们正常安装系统一致。此处忽略。。。。
2.3.2 安装windows虚拟机(全虚拟化驱动)
1)执行virt-manager,点击创建新虚拟机,选择本地安装
2)选择ISO镜像
3)默认配置,后面自定义
4)设置存储空间,注意,不能超过宿主机的空间大小
选择其他的存储池来分配空间
5)自定义CPU配置
6)自定义内存配置
7)、磁盘自定义配置
8)网卡配置,不要virtio类型,否则无法连接网络
9)设置VNC连接
10)开始安装
2.3.3 安装windows虚拟机(半虚拟化驱动)
默认windows不支持半虚拟化驱动,仅支持全虚拟化驱动,如果设置半虚拟化驱动,会出现无法识别硬盘和网卡,也无法做内存气球等高级设置,但是linux默认支持半虚拟化驱动,因此不需要修改操作系统的底层驱动
windows操作系统半虚拟化驱动下载地址:
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/
该半虚拟化驱动由redhat来提供支持
1)执行virt-manager,点击创建新虚拟机,选择本地安装
2)选择ISO镜像
3)默认配置,后面自定义
4)自定义CPU配置项
5)自定义内存选项
6)磁盘驱动选择
注意:如果选择virtio,会出现系统无法识别硬盘的问题。
7)网卡驱动选择
8)VNC配置
9)开始安装
10)虽然找不到任何的存储设备,但是我们惊喜的发现给我们提供了一个加载驱动程序的功能,我们可以利用此接口来修改操作系统的底层驱动,接下来你要做的就是强制关闭虚拟机!
11)关闭虚拟机,添加一个新的cd-rom设备
12)将我们从官方下载的半虚拟化驱动放置在CDROM2设备里
13)调整引导顺序,开启虚拟机,继续刚才的操作。
选择windows2008R2的驱动后,进行下一步
14)继续安装完成。
15)进入系统,网卡无配置文件
16)安装windows虚拟机的半虚拟化驱动和PCI驱动
计算机---》属性---》设备管理器
17)浏览驱动文件
18)动态调整CPU的核心数,可以实现动态增容
但是无法实现动态的缩减核心,需要重启服务器
19)配置内存气球
内存气球的作用主要是可以动态的去调整内存的量的大小,以满足不同场景下业务对内存大小的需求。
在KVM中将内存从4096M调整到2048M,发现没有作用
配置内存气球的PCI驱动
再次测试“内存气球”的配置,调整内存大小为2048M测试
虚拟机中查看内存当量
内存调整到4096M,虚拟机中已经识别
可以实现动态的内存调整,简称“内存气球”
2.4 通过virt-install安装虚拟机
2.4.1 安装linux虚拟机
[root@localhost data]# virt-install --name=centos7.9-3 --vcpus=2 --ram=2048 --arch=x86_64 --os-type=linux --os-variant=rhel7 --graphics vnc,listen=0.0.0.0,port=5910,keymap=en-us --disk path=/data/centos7.9-3.img,size=10,format=qcow2 --cdrom=/data/soft/CentOS-7-x86_64-Minimal-2009.iso --bridge=virbr0 --accelerate
此方法安装还可以配合pxe+kickstart来完成无人值守安装(提前安装)
命令说明:
常用选项:
-n NAME, --name=NAME 指定 Guest名字
-r MEMORY, --ram=MEMORY 指定内存大小
--maxmemory 指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源
--vcpus=VCPUS 指定虚拟机的 CPU 数量
--maxvcpus 指定可调节的最大CPU核心数量
--disk 指定虚拟机磁盘存储文件的路径
–os-type 指定虚拟机安装的操作系统类型
–os-variant 指定系统的发行版本
–console 定义终端的属性,target_type 则是定义终端的类型
size=10 定虚拟磁盘的大小,单位是 G;
例:--disk path=/var/lib/libvirt/images/centos-72.img,size=10
--accelerate KVM 或 KQEMU 内核加速器,这个选项默认是添加的。另外,如果系统 KVM 和 KQEMU加速器都支持,优先使用 KVM 加速器。
-c CDROM, --cdrom=CDROM 指定用于全虚拟化 Guest 的虚拟光驱, --cdrom=后指定 ISO或 CDROM 像。
--network 指定虚拟机的网卡模式。如:--network bridge=br0
–location 指定ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL
2.4.2 virt-install安装示例
案例1:
[root@localhost ~]# virt-install \
--name centos7u9-2 \
--graphics vnc,listen=0.0.0.0,port=5930,keymap=en_us \
--noautoconsole \
--memory 1024 \
--vcpus=1 \
--arch=x86_64 \
--os-type=linux \
--os-variant=rhel7 \
--disk path=/data/centos7u9-2.img,size=10,format=qcow2 \
--bridge=virbr0 \
--cdrom=/data/CentOS-7-x86_64-Minimal-2009.iso
案例2:
[root@localhost ~]# virt-install \
--name centos7u9-3 \
--memory 1024 \
--vcpus=1 \
--arch=x86_64 \
--os-type=linux \
--os-variant=rhel7 \
--disk path=/data/centos7u9-3.img,size=8,format=qcow2 \
--bridge=virbr0 \
--cdrom=/data/CentOS-7-x86_64-Minimal-2009.iso
案例3:
[root@localhost ~]#virt-install \
--name centos7u9-4 \
--memory 1024,maxmemory=2048 \
--vcpus 1,maxvcpus=4 \
--os-type=linux \
--cdrom=/data/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/data/centos7u9-4.img,size=10,format=qcow2 \
--network bridge=virbr0 \
--vnc \
--vncport=5950 \
--vnclisten=0.0.0.0 自动启动kvm虚拟机
案例4
[root@localhost ~]# virt-install \
--name windows2k8 \
--graphics vnc,listen=0.0.0.0,port=5940,keymap=en_us \
--memory 2048 \
--vcpus=4 \
--disk path=/data/windows2k8.img, size=50,format=qcow2 \
--bridge=virbr0
--cdrom=/data/cn_windows_server_2008_r2_standard_enterprise_datacenter_web_x64_dvd_x15-50360.iso
案例5:
[root@localhost ~]# virt-install \
--name windows2008 \
--memory 1024,maxmemory=4096 \
--vcpus 1,maxvcpus=4 \
--os-type=windows \
--cdrom=/data/cn_windows_server_2008_r2_standard_enterprise_datacenter_web_x64_dvd_x15-50360.iso \
--disk path=/data/virtio-win_amd64.vfd,device=floppy \
--disk path=/data/windows2008.img,format=qcow2,size=40,bus=virtio \
--network bridge=virbr0,model=virtio \
--vnc \
--vncport=5960 \
--vnclisten=0.0.0.0 \
--autostart
- 感谢你赐予我前进的力量