赞
踩
目录
公司部分 Linux 服务器硬件资源利用率不高,为了充分利用这些 Linux 服务器,可以部署 KVM,在物理机上运行多个业务系统。例如,在运行 Nginx 的服务器上部署 KVM,然后在 KVM 虚拟机上运行 Tomcat 等服务。
KVM 自 Linux 2.6.20 版本后就直接整合到 Linux 内核,它依托 CPU 虚拟化指令集(如 Intel-VT、AMD-V)实现高性能的虚拟化支持。由于与 Linux 内核高度整合,因此在性能、 安全性、兼容性、稳定性上都有很好的表现。
下图简单描绘了 KVM 虚拟化架构,在 KVM 环境中运行的每一个虚拟化操作系统都将表现为单个独立的系统进程。因此它可以很方便地与 Linux 系统中的安全模块进行整合 (SELinux),可以灵活地实现资源的管理及分配。
KVM 虚拟化架构
广义的 KVM 实际上包含两部分,一部分是基于 Linux 内核支持的 KVM 内核模块,另一部分就是经过简化和修改的 Qemu。
KVM 内核模块是模拟处理器和内存以支持虚拟机的运行,Qemu 主要处理 I/O 以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合、相辅相成,构成了一个完整的虚拟化平台。
需要注意的是,Qemu 本身并不是 KVM 的一部分,Qemu 是一套完整的虚拟化解决方案,是纯软件实现虚拟化,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟出来的,所以 Qemu 的性能比较低。
KVM 模块是让 Linux 主机成为一个虚拟机监视器(VMM),并且在原有 Linux 内核模式和用户模式的两种执行模式基础上新增加了客户模式,客户模式也拥有自己的内核模式和用户模式。
客户模式:可以简单理解成客户机在操作系统运行中的模式,客户模式又分为内核模式和用户模式。客户模式中的内核模式和用户模式的作用分别如下所示。
三种模式层次关系图如下图所示:
三种模式关系层次图
用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。KVM Driver 为虚拟机创建虚拟 CPU 和虚拟内存,然后执行 VMLAUNCH 指令进入客户模式,装载 Guest OS 并运行。Guest OS 运行过程中如果发生中断或者影子缺页等异常,将暂停 Guest OS 的运行并保存当前上下文退出到内核模式来处理这些异常。内核模式处理这些异常时如果不需要 I/O 则处理完成后重新进入客户模式。如果需要 I/O 则进入到用户模式,由 Qemu 来处 理 I/O,处理完成后进入内核模式,再进入客户模式,工作原理如下图所示。
工作原理图
采用 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,并且勾选虚拟化引擎,如下图所示
在 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
宿主服务器安装完成 KVM,首先要设定网络,在 libvirt 中运行 KVM 网络有两种方法: NAT 和 Bridge,默认是 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
出现以上信息,说明网卡桥接成功了。
[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 安装界面
- [root@centos7-1 ~]# virsh -h
- ......//省略输出内容
- [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
通过文件管理可以直接查看、修改、复制虚拟机的内部文件。例如,当系统因为配置问题无法启动时,可以直接修改虚拟机的文件。虚拟机磁盘文件有 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
使用这个命令需要安装 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 命令,用于编辑文件,用法与 vim 基本一致。
[root@centos7-1 ~]# virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf
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%
- [root@centos7-1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- - test01 关闭
[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 已开始
KVM 虚拟机要使用镜像功能,磁盘格式必须为 qcow2。下面介绍 KVM 虚拟机快照备份的过程。
- [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
[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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。