Bootstrap

KVM虚拟化技术介绍

文章目录

前言

 一.虚拟化概述

虚拟化特点 

 虚拟化优势

内存虚拟化

CPU 虚拟化 

I/O流虚拟化 

 二.KVM概述

QEMU工作原理 

三.KVM部署

​编辑

KVM-Virsh日常管理命令

 KVM-Console登录

 KVM-磁盘管理

KVM-快照管理 

KVM-虚拟机克隆

KVM 桥接网络 


前言

虚拟化技术是云计算的基础,什么是虚拟化?虚拟化技术的本质是什么?主流的虚拟化技术有哪些?本章将为您揭晓


 一.虚拟化概述

虚拟化是一种将计算机资源(例如cpu、内存、存储等)进行抽象和隔离的技术。它可以将一台物理计算机划分为多个虚拟计算机,每个虚拟计算机可以运行独立的操作系统和应用程序。

虚拟化特点 

特点概述
分区虚拟化层为每个虚拟机划分服务器资源,每个虚拟机可以运行单独的操作系统且每个操作系统只能看到虚拟化层为其提供的“虚拟硬件(虚拟网卡,cpu,内存等)”,使得操作系统认为运行在自己的专用服务器上。
隔离

每台虚拟机互相隔离,单台虚拟机中毒或崩溃不会影响其它虚拟机;

虚拟化环境通常涉及共享物理资源,如CPU、内存和存储。可以为每台虚拟机指定最大或最小资源,防止一个虚拟机消耗过多资源导致其他虚拟机性能下降。

封装虚拟化技术将虚拟单元的所有环境存放在一个单独的文件中,这种封装性使得整个磁盘分区被存储为一个文件,从而易于备份、转移和拷贝
相对于硬件独立虚拟机只能看见虚拟层为其提供的虚拟硬件,而虚拟硬件与物理硬件相互独立

 虚拟化优势

利用虚拟化技术可以防止资源浪费,同时虚拟机的隔离性可以防止多个服务安装在同一个操作系统中时,操作系统出问题,所有服务都会出问题,此外虚拟化的克隆,快照功能使得备份更加容易。

内存虚拟化

内存虚拟化将物理内存抽象成虚拟地址空间,使得每个虚拟机(VM)拥有独立的、连续的内存地址空间。

Hypervisor维护了一个地址映射表(页表),用于记录虚拟地址(HPA)到物理地址(GPA)的映射关系。当虚拟机中的程序需要执行时,它首先会被加载到虚拟机的虚拟内存中,然后被映射到物理内存中。

CPU 虚拟化 

CPU虚拟化允许单个物理CPU模拟出多个虚拟CPU(vCPU),同时在物理CPU和虚拟机之间引入一个虚拟机管理程序(Hypervisor),每个虚拟机被分配至少一个vCPU,这些vCPU由Hypervisor映射到物理CPU上。

在理想情况下,每个物理线程可以被映射为一个vCPU。因此,对于一颗8核双线程CPU,其理论上可以映射出16个vCPU(8个核心 x 2个线程/核心 = 16个线程/vCPU)

当虚拟机运行程序时,虚拟CPU会生成内存地址,虚拟CPU通过地址总线发送该内存地址到内存芯片,内存芯片根据该内存地址找到存储程序的存储单元,存储单元通过地址总线返回给虚拟CPU,而Hypervisor将虚拟内存地转换为物理内存地址,vCPU执行物理存储单元返回的程序。

I/O流虚拟化 

Hypervisor在物理硬件上抽象出一个虚拟化层,这个虚拟化层负责将物理设备(如键盘)抽象成多个虚拟设备,供多个虚拟机共享。对于键盘等输入设备,VMM会截获虚拟机对设备的访问请求,并进行相应的处理和模拟,以确保输入数据能够正确地传递给虚拟机。

  1. 输入切换机制

    • 在使用物理机键盘对虚拟机进行输入时,需要在物理机和虚拟机之间进行输入切换。这通常通过特定的按键组合(如Ctrl+Alt)或鼠标点击来实现。
    • 当输入对象切换到虚拟机时,所有键盘输入都会被虚拟机捕获并处理;当输入对象切换回物理机时,键盘输入则会被物理机捕获。
  2. 中断处理与数据传输

    • 当虚拟机接收到键盘输入时,会产生中断信号。VMM负责截获这些中断信号,并将其转发给虚拟机中的设备模拟器(如QEMU)。
    • 设备模拟器或驱动程序会处理这些输入数据,并将其传递给虚拟机中的应用程序或操作系统。

 二.KVM概述

KVM本质是Linux内核中的虚拟化模块kvm.ko,KVM运行在内核空间中提供CPU和内存虚拟化,而IO设备虚拟化由运行在用户空间中的QEMU负责。

