秋栈博客

七月

《一》企业级CentOS 7 KVM介绍与部署

40
2022-08-11

《一》企业级CentOS 7 KVM安装教程

1、KVM介绍

1.1、虚拟化技术概述

虚拟化[Virtualization]技术最早出现在 20 世纪 60 年代的 IBM ⼤型机系统,在70年代的 System370 系列中逐渐流⾏起来,这些机器通过⼀种叫虚拟机监控器[Virtual Machine Monitor,VMM]的程序在物理硬件之上⽣成许多可以运⾏独⽴操作系统软件的虚拟机[Virtual Machine]实例。随着近年多核系统、集群、⽹格甚⾄云计算的⼴泛部署,虚拟化技术在商业应⽤上的优势⽇益体现,不仅降低了 IT 成本,⽽且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深⼊到⼈们⽇常的⼯作与⽣活中。 虚拟化是⼀个⼴义的术语,对于不同的⼈来说可能意味着不同的东⻄,这要取决他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,⽽不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产⽣了虚拟内存技术,使得应⽤程序认为其⾃身拥有连续可⽤的地址空间[Address Space],⽽实际上,应⽤程序的代码和数据可能是被分隔成多个碎⽚⻚或段),甚⾄被交换到磁盘、闪存等外部存储器上,即使物理内存不⾜,应⽤程序也能顺利执⾏。

1.2、主流虚拟化方案介绍

1.2.1、虚拟化技术主要分类

  • 平台虚拟化(Platform Virtualization):针对计算机和操作系统的虚拟化。
  • 资源虚拟化(Resource Virtualization):针对特定系统资源的虚拟化,例如:存储、带宽、内存等。
  • 应用程序虚拟化(Application Virtualization):仿真、模拟、解释技术等,例如华为eNSP模拟器。

1.2.3、平台虚拟化技术分类

我们通常所说的虚拟化主要是指平台虚拟化技术,通过使⽤控制程序(Control Program,也被称为Virtual Machine Monitor 或Hypervisor),隐藏特定计算平台的实际物理特性,为⽤户提供抽象的、统⼀的、模拟的计算环境(称为虚拟机)。虚拟机中运⾏的操作系统被称为客户机操作系统(GuestOS),运⾏虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运⾏在硬件之上(如 VMWARE 的 ESX 产品)。运⾏虚拟机的真实系统我们称之为主机系统。
操作系统虚拟化(Operating System Level Virtualization)
  • 在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其他进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。
  • 比较著名的有Solaris Container,FreeBSD Jail和OpenVZ等。
  • 例如OpenVZ:这个平台,这个平台是最便宜的VPS平台,在各个vps商哪⾥都是价格最低的。
  • OPENVZ本身运⾏在linux之上,它通过⾃⼰的虚拟化技术把⼀个服务器虚拟化成多个可以分别安装操作系统的实例,这样的每⼀个实体就是⼀个VPS,从客户的⻆度来看这就是⼀个虚拟的服务器,可以等同看做⼀台独⽴的服务器。
  • OPENVZ虚拟化出来的VPS只能安装linux操作系统,不能安装windows系统,⽐如Centos、Fedora、Gentoo、Debian等。不能安装windows操作系统是openvz的第⼀个缺点,需要使⽤windows平台的⽤户不能使用OPENVZVPS。
  • OPENVZ的第⼆个缺点是OPENVZ不是完全的虚拟化,每个VPS账户共⽤⺟机内核,不能单独修改内核。好在绝⼤多少⽤户根本不需要修改内核,所以这个缺点对多数⼈可以忽略不计。⽽这⼀点也正是openvz的优点,这⼀共⽤内核特性使得openvz的效率最⾼,超过KVM、Xen、VMware等平台。在不超售的情况下,openvz是最快速效率最⾼的VPS平台。
