一、概述

KVM 自 Linux 2.6.20 版本后就直接整合到 Linux 内核,它依托 CPU虚拟化指令集(如InteI-VT、AMD-V)实现高性能的虚拟化支持。由于与 Linux 内核高度整合,因此在性能、安全性、兼容性、稳定性上都有很好的表现。

在 KVM 环境中运行的每一个虚拟化操作系统都将表现为单个独立的系统进程。因此它可以很方便地与 Linux 系统中的安全模块进行整合SELinux),可以灵活地实现资源的管理及分配。

案例:部署KVM虚拟化平台_xml

1.KVM 原理简介

广义的 KVM 实际上包含两部分,一部分是基于 Linux 内核支持的 KVM 内核模块,另一部分就是经过简化和修改的 Qemu。

KVM 内核模块是模拟处理器和内存以支持虚拟机的运行,Qemu 主要处理 I/0 以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合、相辅相成,构成了一个完整的虚拟化平台。

需要注意的是,Qemu 本身并不是 KVM 的一部分,Qemu是一套完整的虚拟化解决方案,是纯软件实现虚拟化,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟出来的,所以 Qemu 的性能比较低。


2.KVM 运行时的三种模式

KVM 模块是让 Linux 主机成为一个虚拟机监视器(VMM),并且在原有 Linux 内核模式和用户模式的两种执行模式基础上新增加了客户模式,客户模式也拥有自己的内核模式和用户模式。

客户模式:可以简单理解成客户机在操作系统运行中的模式,客户模式又分为内核模式和用户模式。客户模式中的内核模式和用户模式的作用分别如下所示。

  • 用户模式:为用户提供虚拟机管理的用户空间工具以及代表用户执行 I/0,Qemu运行》在这个模式之下。
  • 内核模式:模拟 CPU以及内存,实现客户模式的切换,处理从客户模式的退出。KVM内核模块运行在这个模式下。

三种模式层次关系图如图所示。

案例:部署KVM虚拟化平台_xml_02


3.KVM 工作原理

用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。KVM Driver 为虚拟机创建虚拟 CPU 和虚拟内存,然后执行 VMLAUNCH 指令进入客户模式,装载 GuestOS 并运行。Guest OS 运行过程中如果发生中断或者影子缺页等异常,将暂停 Guest OS的运行并保存当前上下文退出到内核模式来处理这些异常。内核模式处理这些异常时如果不需要 I/0 则处理完成后重新进入客户模式。如果需要 1/0 则进入到用户模式,由 Qemu 来处理 I/O,处理完成后进入内核模式,再进入客户模式,工作原理如图所示。

案例:部署KVM虚拟化平台_xml_03


二、搭建KVM 虚拟化平台

2.1 本案例实验环境

主机

   操作系统

IP地址


主要软件

kvm01

CentOS 7.9 x86_64

192.168.10.108

KVM 虚拟机

kvm02

CentOS 7.9 x86_64

192.168.10.109


2.2 准备kvm 虚拟化环境

1.安装

(1)YUM 安装KVM

yum -y install qemu-kvm

yum -y install qemu-kvm-tools

yum -y install virt-install

yum -y install qemu-img

yum -y install bridge-utils

yum -y install libvirt

yum -y install virt-manager

yum -y install libguestfs-tools

备注:

  • qemu-kvm :kvm核心包–虚拟操作系统模拟器加速模块
  • qemu-kvm-tools :qemu-kvm的工具包
  • virt-install:虚拟机安装工具
  • qemu-img :是QEMU的磁盘管理工具
  • bridge-utils:虚拟机与外界通信的命令管理工具
  • libvirt:必须要装的核心工具
  • virt-manager:虚拟机图形管理工具(宿主机有桌面环境时可以考虑安装,命令操作或者远程控制则不需要)
  • libguestfs-tools:用于访问虚拟机的磁盘映像文件提供的一组命令

QEMU是“Quick Emulator”的缩写,是一个用C语言编写的开源虚拟化软件。

QEMU(Quick Emulator)快速仿真器


(2)关机,设置CPU支持虚拟化,然后开机

案例:部署KVM虚拟化平台_vim_04


(3)开机后验证

[root@kvm01 ~]# cat /proc/cpuinfo | grep vmx

[root@kvm01 ~]# lsmod | grep kvm


(4)开启libvirtd 服务

安装完成后还需要开启libvirtd 服务,以开启相关支持。

[root@kvm01 ~]# systemctl start libvirtd

[root@kvm01 ~]# systemctl enable libvirtd


2.设置KVM 网络

这里以Bridge(桥接)为例进行操作演示

[root@kvm01 ~]# cd /etc/sysconfig/network-scripts/

[root@kvm01 network-scripts]# cp ifcfg-ens33 ifcfg-br0


[root@kvm01 ~]# vim ifcfg-ens33

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=static

IPADDR=192.168.10.108

NETMASK=255.255.255.0

GATEWAY=192.168.10.254

DNS1=223.6.6.6

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=ens33

DEVICE=ens33

ONBOOT=yes

BRIDGE=br0



[root@kvm01 ~]# vim ifcfg-br0


TYPE=Bridge

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=static

IPADDR=192.168.10.108

NETMASK=255.255.255.0

GATEWAY=192.168.10.254

DNS1=223.6.6.6

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=br0

DEVICE=br0

ONBOOT=yes



[root@kvm01 ~]#systemctl restart network

[root@kvm01 ~]# ifconfig

备注:

在此处做个快照,为后面章节做好实验环境

在另一台kvm主机上重复以上操作,最后也做个快照


3.KVM 管理