QEMU工作原理 

  1. 硬件虚拟化初始化

    • 当运行QEMU-KVM时,KVM会加载到Linux内核中,并提供了对CPU和内存虚拟化的支持。
  2. 虚拟机创建与配置

    • 用户通过QEMU提供的工具或界面来创建和配置虚拟机。这些配置信息包括虚拟机的名称、CPU类型、内存大小、磁盘大小等。
    • QEMU将这些配置信息传递给KVM,KVM利用这些信息来创建一个虚拟机实例,并为虚拟机分配必要的资源。
  3. 指令翻译与执行

    • 当客户机操作系统开始运行时,它会发出一系列的指令。这些指令首先被QEMU接收。
    • QEMU使用动态二进制翻译(DBT)技术将这些指令翻译成宿主机能够理解的指令。然后,宿主机的处理器执行这些指令,并将结果返回给虚拟机。
  4. IO设备模拟与交互

    • 虚拟机中的客户机操作系统与IO设备的交互是通过QEMU模拟器来实现的。
    • 当虚拟机中的客户机操作系统请求访问IO设备时,QEMU模拟器会将这些请求转发到宿主机的IO设备。然后,宿主机的IO设备处理这些请求,并将结果返回给虚拟机。

三.KVM部署

  • 虚拟机管理工具:libvirt
  • 虚拟机安装/克隆工具:virt
  • 虚拟机硬盘管理:qemu-kvm
  • virt-manager:KVM图形化管理工具和Vmware功能相同
  • libguestfs-tools:虚拟机系统管理工具

准备工作:开启VMware虚拟化功能 

命令行查看虚拟化功能是否开启(开启则会显示)
[root@localhost ~]# lsmod |grep -i kvm
kvm_intel             385024  0
kvm                  1105920  1 kvm_intel
irqbypass              16384  1 kvm

准备工作:安装远程控制软件 --->远程控制软件地址

准备工作:安装yum源

配置yum源(这里使用阿里源)
[root@timeserver yum.repos.d]# vim /etc/yum.repos.d/wangluo.repo
#写入如下内容
[wangluo-app]
name=wanluo-app
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/AppStream/x86_64/os/
gpgcheck=0
[wangluo-base]
name=wangluo-base
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/os/
gpgcheck=0

#安装软件包
[root@timeserver yum.repos.d]# yum install vim bash-completion -y
#出现完毕字样代表成功安装

 第二步:安装上述三种工具并上传虚拟机所用镜像文件

[root@localhost ~]# yum install -y libvirt virt-install qemu-kvm virt-manager libguestfs-tools
#启动虚拟机管理工具
[root@localhost ~]# systemctl start libvirtd.service
[root@localhost ~]# systemctl status libvirtd.service
#上传镜像文件
[root@localhost ~]# ls -lh /opt
总用量 8.5G
-rw-r--r--. 1 root root 8.5G 10月  7 17:23 rhel-baseos-9.1-x86_64-dvd.iso

 第三步:安装虚拟机

#启动KVM图形化管理工具
[root@localhost ~]# virt-manager
#取消开机自启
[root@localhost qemu]# virsh autostart --disable kvm_1

命令行安装方式可参考如下 -->VNC下载链接

--virt-type kvm                                 虚拟化的类型(gemu)
 --os-type=linux                                系统类型
--os-variant rhel7                              系统版本 
--name centos7                                  虚拟机的名字
--memory 1024                                   虚拟机的内存
--vcpus 1                                       虚拟cpu的核数
--disk /opt/centos2.raw, format=raw, size=10    虚拟机安装路径,虚拟磁盘格式,磁盘大小
--cdrom /opt/CentOS-7-x86 64-DVD-1708.iso       虚拟机镜像    
--network network=default                       虚拟机网络(默认NAT)
--graphics vnc,listen=0.0.0.0                   设置虚拟机的显示器使用vnc连接(默认开5900口)
--noautoconsole

KVM-Virsh日常管理命令

#查看KVM虚拟机状态
[root@localhost ~]# virsh list --all
 Id   名称      状态
----------------------
 1    rhel9.1   运行

#开启虚拟机
[root@localhost images]# virsh start rhel9.1
域 'rhel9.1' 已启动

#关闭KVM虚拟机
[root@localhost ~]# virsh shutdown rhel9.1
域 'rhel9.1' 正在关闭

[root@localhost ~]# virsh undefine rhel9.1
domain 'rhel9.1' 已被解除定义

#更改虚拟机配置文件
[root@localhost ~]# virsh edit rhel9.1
域 'rhel9.1' XML 配置没有改变。

#虚拟机重命名
[root@localhost ~]# virsh domrename rhel9.1 kvm_1
Domain successfully renamed

#查看指定虚拟机VNC连接端口
[root@localhost qemu]# virsh vncdisplay kvm_1
127.0.0.1:0 (5900缩写为0)