部分虚拟化(Partial Virtualization)
VMM 只模拟部分底层硬件,因此客户机操作系统不做修改是⽆法在虚拟机中运⾏的,其它程序可能也需要进⾏修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要⾥程碑,最早出现在第⼀代的分时系统 CTSS 和 IBM M44/44X 实验性的分⻚系统中。
全虚拟化(Full Virtualization)
  • 全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运⾏。
  • 操作系统与真实硬件之间的交互可以看成是通过⼀个预先规定的硬件接⼝进⾏的。全虚拟化 VMM 以完整模拟硬件的⽅式提供全部接⼝(同时还必须模拟特权指令的执⾏过程)。举例⽽⾔,x86 体系结构中,对于操作系统切换进程⻚表的操作,真实硬件通过提供⼀个特权CR3 寄存器来实现该接⼝,操作系统只需执⾏ "mov pgtable,%%cr3"汇编指令即可。
  • 全虚拟化 VMM 必须完整地模拟该接⼝执⾏的全过程。如果硬件不提供虚拟化的特殊⽀持,那么这个模拟过程将会⼗分复杂:⼀般⽽⾔,VMM 必须运⾏在最⾼优先级来完全控制主机系统,⽽ Guest OS 需要降级运⾏,从⽽不能执⾏特权操作。当 Guest OS 执⾏前⾯的特权汇编指令时,主机系统产⽣异常(General Protection Exception),执⾏控制权重新从 Guest OS转到 VMM ⼿中。VMM 事先分配⼀个变量作为影⼦ CR3 寄存器给 Guest OS,将 pgtable 代表的客户机物理地址(Guest Physical Address)填⼊影⼦ CR3 寄存器,然后 VMM 还需要pgtable 翻译成主机物理地址(Host Physical Address)并填⼊物理 CR3 寄存器,最后返回到 Guest OS中。随后 VMM 还将处理复杂的 Guest OS 缺⻚异常(Page Fault)。
  • ⽐较著名的全虚拟化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun VirtualBox、Parallels Desktop for Mac 和 QEMU。
超虚拟化(Hardware-Assisted Virtualization)
硬件辅助虚拟化是指借助硬件(主要是主机处理器)的⽀持来实现⾼效的全虚拟化。例如有了Intel-VT 技术的⽀持,Guest OS 和 VMM 的执⾏环境⾃动地完全隔离开来,Guest OS 有⾃⼰的""套寄存器",可以直接运⾏在最⾼级别。因此在上⾯的例⼦中,Guest OS 能够执⾏修改⻚表的汇编指令。Intel-VT 和 AMD-V 是⽬前 x86 体系结构上可⽤的两种硬件辅助虚拟化技术。

1.3、KVM虚拟化介绍

1.3.1、KVM架构

1.3.2、KVM架构解析

  1. 从rhel6开始使⽤,红帽公司直接把KVM的模块做成了内核的⼀部分。xen⽤在rhel6之前的企业版中默认内核不⽀持,需要重新安装带xen功能的内核。
  1. KVM 针对运⾏在 x86 硬件上的、驻留在内核中的虚拟化基础结构。KVM 是第⼀个成为原⽣ Linux 内核(2.6.20)的⼀部分的 hypervisor,它是由 Avi Kivity 开发和维护的,现在归 Red Hat 所有。这个 hypervisor 提供 x86 虚拟化,同时拥有到 PowerPC® 和 IA64 的通道。另外,KVM 最近还添加了对对称多处理(SMP)主机(和来宾)的⽀持,并且⽀持企业级特性,⽐如活动迁移(允许来宾操作系统在物理服务器之间迁移)。
  1. KVM 是作为内核模块实现的,因此 Linux 只要加载该模块就会成为⼀个hypervisor。KVM 为⽀持hypervisor 指令的硬件平台提供完整的虚拟化(⽐如 Intel® Virtualization Technology [Intel VT] 或AMD Virtualization [AMD-V] 产品)。KVM 还⽀持准虚拟化来宾操作系统,包括 Linux 和 Windows®。
  1. 这种技术由两个组件实现。第⼀个是可加载的 KVM 模块,当在 Linux 内核安装该模块之后,它就可以管理虚拟化硬件,并通过 /proc ⽂件系统公开其功能。第⼆个组件⽤于 PC 平台模拟,它是由修改版QEMU 提供的。QEMU 作为⽤户空间进程执⾏,并且在来宾操作系统请求⽅⾯与内核协调。
  1. 当新的操作系统在 KVM 上启动时(通过⼀个称为 KVM 的实⽤程序),它就成为宿主操作系统的⼀个进程,因此就可以像其他进程⼀样调度它。但与传统的 Linux 进程不⼀样,来宾操作系统被 hypervisor标识为处于 "来宾" 模式(独⽴于内核和⽤户模式)。
  1. 每个来宾操作系统都是通过 /dev/KVM 设备映射的,它们拥有⾃⼰的虚拟地址空间,该空间映射到主机内核的物理地址空间。如前所述,KVM 使⽤底层硬件的虚拟化⽀持来提供完整的(原⽣)虚拟化。I/O请求通过主机内核映射到在主机上(hypervisor)执⾏的 QEMU 进程。KVM 在 Linux 环境中以主机的⽅式运⾏,不过只要底层硬件虚拟化⽀持,它就能够⽀持⼤量的来宾操作系统.

2、KVM安装

2.1、环境检测

[root@10-20-30-125 ~]# grep -E '(svm|vmx)' /proc/cpuinfo | wc -l
16

[root@10-20-30-125 ~]# lscpu | grep VT
虚拟化:           VT-x
[root@10-20-30-125 ~]# lsmod | grep kvm
kvm_intel             183621  0
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm

2.2、镜像文件下载点

这里有两个我经常用的下载点
https://www.idcsmart.com/wiki_list/356.html https://www.apayun.com/doc/476.html
阿帕云的需要解压一下

2.3、清理软件包

yum remove `rpm -qa | egrep 'qemu|virt|KVM'` -y
rm -rf /var/lib/libvirt /etc/libvirt/

2.2、下载软件包

yum install *qemu* *virt* librbd1-devel -y
qemu-KVM: 主包 libvirt:API接⼝ virt-manager:图形管理程序

2.3、启动

 systemctl start libvirtd
查看KVM模块
[root@10-20-30-125 ~]# lsmod | grep kvm
kvm_intel             183621  0 
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm

3、GuestOS安装

3.1、安装cockpit

Cockpit 是红帽开发的网页版图像化服务管理工具,优点是无需中间层,且可以管理多种服务。
  • 从易用性考虑设计,方便管理人员使用,而不是仅仅的终端命令按钮化。
  • 不会打乱已有终端或脚本服务配置,通过 Cockpit 启用的服务可以在终端停止,脚本运行的错误亦会被 Cockpit 捕获。
  • 支持一次性管理多个服务,实现自动化和批处理。
yum install -y cockpit cockpit-machines cockpit-dashboard cockpit-storaged cockpit-packagekit
systemctl start cockpit

3.2、访问WEB页面

开放防火墙
[root@10-20-30-125 ~]# firewall-cmd --permanent --zone=public --add-service=cockpit
success
[root@10-20-30-125 ~]# firewall-cmd --reload
success
IP:9090
image-20220810231615018

3.3、查看支持的OS版本