[root@kvm01 ~]# virt-manager

(1)创建存储池

存储池的名称为:bdqn

存储池的目录为:/data_kvm/store


(2)创建存储卷

在bdqn的存储池中添加存储卷

存储卷名称为:test01

卷最大容量10G


(3)将Linux系统的ISO文件拷贝到/opt目录下,并关闭存储设置


(4)在kvm01的主机上新建虚拟机,名称为test01


2.3 使用KVM 命令集管理虚拟机

1. KVM 基本功能管理

(1)查看命令帮助

[root@kvm01 ~]# virsh -h


(2)查看KVM 的配置文件存放目录

[root@kvm01 ~]# ls /etc/libvirt/qemu/


(3)查看虚拟机状态

[root@kvm01 ~]# virsh list --all


(4)虚拟机关机与开机

[root@kvm01 ~]# virsh shutdown test01

[root@kvm01 ~]# virsh start test01


(5)强制实例系统关闭电源

[root@kvm01 ~]# virsh destroy test01


(6)通过配置文件启动虚拟机系统实例

[root@kvm01 ~]# virsh create /etc/libvirt/qemu/test01.xml

[root@kvm01 ~]# virsh list --all


(7)挂起虚拟机

[root@kvm01 ~]# virsh suspend test01

[root@kvm01 ~]# virsh list --all


(8)恢复虚拟机

[root@kvm01 ~]# virsh resume test01

[root@kvm01 ~]# virsh list --all


(9)配置虚拟机实例伴随宿主机自动启动

[root@kvm01 ~]# virsh autostart test01


(10)导出虚拟机配置

[root@kvm01 ~]# virsh dumpxml test01 > /etc/libvirt/qemu/test02.xml


(11)虚拟机的删除与添加

删除虚拟机

[root@kvm01 ~]# virsh shutdown test01

[root@kvm01 ~]# virsh undefine test01


查看删除结果,test01 的配置文件被删除,但是磁盘文件不会被删除

[root@kvm01 ~]# ls /etc/libvirt/qemu/


通过virsh list --all 查看不到test01 的信息,说明此虚拟机被删除

[root@kvm01 ~]# virsh list --all


通过备份的配置文件重新定义虚拟机

[root@kvm01 ~]# cd /etc/libvirt/qemu

[root@bdqn qemu]# mv test02.xml test01.xml


重新定义虚拟机

[root@bdqn qemu]# virsh define test01.xml


查看虚拟机信息。

[root@bdqn qemu]# virsh list --all


(12)修改虚拟机配置信息(用来修改系统内存大小、磁盘文件等信息)

直接通过vim 命令修改。

[root@kvm01 ~]# vim /etc/libvirt/qemu/test01.xml


通过virsh 命令修改。

[root@kvm01 ~]# virsh edit test01


2. KVM 文件管理

(1)查看当前磁盘格式

[root@kvm01 ~]# qemu-img info /data_kvm/store/test01.qcow2

备注:

如果虚拟机磁盘文件不是qcow2 格式,可以通过qemu-img 命令转换磁盘文件格式,

如执行以下操作可以将test01 虚拟机raw 格式磁盘转换至qcow2 格式。

[root@kvm01 ~]# virsh shutdown test01


[root@kvm01 ~]# qemu-img convert -f raw -O qcow2 /data_kvm/store/test01.img /data_kvm/store/test01.qcow2


执行转换磁盘格式的命令后还需要修改test01 的xml 配置文件中磁盘的类型与磁盘文件名。

[root@kvm01 ~]# virsh edit test01

…… //省略部分内容

<disk type='file' device='disk'>

<driver name='qemu' type='qcow2' cache='none'/>

<source file='/data_KVM/store/test01.qcow2'/>

<target dev='vda' bus='virtio'/>

<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>

</disk>


(2)virt-cat 命令,类似于cat 命令

使用这个命令需要安装libguestfs-tools-c 工具包。

[root@kvm01 ~]# virt-cat -a /data_kvm/store/test01.qcow2 /etc/sysconfig/grub


(3)virt-edit 命令

virt-edit 命令,用于编辑文件,用法与vim 基本一致。

[root@kvm01 ~]# virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf


(4)virt-df 命令

virt-df 命令用于查看虚拟机磁盘信息。

[root@kvm01 ~]# virt-df -h test01


3. 虚拟机克隆

(1)查看虚拟机状态

[root@kvm01 ~]# virsh list --all


(2)从test01 克隆test02

[root@kvm01 ~]# virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2


(3)查看虚拟机状态

[root@kvm01 ~]# virsh list --all


(4)启动虚拟机

[root@kvm01 ~]# virsh start test02


4. 虚拟机快照

KVM 虚拟机要使用镜像功能,磁盘格式必须为qcow2。下面介绍KVM 虚拟机快照备份的过程。

(1)对test01 创建快照

[root@kvm01 ~]# virsh snapshot-create test01

已生成域快照1503494464


(2)查看虚拟机快照版本信息

[root@kvm01 ~]# virsh snapshot-current test01


(3)查看快照信息

[root@kvm01 ~]# virsh snapshot-list test01


(4)创建新快照

[root@kvm01 ~]# virsh snapshot-create test01


(5)查看快照信息

[root@kvm01 ~]# virsh snapshot-list test01


(6)恢复虚拟机状态

[root@kvm01 ~]# virsh snapshot-revert test01 1503494464

(7)查看虚拟机快照版本信息

[root@kvm01 ~]# virsh snapshot-current test01


(8)删除快照

[root@kvm01 ~]# virsh snapshot-delete test01 1503494464