KVM虚拟机备份

 当需要将KVM虚拟机备份并发送给对方时,只需备份并发送虚拟机的磁盘文件+配置文件

#查看虚拟机xml信息(包括存储信息/配置文件信息)
[root@localhost images]# virsh dumpxml rhel9.1(虚拟机名称)

#编辑虚拟机的xml信息
[root@localhost qemu]# virsh edit kvm_1
域'kvm_1' XML 配置已被编辑
  •  配置文件:上述命令输出信息中含有配置文件信息,只需备份到新建文件即可
[root@localhost images]# virsh dumpxml rhel9.1 > /var/lib/libvirt/images/rehl9.1.xml
  •  磁盘文件:在输出的XML配置文件中,查找 <disk> 标签有关于磁盘文件的路径信息
<disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' discard='unmap'/>
      #配置文件路径信息
      <source file='/var/lib/libvirt/images/rhel9.1.qcow2' index='2'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
[root@localhost ~]# ls -lh /var/lib/libvirt/images/
总用量 4.9G
-rw-r--r--. 1 root root 8.4K 10月  8 16:33 rehl9.1.xml
-rw-------. 1 qemu qemu  21G 10月  8 16:31 rhel9.1.qcow2

 KVM虚拟机恢复

#导入配置文件(注意要和磁盘文件处于同一个路径下)
[root@localhost images]# virsh define /var/lib/libvirt/images/rehl9.1.xml
从 rhel9.1 定义的域 '/var/lib/libvirt/images/rehl9.1.xml'

#再次查看虚拟机状态(此时已恢复)
[root@localhost images]# virsh list --all
 Id   名称      状态
----------------------
 -    rhel9.1   关闭

KVM挂起/恢复 

[root@localhost qemu]# virsh suspend kvm_1
域 'kvm_1' 已挂起

[root@localhost qemu]# virsh resume kvm_1
域 'kvm_1' 已恢复

KVM开机自启 :启动libvirtd.service会自动开启KVM虚拟机

[root@localhost qemu]# virsh autostart kvm_1
域 'kvm_1' 标记为自动启动

#设置开机自启后会出现autostart目录并显示设备开机自启的虚拟机
[root@localhost ~]# ls /etc/libvirt/qemu
autostart  kvm_1.xml  networks
[root@localhost ~]# ls /etc/libvirt/qemu/autostart/
kvm_1.xml

#关闭开机自启
[root@localhost ~]# virsh autostart --disable kvm_1

 KVM-Console登录

下图中,如果北京地区的主机想要访问虚拟机是无法通过VNC实现(VNC仅支持直连访问),而在KVM虚拟化环境中,配置console登录的作用是允许用户通过跳板机访问到虚拟机。

注意:虚拟机安装时无法通过跳板机ssh连接

#备份内核文件
[root@localhost ~]# cp /etc/grub2.cfg /etc/grub2.cfg_backup
#插入内核配置
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
#比对新旧内核配置文件不同
[root@localhost ~]# diff /etc/grub2.cfg /etc/grub2.cfg_backup

#重启虚拟机后就可以通过console连接虚拟机
[root@localhost ~]# virsh console kvm_1
连接到域 'kvm_1'
转义字符是 ^] (Ctrl + ])

kvm1 login: root
密码:
上次登录:Wed Oct  9 18:27:57 from 192.168.122.1
[root@kvm1 ~]#使用ctrl+]从虚拟机界面跳转到主机界面

 KVM-磁盘管理

KVM磁盘格式

  1. raw格式:raw格式是最简单和通用的磁盘格式。他静态分配磁盘空间,即便50G磁盘中文件只用20G,也会分配50G空间,因此占用空间大。该格式不支持快照

  2. qcow2格式:qcow2是一种高级的磁盘格式,支持特性如动态分配空间、快照和压缩。它可以节省磁盘空间,与raw格式相反,他根据文件大小动态分配磁盘空间。该格式支持快照

 KVM添加新磁盘流程

#创建磁盘文件
#创建虚拟磁盘文件
[root@localhost images]# qemu-img create -f(指定磁盘格式) qcow2 test.qcwo2 5G(指定大小)

Formatting 'test.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=5368709120 lazy_refcounts=off refcount_bits=16

#将磁盘附加到虚拟机上
[root@localhost images]# virsh attach-disk kvm_1 disk1.qcow2 vdb --driver qemu --subdriver qcow2 --targetbus virtio --persistent
成功附加磁盘

#附件完成后,查看xml文件中新添加的磁盘disk1是否和其它磁盘处于同一个路径下
[root@localhost qemu]# virsh domblklist kvm_1

常用命令 

#查看磁盘信息
[root@localhost images]# qemu-img info /var/lib/libvirt/images/rhel9.1.qcow2
image: rhel9.1.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 4.88 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false
Child node '/file':
    filename: rhel9.1.qcow2
    protocol type: file
    file length: 20 GiB (21478375424 bytes)
    disk size: 4.88 GiB
    Format specific information:
        extent size hint: 1048576

#增加磁盘5G的大小
[root@localhost images]# qemu-img resize test.qcow2 +5G
Image resized.

#将磁盘容量调整至
[root@localhost images]# qemu-img resize test.qcow2 15G

#磁盘格式转换
格式:qemu-img convert -f 指定格式 -O 转换后格式 原文件 转换后的文件
[root@localhost ~]# qemu-img convert -f qcow2 -O raw /var/lib/libvirt/images/test.qcow2 /var/lib/libvirt/images/test.qcow2.raw

注意: qcow2格式的磁盘会随着写入数据而增大,因此创建完成后文件大小只有193K

 更改虚拟机磁盘格式时需要更改虚拟机配置文件内容,具体如下:

KVM-快照管理 

虚拟机快照管理 

#创建快照
[root@localhost ~]# virsh snapshot-create kvm_1
已生成域快照 1728553704

#查看虚拟机快照
[root@localhost ~]# virsh snapshot-list kvm_1
 名称         生成时间                    状态
---------------------------------------------------
 1728553704   2024-10-10 17:48:24 +0800   shutoff

#删除快照
[root@localhost ~]# virsh snapshot-delete kvm_1 --snapshotname 1728553704
已删除域快照 1728553704

#恢复快照
[root@localhost ~]# virsh snapshot-revert kvm_1 --snapshotname 1728554242
域快照 1728554242 恢复

KVM-虚拟机克隆

区别: 

  1. 完整克隆:由于完整克隆不与父虚拟机共享虚拟磁盘,因此创建过程需要复制整个虚拟机磁盘文件。这导致创建完整克隆所需的时间较长,特别是当涉及的文件较大时,可能需要数分钟才能完成。
  2. 链接克隆:链接克隆通过共享父虚拟机的快照来创建,因此大大缩短了创建时间。同时,由于只创建了与快照相关的差异部分,还节省了物理磁盘空间

KVM--完整克隆

下面步骤是将虚拟机KVM_1完整克隆成,生成的克隆虚拟机命名为kvm_2: 

#步骤一:复制KVM-虚拟机的磁盘文件作为克隆虚拟机的磁盘文件
[root@localhost images]# cd rhel9.1.qcow2 kvm_2.qcow2

#步骤二:导出虚拟机kvm_1的配置文件至文件kvm_2.xml并将kvm_2.xml作为kvm_2的配置文件
[root@localhost images]# virsh dumpxml kvm_1 > kvm_2.xml

#步骤三:更改克隆虚拟机配置文件相关信息
[root@localhost images]# virsh edit kvm_2.xml
--虚拟机名称更改:
   <name>kvm_1</name>改为--><name>kvm_2</name>
--生成新UUID:
   直接删除<name>kvm_1</name>这一行,重启后会自动生成新UUID
--磁盘文件路径:按照下方更改
   <source file='/var/lib/libvirt/images/kvm_1.qcow2' index='2'/>
   <source file='/var/lib/libvirt/images/kvm_2.qcow2' index='2'/>
--生成新MAC地址:
    直接删除<mac address='52:54:00:15:ae:55'/>这一行,重启后会自动生成MAC

#步骤四:导入克隆虚拟机的配置文件
[root@localhost images]# virsh define kvm_2.xml

上述步骤流程为克隆的思路,下面介绍一种简单方法:

[root@localhost images]# virt-clone -o kvm_1 -n kvm_2 --auto-clone

KVM-链接克隆 

#步骤一:创建链接磁盘
[root@localhost images]# qemu-img create -f qcow2 -b kvm_1.qcow2 kvm_2.qcow2

#步骤二:参照完整克隆步骤二创建kvm_2的配置文件
#步骤三:修改配置文件信息
#步骤四:导入克隆虚拟机的配置文件

KVM 桥接网络 

网络模式:桥接模式--->详情请移步虚拟机三种网络模式

#步骤一:在宿主机上创建与ens160同网段的桥接网卡(br0),此时br0会代替ens160成为公网口
[root@localhost images]# virsh iface-bridge ens160 br0
#取消网卡桥接
[root@localhost images]# virsh iface-unbridge ens160 br0

#步骤二:将虚拟机与新建的桥接网卡建立连接
[root@localhost images]# virsh edit kvm_1

#步骤三:修改虚拟机IP使其网段与宿主机公网卡IP一致(DHCP可忽略该步骤)

 步骤二修改内容:

#修改为:
<interface type='bridge'>
      <mac address='52:54:00:15:ae:55'/>
      <source network='default' portid='4c36eab5-b46d-426b-82ba-38e41c96f3a0' bridge='br0
      '/>
      <target dev='vnet1'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>

总结

;