部署KVM虚拟化平台

KVM三大模式

客户模式(客户就是你的虚拟机)

用户模式(qemu)

内核模式(模拟cpu、内存等)

Linux用户模式

libkvm:通过ioctl进入内核

ioctl:输入输出控制器

fd:通过ioctl向设备驱动器(/dev/kvm)发送创建、运行(虚拟机)等操作

Linux内核模式

一、案列分析

1.1案列概述

公司部分 Linux 服务器硬件资源利用率不高,为了充分利用这些 Linux 服务器,可以部署 KVM,在物理机上运行多个业务系统。例如,在运行Nginx 的服务器上部署 KVM,然后在 KVM 虚拟机上运行 Tomcat 等服务。

1.2案列前置知识点

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

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

1.KVM 原理简介

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

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

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

2.KVM 运行时的三种模式

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

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

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

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

3.KVM 工作原理

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

1.3案列环境

1.本案例实验环境

|-------|-------------------|----------------|
| 主机 | . 操作系统 | IP 地址 |
| kvm01 | CentOS 7.9 x86_64 | 192.168.10.108 |
| kvm02 | CentOS 7.9 x86_64 | 192.168.10.109 |

2.案列需求

(1)安装 KVM。

(2)完成基本的 KVM 操作管理(创建、启动、停止等)。

(3)完成 KVM 命令行操作虚拟机。

3.案例实现思路

(1)准备 KVM 装环境。

(2)安装 KVM。

(3)配置 KVM 桥接网络。

(4)创建 KVM 存储池并安装虚拟机。

(5)命令行操作虚拟机。

二、搭建 KVM 虚拟化平台

2.1准备 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:虚拟机图形管理工具(宿主机有桌面环境时可以考虑安装,命令操作或者远程控制则不需要)

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

QEMU(Quick Emulator)快速仿真器

libguestfs-tools:用于访问虚拟机的磁盘映像文件提供的一组命令

(2)关机,设置CPU支持虚拟化,然后开机
(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.2使用 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

3. 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

4.虚拟机克隆

(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

5. 虚拟机快照

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
相关推荐
长弓聊编程16 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.23 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒1 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热1 小时前
路由基础(全)
linux·网络·网络协议·安全
传而习乎1 小时前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
soulteary1 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
IT果果日记2 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教2 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes