目录
一、案例分析
1.1、案例概述
公司部分 Linux 服务器硬件资源利用率不高,为了充分利用这些 Linux 服务器,可以部署 KVM,在物理机上运行多个业务系统。例如,在运行 Nginx 的服务器上部署 KVM,然后在 KVM 虚拟机上运行 Tomcat 等服务。
1.2、案例前置知识点
KVM 自 Linux 2.6.20 版本后就直接整合到 Linux 内核,它依托 CPU 虚拟化指令集(如 Intel-VT、AMD-V)实现高性能的虚拟化支持。由于与 Linux 内核高度整合,因此在性能、 安全性、兼容性、稳定性上都有很好的表现。
下图简单描绘了 KVM 虚拟化架构,在 KVM 环境中运行的每一个虚拟化操作系统都将表现为单个独立的系统进程。因此它可以很方便地与 Linux 系统中的安全模块进行整合 (SELinux),可以灵活地实现资源的管理及分配。
KVM 虚拟化架构
1)KVM 原理简介
广义的 KVM 实际上包含两部分,一部分是基于 Linux 内核支持的 KVM 内核模块,另一部分就是经过简化和修改的 Qemu。
KVM 内核模块是模拟处理器和内存以支持虚拟机的运行,Qemu 主要处理 I/O 以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合、相辅相成,构成了一个完整的虚拟化平台。
需要注意的是,Qemu 本身并不是 KVM 的一部分,Qemu 是一套完整的虚拟化解决方案,是纯软件实现虚拟化,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟出来的,所以 Qemu 的性能比较低。
2)KVM 运行时的三种模式
KVM 模块是让 Linux 主机成为一个虚拟机监视器(VMM),并且在原有 Linux 内核模式和用户模式的两种执行模式基础上新增加了客户模式,客户模式也拥有自己的内核模式和用户模式。
客户模式:可以简单理解成客户机在操作系统运行中的模式,客户模式又分为内核模式和用户模式。客户模式中的内核模式和用户模式的作用分别如下所示。
- 用户模式:为用户提供虚拟机管理的用户空间工具以及代表用户执行 I/O,Qemu 运行在这个模式之下。
- 内核模式:模拟 CPU 以及内存,实现客户模式的切换,处理从客户模式的退出。KVM 内核模块运行在这个模式下。
三种模式层次关系图如下图所示:
三种模式关系层次图
3)KVM 工作原理
用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。KVM Driver 为虚拟机创建虚拟 CPU 和虚拟内存,然后执行 VMLAUNCH 指令进入客户模式,装载 Guest OS 并运行。Guest OS 运行过程中如果发生中断或者影子缺页等异常,将暂停 Guest OS 的运行并保存当前上下文退出到内核模式来处理这些异常。内核模式处理这些异常时如果不需要 I/O 则处理完成后重新进入客户模式。如果需要 I/O 则进入到用户模式,由 Qemu 来处 理 I/O,处理完成后进入内核模式,再进入客户模式,工作原理如下图所示。
工作原理图
1.3、案例环境
1)本案例实验环境
采用 CentOS7.6 操作系统,并开启虚拟化支持,案例环境如下表所示
主机 | 操作系统 | IP 地址 | 主要软件 |
CentOS7-1 | CentOS 7.6 x86_64 | 192.168.23.201 | KVM |
test01 | CentOS 7.6 x86_64 | 192.168.23.202 | KVM |
注意:CentOS7-1 的内存 8G 以上,内核 2 个,硬盘 100G,并且勾选虚拟化引擎,如下图所示
2)案例需求
- 安装 KVM。
- 完成基本的 KVM 操作管理(创建、启动、停止等)。
- 完成 KVM 命令行操作虚拟机。
3)案例实现思路
- 准备 KVM 安装环境。
- 安装 KVM。
- 配置 KVM 桥接网络。
- 创建 KVM 存储池并安装虚拟机。
- 命令行操作虚拟机。
二、搭建 KVM 虚拟化平台
2.1、准备 KVM 虚拟化环境
1)安装方式
- YUM 安装 KVM
在 CentOS 的系统光盘镜像中,已经提供了安装 KVM 所需软件。通过部署基于光盘镜像的本地 YUM 源,直接使用 YUM 安装所需软件即可,安装 KVM 所需软件具体包含以下几个。
[root@centos7-1 ~]# yum -y install qemu-kvm //KVM模块
[root@centos7-1 ~]# yum -y install qemu-kvm-tools //KVM 调试工具
[root@centos7-1 ~]# yum -y install virt-install //构建虚拟机的命令行工具
[root@centos7-1 ~]# yum -y install qemu-img //qemu 组件,创建磁盘,启动虚拟机等
[root@centos7-1 ~]# yum -y install bridge-utils //网络支持工具
[root@centos7-1 ~]# yum -y install libvirt //虚拟机管理工具
[root@centos7-1 ~]# yum -y install virt-manager //图形界面管理虚拟机
注意:本实验使用图形界面的系统,若没有图形界面,可使用以下命令安装图形界面
yum groupinstall -y "GNOME Desktop"
需要注意的是:在使用 YUM 安装完桌面后执行 ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target 命令,将系统的默认运行 target 更改为 graphical.targe。重启后系统将进入图形化界面。若不执行上述命令更改系统的默认运行 target,重启时可能报错。
- 验证
重启系统后,查看 CPU 是否支持虚拟化,对于 Intel 的服务器可以通过以下命令查看, 只要有输出就说明 CPU 支持虚拟化;AMD 服务器可用 cat /proc/cpuinfo | grep smv 命令查看。
检查 KVM 模块是否安装
[root@centos7-1 ~]# lsmod | grep kvm
kvm_intel 183621 0
kvm 586948 1 kvm_intel
irqbypass 13503 1 kvm
-
开启 libvirtd 服务
安装完成后还需要开启 libvirtd 服务,以开启相关支持。
[root@centos7-1 ~]# systemctl start libvirtd
[root@centos7-1 ~]# systemctl enable libvirtd
2)设置 KVM 网络
宿主服务器安装完成 KVM,首先要设定网络,在 libvirt 中运行 KVM 网络有两种方法: NAT 和 Bridge,默认是 NAT。
关于两种网络模式的说明:
- 用户模式,即 NAT 方式,这种方式是默认网络,数据包由 NAT 方式通过主机的网卡接口进行传送,可以访问外网,但是无法让外部主机访问虚拟机内部网络。
- 桥接模式,这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持,一般有线网卡都支持。
这里以 Bridge(桥接)为例进行操作演示。注:宿主机 IP 地址为 192.168.23.201。
[root@centos7-1 ~]# cd /etc/sysconfig/network-scripts/
[root@centos7-1 network-scripts]# ls
ifcfg-ens32 ifdown-ib ifdown-ppp ifdown-tunnel ifup-ib ifup-plusb ifup-Team network-functions
ifcfg-lo ifdown-ippp ifdown-routes ifup ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6
ifdown ifdown-ipv6 ifdown-sit ifup-aliases ifup-ipv6 ifup-ppp ifup-tunnel
ifdown-bnep ifdown-isdn ifdown-Team ifup-bnep ifup-isdn ifup-routes ifup-wireless
ifdown-eth ifdown-post ifdown-TeamPort ifup-eth ifup-plip ifup-sit init.ipv6-global
[root@centos7-1 network-scripts]# cp ifcfg-ens32 ifcfg-br0
[root@centos7-1 network-scripts]# vim ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
UUID=45787bca-e4b8-4549-8e8e-c65dea5bab34
DEVICE=ens32
ONBOOT=yes
#IPADDR=192.168.23.201
#PREFIX=24
#GATEWAY=192.168.23.2
#DNS1=202.96.128.86
BRIDGE=br0
[root@centos7-1 network-scripts]# vim ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.23.201
PREFIX=24
GATEWAY=192.168.23.2
DNS1=202.96.128.86
重启服务
[root@centos7-1 ~]# systemctl restart network
确认 IP 地址信息
[root@centos7-1 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
link/ether 00:0c:29:5f:77:9d brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:91:91:26 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:91:91:26 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:5f:77:9d brd ff:ff:ff:ff:ff:ff
inet 192.168.23.201/24 brd 192.168.23.255 scope global noprefixroute br0
valid_lft forever preferred_lft forever
inet6 fe80::8811:55ff:feb0:cc94/64 scope link
valid_lft forever preferred_lft forever
出现以上信息,说明网卡桥接成功了。
3)KVM 管理
[root@centos7-1 ~]# virt-manager
virt-manager 是基于 libvirt 的图像化虚拟机管理软件。需要注意的是,不同发行版上的 virt-manager 版本可能有所不同,图形界面和操作方法也可能不同。本文使用了 CentOS 7.6。创建 KVM 虚拟机最简单的方法是通过 virt-manager 接口。从控制台窗口启动这个工 具,以 root 身份输入 virt-manager 命令,出现如下图所示窗口。
虚拟机管理界面
虚拟化管理步骤如下。
首先创建以下目录
[root@centos7-1 ~]# mkdir /data_kvm
[root@centos7-1 ~]# mkdir /data_kvm/store
[root@centos7-1 ~]# mkdir /data_kvm/iso
- 创建存储池
双击 QEMU/KVM,选择“存储”选项卡,然后单击“+”按钮新建存储池。如下图所示,单击“前进”按钮,根据提示输入或浏览用以设置存储目录,如/data_kvm/store,最后单击“完成” 按钮即可。
创建存储池
- 创建镜像存储池
以同样的操作创建一个镜像存储池,命名为 bdqn_iso,目录为/data_kvm/iso 即可。在安装操作系统时,需要把镜像上传到服务器目录/data_kvm/iso,如下图所示
创建镜像存储池
- 创建存储卷
单击刚创建好的“bdqn”,单击对话框中“卷”右边的 “+”按钮建立一个存储卷,并设置最大容量,如下图所示。
创建存储卷
- 新建虚拟机
单击“完成”按钮后,回到虚拟系统管理器。右击“QEMU/KVM”,然后选择“新建”选项,在弹出的对话框中按下图所示选择“本地安装介质”,然后单击“前进”按钮。
新建虚拟机(1)
单击“浏览”按钮选择镜像文件,再选择操作系统型及版本,如下图所示。
新建虚拟机(2)
单击“前进”按钮,在下图所示的对话框中适当分配内存和 CPU 资源,如 1 核 CPU、 1GB 内存。
新建虚拟机(3)
单击“前进”按钮,在如下图所示的对话框中点选“选择或创建自定义存储”单选按钮, 单击“管理”按钮选择文件,然后单击“前进”按钮。
新建虚拟机(4)
在如下图 所示将虚拟机名称命名为“test01“,并勾选话框中的“在安装前自定义 配置”复选框,单击“完成”按钮,弹出对话框。
新建虚拟机(5)
新建虚拟机(6)
在“引导选项”视图中勾选“主机引导时启动虚拟机”复选框,这样在物理宿主机启动后, 这个 VM 也会启动,最后单击“应用”按钮,如下图所示。
新建虚拟机(7)
最后单击“开始安装”按钮即可,整个虚拟化配置过程完成。下面就是安装操作系统的工作,和平时安装 Linux 系统一样,如下图所示。
CentOS 安装界面
2.2、使用 KVM 命令集管理虚拟机
1)KVM 基本功能管理
- 查看命令帮助
[root@centos7-1 ~]# virsh -h
......//省略输出内容
- 查看 KVM 的配置文件存放目录(test01.xml 是虚拟机系统实例的配置文件)
[root@centos7-1 ~]# ls /etc/libvirt/qemu
autostart networks test01.xml
- 查看虚拟机状态
[root@centos7-1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 test01 running
- 虚拟机关机与开机
[root@centos7-1 ~]# virsh shutdown test01
[root@centos7-1 ~]# virsh start test01
- 强制实例系统关闭电源
[root@centos7-1 ~]# virsh destroy test01
- 通过配置文件启动虚拟机系统实例
[root@centos7-1 ~]# virsh create /etc/libvirt/qemu/test01.xml
域 test01 被创建(从 /etc/libvirt/qemu/test01.xml)
[root@centos7-1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
4 test01 running
- 挂起虚拟机
[root@centos7-1 ~]# virsh suspend test01
域 test01 被挂起
[root@centos7-1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
4 test01 暂停
- 恢复虚拟机
[root@centos7-1 ~]# virsh resume test01
域 test01 被重新恢复
[root@centos7-1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
4 test01 running
- 配置虚拟机实例伴随宿主机自动启动
[root@centos7-1 ~]# virsh autostart test01
域 test01标记为自动开始
上述命令将创建/etc/libvirt/qemu/autostart/目录,目录内容为开机自动启动的系统。
- 导出虚拟机配置
[root@centos7-1 ~]# virsh dumpxml test01 > /etc/libvirt/qemu/test02.xml
[root@centos7-1 ~]# ls /etc/libvirt/qemu/
autostart networks test01.xml test02.xml
- 虚拟机的删除与添加
删除虚拟机
[root@centos7-1 ~]# virsh shutdown test01
域 test01 被关闭
[root@centos7-1 ~]# virsh undefine test01
域 test01 已经被取消定义
查看删除结果,test01 的配置文件被删除,但是磁盘文件不会被删除。
[root@centos7-1 ~]# ls /etc/libvirt/qemu/
autostart networks test02.xml
通过 virsh list --all 查看不到 test01 的信息,说明此虚拟机被删除。
[root@centos7-1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
[root@centos7-1 ~]#
通过备份的配置文件重新定义虚拟机。
[root@centos7-1 ~]# cd /etc/libvirt/qemu
[root@centos7-1 qemu]# ls
autostart networks test02.xml
[root@centos7-1 qemu]# mv test02.xml test01.xml
重新定义虚拟机。
[root@centos7-1 qemu]# virsh define test01.xml
定义域 test01(从 test01.xml)
查看虚拟机信息
[root@centos7-1 qemu]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
- 修改虚拟机配置信息(用来修改系统内存大小、磁盘文件等信息)
直接通过 vim 命令修改
[root@centos7-1 ~]# vim /etc/libvirt/qemu/test01.xml
通过 virsh 命令修改。
[root@centos7-1 ~]# virsh edit test01
2)KVM 文件管理
通过文件管理可以直接查看、修改、复制虚拟机的内部文件。例如,当系统因为配置问题无法启动时,可以直接修改虚拟机的文件。虚拟机磁盘文件有 raw、 qcow2 与 qed 格式, KVM 虚拟机默认使用 qcow2 格式。这里介绍本地 YUM 安装 libguestfs-tools 后产生的命令行工具,这个工具可以直接读取 qcow2 格式的磁盘文件。
- 查看当前磁盘格式
[root@centos7-1 ~]# qemu-img info /data_kvm/store/test01.qcow2
image: /data_kvm/store/test01.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 2.0G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
- virt-cat 命令,类似于 cat 命令
使用这个命令需要安装 libguestfs-tools-c 工具包。
[root@centos7-1 ~]# yum -y install libguestfs-tools-c
[root@centos7-1 ~]# virt-cat -a /data_kvm/store/test01.qcow2 /etc/sysconfig/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
- virt-edit 命令
virt-edit 命令,用于编辑文件,用法与 vim 基本一致。
[root@centos7-1 ~]# virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf
- virt-df 命令
virt-df 命令用于查看虚拟机磁盘信息。
[root@centos7-1 ~]# virt-df -h test01
文件系统 大小 已用空间 可用空间 使用百分比%
test01:/dev/sda1 1014M 107M 907M 11%
test01:/dev/centos/root 8.0G 1.6G 6.4G 20%
3)虚拟机克隆
- 查看虚拟机状态
[root@centos7-1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
- 从 test01 克隆 test02
[root@centos7-1 ~]# virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
- 查看虚拟机状态
[root@centos7-1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
- test02 关闭
- 启动虚拟机
[root@centos7-1 ~]# virsh start test02
域 test02 已开始
4)虚拟机快照
KVM 虚拟机要使用镜像功能,磁盘格式必须为 qcow2。下面介绍 KVM 虚拟机快照备份的过程。
- 对 test01 创建快照
[root@centos7-1 ~]# virsh snapshot-create test01
已生成域快照 1712477545
- 查看虚拟机快照版本信息
[root@centos7-1 ~]# virsh snapshot-current test01
<domainsnapshot>
<name>1712477545</name> //快照版本号
<state>shutoff</state>
......//省略部分输出信息
- 查看快照信息
[root@centos7-1 ~]# virsh snapshot-list test01
名称 生成时间 状态
------------------------------------------------------------
1712477545 2024-04-07 16:12:25 +0800 shutoff
- 创建新快照
[root@centos7-1 ~]# virsh snapshot-create test01
已生成域快照 1712477694
- 查看快照信息
[root@centos7-1 ~]# virsh snapshot-list test01
名称 生成时间 状态
------------------------------------------------------------
1712477545 2024-04-07 16:12:25 +0800 shutoff
1712477694 2024-04-07 16:14:54 +0800 shutoff
- 恢复虚拟机状态至 1712477545
[root@centos7-1 ~]# virsh snapshot-revert test01 1712477545
- 查看虚拟机快照版本信息
[root@centos7-1 ~]# virsh snapshot-current test01
<domainsnapshot>
<name>1712477545</name> //快照版本号
<state>shutoff</state>
......//省略部分输出
- 删除快照
[root@centos7-1 ~]# virsh snapshot-delete test01 1712477545
已删除域快照 1712477545