[root@10-20-30-125 ~]# osinfo-query os | grep centos
 centos-stream8       | CentOS Stream 8                                    | 8        | http://centos.org/centos-stream/8       
 centos5.0            | CentOS 5.0                                         | 5.0      | http://centos.org/centos/5.0            
 centos5.1            | CentOS 5.1                                         | 5.1      | http://centos.org/centos/5.1            
 centos5.10           | CentOS 5.10                                        | 5.10     | http://centos.org/centos/5.10           
 centos5.11           | CentOS 5.11                                        | 5.11     | http://centos.org/centos/5.11           
 centos5.2            | CentOS 5.2                                         | 5.2      | http://centos.org/centos/5.2            
 centos5.3            | CentOS 5.3                                         | 5.3      | http://centos.org/centos/5.3            
 centos5.4            | CentOS 5.4                                         | 5.4      | http://centos.org/centos/5.4            
 centos5.5            | CentOS 5.5                                         | 5.5      | http://centos.org/centos/5.5            
 centos5.6            | CentOS 5.6                                         | 5.6      | http://centos.org/centos/5.6            
 centos5.7            | CentOS 5.7                                         | 5.7      | http://centos.org/centos/5.7            
 centos5.8            | CentOS 5.8                                         | 5.8      | http://centos.org/centos/5.8            
 centos5.9            | CentOS 5.9                                         | 5.9      | http://centos.org/centos/5.9            
 centos6.0            | CentOS 6.0                                         | 6.0      | http://centos.org/centos/6.0            
 centos6.1            | CentOS 6.1                                         | 6.1      | http://centos.org/centos/6.1            
 centos6.10           | CentOS 6.10                                        | 6.10     | http://centos.org/centos/6.10           
 centos6.2            | CentOS 6.2                                         | 6.2      | http://centos.org/centos/6.2            
 centos6.3            | CentOS 6.3                                         | 6.3      | http://centos.org/centos/6.3            
 centos6.4            | CentOS 6.4                                         | 6.4      | http://centos.org/centos/6.4            
 centos6.5            | CentOS 6.5                                         | 6.5      | http://centos.org/centos/6.5            
 centos6.6            | CentOS 6.6                                         | 6.6      | http://centos.org/centos/6.6            
 centos6.7            | CentOS 6.7                                         | 6.7      | http://centos.org/centos/6.7            
 centos6.8            | CentOS 6.8                                         | 6.8      | http://centos.org/centos/6.8            
 centos6.9            | CentOS 6.9                                         | 6.9      | http://centos.org/centos/6.9            
 centos7.0            | CentOS 7                                           | 7        | http://centos.org/centos/7.0            
 centos8              | CentOS 8                                           | 8        | http://centos.org/centos/8              

3.4、下载ISO模板镜像文件

默认镜像存放目录:/var/lib/libvirt/images/ 这里我们选择去华为云站点下载最小化centos7的iso镜像
https://repo.huaweicloud.com/centos/7.9.2009/isos/x86_64/
cd /var/lib/libvirt/images/
wget https://repo.huaweicloud.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso

3.5、创建kvm01

参数解释:
  • Name:虚拟机的名称
  • installation source:安装源-可以是本地可以是URL或PXE
  • storage:磁盘
  • memory:内存
选择install CentOS7后和虚拟机软件一样操作安装即可

3.6、启动kvm01

image-20220810203713623
查看虚拟机列表
[root@10-20-30-125 ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 5     kvm01                          running

3.7、安装Windows Server 2008 R2

下载镜像
https://msdn.itellyou.cn/

3.8、图形化调整虚拟机配置

  1. 将虚拟机关机
  2. 点击overview:调整CPU和内存
  3. 点击Disks:调整硬盘
image-20220810204123149

4、命令行创建虚拟机

4.1、查看虚拟机位置

[root@10-20-30-125 images]# cd /var/lib/libvirt/images/
[root@10-20-30-125 images]# ls  -l --block-size=G
总用量 3G
-rw-r--r-- 1 qemu qemu  1G 11月  3 2020 CentOS-7-x86_64-Minimal-2009.iso
-rw------- 1 root root 21G 8月  10 20:40 kvm01.qcow2
这里显示kvm01大小为20G,但实际占用只有3G不到,因为虚拟机的硬盘是模拟出来的不占用实际空间。

4.2、虚拟机镜像格式介绍

4.2.1、raw

raw格式是最简单,什么都没有,所以叫raw格式。连头文件都没有,就是一个直接给虚拟机进行读写的文件。raw不支持动态增长空间,必须一开始就指定空间大小。所以相当的耗费磁盘空间。但是对于支持稀疏文件的文件系统(如ext4)而言,这方面并不突出。ext4下默认创建的文件就是稀疏文件,所以不要做什么额外的工作。用
du -sh 文件名
可以查看文件的实际大小。也就是说,不管磁盘空间有多大,运行下面的指令没有任何问题:
qemu-img create -f raw test.img 10000G
raw镜像格式是虚拟机种I/O性能最好的一种格式,大家在使用时都会和raw进行参照,性能越接近raw的越好。但是raw没有任何其他功能。对于稀疏文件的出现,像qcow这一类的运行时分配空间的镜像就没有任何优势了。

4.2.2、cow

cow格式和raw一样简单,也是创建时分配所有空间,但cow有一个bitmap表记录当前哪些扇区被使用,所以cow可以使用增量镜像,也就是说可以对其做外部快照。但cow也没有其他功能,其特点就是简单。

4.2.3、qcow

qcow在cow的基础上增加了动态增加文件大小的功能,并且支持加密,压缩。qcow通过2级索引表来管理整个镜像的空间分配,其中第二级的索引用了内存cache技术,需要查找动作,这方面导致性能的损失。qcow现在基本不用,一方面其优化和功能没有qcow2好,另一方面,读写性能又没有cow和raw好。

4.2.4、qcow2

qcow2是集各种技术为一体的超级镜像格式,支持内部快照,加密,压缩等一系列功能,访问性能也在不断提高。但qcow2的问题就是过于臃肿,把什么功能都集于一身。

4.3、命令行创建GuestOS

纯命令方式:了解即可,实际生产中并不会使用到 ⽤这种⽅式安装的操作系统,⼤⼩写会胡乱变化,不影响远程操作
#virt-install --connect qemu:///system -n vm6 -r 512 --disk
path=/virhost/vmware/vm6.img,size=7 --os-type=linux --os-variant=rhel6 --
vcpus=1 --network bridge=br0 --location=http://br0的ip/rhel6u4 -x
console=ttyS0 --nographics
#virt-install --connect qemu:///system -n vm9 -r 2048 --disk
path=/var/lib/libvirt/images/vm9.img,size=7 --os-type=linux --osvariant=centos7.0 --vcpus=1 --location=ftp://IP/centos7u3 -x
console=ttyS0 --nographics
参数解释
  • qemu:///system:链接系统
  • -n:主机名
  • -r 2048:以M为单位分配内存
  • disk path:虚拟机存放位置
  • size:磁盘大小
  • --os-type:系统类型(centos-x版本都为centos7.0)
  • -x console:分配终端
  • nographics:无图形化
可以使用man virth-install查看命令手册

4.4、虚拟机的组成部分

  1. 虚拟机的配置文件:/etc/libvirt/qemu/xxx.xml
  2. 存储虚拟机的介质:/var/lib/libvirt/images/xxx.qcow2
移动到虚拟机配置目录:/etc/libvirt/qemu
[root@10-20-30-125 ~]# cd /etc/libvirt/qemu
[root@10-20-30-125 qemu]# ls
kvm01.xml  networks
  1. 拷贝虚拟机镜像文件
    [root@10-20-30-125 images]# cd /etc/libvirt/qemu
    [root@10-20-30-125 qemu]# ls
    kvm01.xml  kvm02.xml  networks
    [root@10-20-30-125 qemu]# cd /var/lib/libvirt/images/
    [root@10-20-30-125 images]# ls
    CentOS-7-x86_64-Minimal-2009.iso  kvm01.qcow2  kvm02.qcow2
    [root@10-20-30-125 images]# cp -v kvm01.qcow2 kvm03.qcow2
    "kvm01.qcow2" -> "kvm03.qcow2"
    [root@10-20-30-125 images]# ll
    总用量 12516924
    -rw-r--r-- 1 qemu qemu  1020264448 11月  3 2020 CentOS-7-x86_64-Minimal-2009.iso
    -rw------- 1 qemu qemu 21478375424 8月  10 20:40 kvm01.qcow2
    -rw------- 1 qemu qemu 21478375424 8月  11 00:01 kvm02.qcow2
    -rw------- 1 root root 21478375424 8月  11 00:01 kvm03.qcow22
    
  2. 拷贝虚拟机配置文件
    [root@10-20-30-125 images]# cd /etc/libvirt/qemu
    [root@10-20-30-125 qemu]# ls
    kvm01.xml  kvm02.xml  networks
    [root@10-20-30-125 qemu]# cp kvm01.xml kvm03.xml
    [root@10-20-30-125 qemu]# ll
    总用量 24
    -rw------- 1 root root 5469 8月  10 20:42 kvm01.xml
    -rw------- 1 root root 5314 8月  10 23:36 kvm02.xml
    -rw------- 1 root root 5469 8月  11 00:03 kvm03.xml
    drwx------ 3 root root   42 8月  10 15:40 networks
    
  3. 修改配置文件中必须修改的内容
[root@10-20-30-125 qemu]# vim /etc/libvirt/qemu/kvm03.xml



	#虚拟机名称:需要修改
  kvm03
  #需要修改:唯一uuid,一样会冲突
  7c6c6c79-8bcc-4178-a483-d0dc6f985456
  
    
      false
      file
      /var/lib/libvirt/images/CentOS-7-x86_64-Minimal-2009.iso
      centos7.0
    
  
  #内存:自定义
  1048576
  1048576
  1
  
    /machine
  
  
    hvm
    
    
  
  
    
    
  
  
    Nehalem-IBRS
    
    
    
    
  
  
    
    
    
  
  destroy
  destroy
  destroy
  
    
    
  
  
    /usr/libexec/qemu-kvm
    
      
      #磁盘文件名:必须修改
      
      
      
#需要修改!修改后三段即可(某一段的某个值即可)。
/dev/urandom
  1. 创建虚拟机
[root@10-20-30-125 ~]# virsh define /etc/libvirt/qemu/kvm03.xml
定义域 kvm03(从 /etc/libvirt/qemu/kvm03.xml)
  1. 重启libvirtd
systemctl restart libvirtd
  1. 宿主机开启路由转发
[root@10-20-30-125 ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@10-20-30-125 ~]# sysctl -p
net.ipv4.ip_forward = 1

5、进入WEB面板

5.1、查看面板新增的虚拟机

启动kvm03
查看虚拟机IP:此时都已通过DHCP获取到了独立的IP
kvm01: kvm03:

6、查看磁盘分区信息

[root@10-20-30-125 ~]# virt-df -h -d kvm01
文件系统                            大小 已用空间 可用空间 使用百分比%
kvm01:/dev/sda1                          1014M       105M       909M   11%
kvm01:/dev/centos/root                     17G       1.2G        16G    8%
[root@10-20-30-125 ~]# virt-df -h -d kvm03
文件系统                            大小 已用空间 可用空间 使用百分比%
kvm03:/dev/sda1                          1014M       105M       909M   11%
kvm03:/dev/centos/root                     17G       1.2G        16G    8%
[root@10-20-30-125 ~]# virt-df -h -d kvm02
文件系统                            大小 已用空间 可用空间 使用百分比%
kvm02:/dev/sdb                            3.0G       3.0G          0  100%
kvm02:/dev/sda1                           100M        24M        76M   25%
kvm02:/dev/sda2                            20G       8.6G        11G   44%
 

#可能出现的问题

1、安装系统时卡住不动

升级系统,若升级后还是不行,需要在安装宿主机的时候安装兼容性程序。
yum upgrade -y
检查是否安装工具包
[root@10-20-30-125 ~]# yum list | grep kvm
libvirt-daemon-kvm.x86_64                 4.5.0-36.el7_9.5             @updates
oci-kvm-hook.x86_64                       0.3-1.el7                    @epel
qemu-kvm.x86_64                           10:1.5.3-175.el7_9.6         @updates
qemu-kvm-common.x86_64                    10:1.5.3-175.el7_9.6         @updates
qemu-kvm-tools.x86_64                     10:1.5.3-175.el7_9.6         @updates
qemu-kvm-common-ev.x86_64                 10:2.12.0-44.1.el7_8.1       centos-qemu-ev
qemu-kvm-ev.x86_64                        10:2.12.0-44.1.el7_8.1       centos-qemu-ev
qemu-kvm-tools-ev.x86_64                  10:2.12.0-44.1.el7_8.1       centos-qemu-ev
 
  • 0