前言简述
随着数字化转型的深入,企业对 IT 基础设施的要求越来越高,虚拟化、云计算技术日益成熟,虚拟化技术和云计算平台的结合,为实现资源的灵活调配、提高运营效率以及降低成本提供了可能,所以逐渐被大家所接受和应用,往云(共有、私有、自建)上迁移也是趋势,虚拟化作为云服务的基石,器重要性不言而喻,或许你很早知道 VMware,然后听过 Xen/Citrix /Hyper-v,然后再是开源的 KVM 等众多的虚拟化引擎横空出世。
当下不论是运维、开放或测试人员,或多或少的会使用到虚拟化技术,总的来说无论你使用的那种虚拟化技术,开源的 KVM 虚拟化方案无疑是最值得你去了解和学习,可以帮助我们一步一步学习虚拟机技术而且能帮助我们快速将云落地。
背景
虚拟化技术从 2008年开始越来越热,经过一个大爆发的阶段,在 2015 年左右,国内新一代的公有云底层基本采用 KVM ,以原本一些采用 Xen 国内云平台也逐步向 KVM 迁移,并且随着 OpenStack 技术的发展更是将 KVM 作为底层,经过几年的快速发展,KVM 技术已经非常成熟稳定,在任何 Linux 发行版本中 KVM 已成事实上的标配,以及在 Proxmox VE、Zstack 中都能看到看到 KVM 的身影。
发展
KVM 是一种开源的虚拟化技术,在其诞生之日时旧吸取了其它虚拟化技术的优点,虚拟化技术的演变过程主要可分为软件模拟,虚拟化层翻译,容器虚拟化三个大的阶段。
1.软件模拟的技术
通过软件完全模拟CPU、芯片组、磁盘、网卡等计算机硬件。
优点:理论上可模拟任何硬件以及不存在的硬件。
缺点:非常低效。
使用场景:研究测试
典型产品:Bochs、QEMU
2.虚拟化层翻译
通过虚拟化引擎捕获虚拟机的指令进行处理,从而实现在虚拟机上使用物理机一样的指令,但是虚拟机不能对硬件进行操作,例如:重启虚拟机不会影响宿主机。
X86 平台指令集划分为4个特权模式:Ring0(操作系统使用)、Ring1|Ring2(驱动程序使用)、Ring3 (应用程序),在虚拟化方面有一个难点那就是如何将虚拟机越级的指令使用进行隔离,VMware 最早解决方法是对虚拟机指令的使用进行捕获译。
虚拟化层翻译又区分为
软件捕获翻译:软件全虚拟化。虚拟机系统内核加载虚拟化层翻译,即半虚拟化,由 Xen 早期提出思路,由虚拟机自己对特殊的指令进行更改,然后和虚拟化层一起配合工作,这也是其早期一直要使用的一个特殊内核原因,虽然改造的虚拟机在使用上有限制(例如:不支持Windows虚拟机)配置麻烦,但是此种效率非常高。
硬件支持的虚拟化层翻译,即硬件支持的全虚拟化(当前主流虚拟化解决方案),由 Intel 推出的硬件方式对 CPU 指令进行改造,即 VT-x 有两种模式一种是 VMX root operation (VMM 运行所在)和 VMX non-root operation (虚拟机运行所在),这两种操作模式都支持 Ring 0 ~ Ring 3 这四个特权级。
由于是基于硬件其效率非常高,并且当前趋势不仅 CPU 指令有硬件解决方案,I/O通信也有硬件解决方案称为 VT-d,网络通信也有硬件解决方案称为 VT-c。
总之,借助虚拟化,我们可在单一硬件上快速启动和停止不同的操作系统环境,从而为您的 IT 生态系统带来诸多益处。
3.容器虚拟化
通过 CGroups、Namespace 等技术将进程进行隔离,每个进程就像一台单独的虚拟机一样。有被自己隔离出来的资源,也有自己根目录,独立的进程编号,被隔离的内存空间。
基于容器的虚拟化可以实现在单一内核上运行多个实例,因此是一个更高效的虚拟化方式。
典型产品:Docker、Podman、LXC/LXD
[!tips] 知识扩展
1.Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包成一个轻量级、可移植的容器,然后可以在任何支持Docker的Linux机器上运行。2.LXC 是一种操作系统级别的虚拟化技术,允许用户独立创建和运行多个虚拟 Linux 环境。与 Docker 相比,LXC 更轻便,更安全,因为它消耗的资源更少,并且不需要以 root 身份运行。
3.Podman 是一个虚拟化的容器管理器,可用于 Linux 发行版。它的特殊之处在于它不需要运行 Daemon,而是直接在 runC 上运行。
介绍
什么是 KVM?
基于内核的虚拟机(KVM,Kernel-based Virtual Machine))是 Linux® 操作系统的一种开源虚拟化技术。借助 KVM,Linux 可作为虚拟机监控程序运行多个独立的虚拟机(VM)。
官方网站:https://linux-kvm.org/
参考地址:https://www.redhat.com/zh-cn/topics/virtualization/what-is-KVM
历史
KVM 最初是由以色列的公司 Qumranet 开发的,后被 Redhat 红帽收购。
- 2006 年发布,一年后并入 Linux 内核。2007 年 2 月被正式合并到 Linux 2.6.20 核心中,成为内核源代码的一部分。2008 年 9 月 Redhat 收购了Qumranet ,RHEL 5.4 中开始使用 KVM 替换 Xen,并从 RHEL 6 开始 KVM 已经称为默认的虚拟化引擎。并从 Intel-VT 或 AMD-D X86 平台逐步移植到 S/390、PowerPC 与 IA-64 平台,在 Linux 内核 3.9 版本中加入对 ARM 架构的支持。许多开源虚拟化技术(包括红帽的虚拟化产品组合)均包含 KVM 这一组件。
架构
KVM 包含为处理器提供底层虚拟化、可加载的核心模块 kvm.ko (kvm-intel.ko 或 kvm-amd.ko),使用 QEMU(QEMU-KVM) 作为虚拟机上层控制工具,简单来说 KVM 就是内核的一个模块,用户空间通过 QEMU 模拟硬件提供给虚拟机使用,一台虚拟机就是一个普通的Linux进程,通过对该进行管理就可以完成对虚拟机的管理,例如,当下流行的 Proxmox VE 虚拟化管理平台便是通过对 KVM 进程的管理来实现对虚拟机的管理。
由于对进程管理较为麻烦,Redhat 发布了一个开源项目 Libvirt 通过 API 或 virsh 命令行工具完成对虚拟机管理,当前绝大多数管理平台都是通过 Libvirt 来完成对 KVM 虚拟机的管理,如:OpenStack、CloudStack、OpenNebula。
当然也可通过虚拟机管理器(称为 VMM 或 virt-manager)为虚拟机提供了一个桌面界面,适用于主流的 Linux 发行版;除此之外虚拟机管理员可以选择使用基于 Web 的界面来管理虚拟机。例如,借助 Cockpit 提供的解决方案,用户可以从 Web 界面管理虚拟机。对于 Kubernetes 云原生环境 Redhat 红帽推出了 KubeVirt 让用户能够使用 Kubernetes 作为底层编排平台来运行、部署和管理虚拟机(VM).
在上文中多次出现 QEMU 以及 Libvirt ,下面作者简单总结其与 KVM 的关系。
QEMU 与 KVM
QEMU 是开源项目,实际上是一台硬件模拟器,用于模拟硬件包括但不限于 X86、AMD64、MIPS R4000、ARM v6/v7(Cortex-A8、A9、A15)、SPARC sun 和 PowerPC 等架构,可运行在 Linux、Windows、MacOS 等平台中。
它可在其它平台上运行 Linux 程序,可存储还原虚拟运行状态,还可虚拟多种设备(网卡、多CPU、IDE、软驱、显卡、声卡、并串口设备、USB设备、键盘鼠标、蓝牙等),除此之外还内建 DHCP、DNS、SMB/TFTP 等服务。
QEMU 又是怎么与 KVM 勾搭上的呢?
在 QEMU 1.0 版本时有一个 QEMU 和 KVM 结合的分支,当时KVM仅仅是一个内核模板,并无用户空间的管理工具,随即一拍即合,KVM 借用 QEMU 能力管理虚拟机,而 QEMU 则借助 KVM 来加速提升虚拟机性能。
QEMU-KVM 发布了三个正式版本 1.1、1.2、1.3,随后于 QEMU 的主版本合并,至此 QEMU 和 KVM 紧密结合起来了,KVM 最后一个自己的版本是 KVM 83,后续便和内核版本一起发布,所以你版本号与内核版本是一致的。
Libvirt 与 KVM
LIbvirt 是一套开源的虚拟机管理工具,支持对虚拟机生命周期管理,以及虚拟网卡、硬盘、CPU、内存等多种设备热添加,主要由三部分组成,API 库(支持:C、Python、Ruby 等)、Libvirt 服务、命令行工具 virsh,设计目标是通过相同的方式管理不同的虚拟化引擎(KVM、Xen、HyperV、VMware ESX),实际场景中多数使用 Libvirtd 还是 KVM。
此外它还支持远程的宿主机管理(需在服务端做好配置),就可以远程通过 Libvirt 进行虚拟机的配置,通道有 SSH 、TCP、基于 TCP 的 TLS 等。在存储资源管理方面,支持本地文件系统目录、裸设备、LVM、nfs、iscsi 等方式,在虚拟机磁盘格式上支持 qcow2、vmdk、raw 等格式。最后在网络资源管理支持 Linux 桥,VLAN,多网卡绑定管理,比较新的版本还支持 Open vSwitch 、NAT和路由方式的网络,利用防火墙让虚拟机通过宿主机建立网络通道,使之与外部网络进行通信。
优势
目前常见的企业级虚拟化产品有 VMware、HyperV、Xen、KVM,在介绍 KVM 优势前简单介绍一下。
VMware
目前已被博通收购,最早推出 X86 平台虚拟化引擎,它在1999年发布了第一款产品,经过几十年发展和社会检验,产品成熟稳定兼容性好,并且在虚拟化网络、存储方法都有对应解决办法,虚拟化产品线针对个人使用 VMware Workstation 是免费的,针对苹果用户的是 VMware Funsion,针对企业级用户的 VMware ESXi 服务器,管理工具主要是 VMware vSphere vCenter 套件。
Hyper-V
微软推出的虚一款非开源虚拟机收费产品,在 Windows Server 2012 R2 中 Hyper-V 支持许多非常新的虚拟化特性,但必须使用 X64 位操作系统,并且需配置 Windows 域、Windows Server 集群,利用 SCVMM 集群管理工具进行多台主机管理。
Xen
最早开源的虚拟化引擎,由剑桥大学开发,半虚拟化也是由 Xen 提出,后被思杰收购推出一套 XenServer 的管理工具,于 2013 年底宣布免费,目前由于 Xen 推出时间长、兼容性、稳定性都还不错,目前使用 Xen 的主要是一些在 Xen 上面技术积累较多的企业。
KVM 相比较于上述虚拟化产品还是比较年轻的,所以在其诞生之日开始就吸取了其它虚拟化技术的优点,一开始就支持硬件虚拟化技术,没有历史兼容性问题,性能非常不错,目前 KVM 是 OpenStack、Proxmox VE 平台上首选的虚拟化引擎。
简单来说 KVM 优势主要是体现在以下几点:
- 开源免费、社区支持(当然若需要商业级支持,也可购买红帽公司的服务)好。通过 安全增强型 Linux(SELinux)和安全虚拟化(sVirt)组合来加强虚拟机的安全性和隔离性。使用 Linux 支持的任何存储,包括某些本地磁盘和网络附加存储(NAS)。KVM 还支持共享文件系统,因此虚拟机镜像可以由多个主机共享。在多种硬件平台上运行,KVM 支持 64 位 AMD、英特尔和 ARM 架构以及 IBM z13 系统及更高版本。 支持实时迁移,即能够在物理主机之间移动运行中的虚拟机,而不会出现明显的服务中断。
选择
前面介绍 虚拟化技术的演变、KVM 历史、架构、优势,对于企业来说是否需要 KVM 来实现企业内部虚拟化平台底部基础设施,可参考如下几个方面
业务类型:互联网行业(BAT)KVM 虚拟化技术使用最广泛,其次中小型企业也推荐使用 KVM 技术。
成本要求:虚拟化真正实现资源池化,使得将服务器资源进行切割,做到资源随取随用,有效节约成本,提高资源利用率,企业使用 KVM 技术更不需要在虚拟化方面支付额外费用,可进一步节省企业IT成本
快速迁移:支持快速部署、在线迁移、系统层面的高可用,进一步提高业务应用的可用性。
01 KVM 安装实践
作者为了方便演示没有采用物理机安装Linux,而是在自己 Windows 测试电脑中安装 VMware Workstation 虚拟化进行 CentOS 操作系统安装,利用其安装 KVM 进行实践,当然若你有硬件服务器也可安装此流程步骤安装,不过得需要提前打开 CPU 的硬件虚拟化特性以及制作安装操作安装启动盘。
温馨提示:在安装 KVM 虚拟化之前需先确认 CPU 虚拟化支持是否开启,不同厂商的服务器进入 BIOS 配置界面快捷键有所不同,通常会在开机启动的第一个画面中有一些提示按键,例如 DELL R系列按 F2 进入BIOS配置,选择 Processor Setting 按Enter键进入到子菜单,其中一项 Virtualization Technology 配置为 Enabled ,当然不同厂商服务器 CPU Virtualization Technology 开关位置也是有区别的,通常是在处理器配置菜单之下,实在找不到时就 Google 吧。
# 方式1.官网查看对于CPU是否支持虚拟化。
# 方式2.使用下述命令执行查看 cpu 是否支持虚拟化(PS: 一般来说近几年的服务器CPU都是支持的)
egerp '(vmx|svm)' /proc/CPUinfo
环境准备
- 虚拟化软件:VMware Workstation 16 网盘下载OS 版本架构: CentOS/7.9.2009/x86_64/ 官网下载 ,亦可选择 Redhat 9 最新操作系统进行安装使用。
# 需求选择:此处测试选择使用 `CentOS-7-x86_64-DVD-2009.iso` 进行安装桌面版本的操作,选择CentOS-7-x86_64-Minimal-2009.iso进行KVM虚拟机安装
CentOS-7-x86_64-DVD-2009.iso 04-Nov-2020 19:37 4G
CentOS-7-x86_64-DVD-2009.iso 04-Nov-2020 19:37 4G
CentOS-7-x86_64-DVD-2009.torrent 06-Nov-2020 22:44 176K
CentOS-7-x86_64-Everything-2009.iso 02-Nov-2020 23:18 10G
CentOS-7-x86_64-Everything-2009.torrent 06-Nov-2020 22:44 381K
CentOS-7-x86_64-Minimal-2009.iso 03-Nov-2020 22:55 973M
CentOS-7-x86_64-Minimal-2009.torrent 06-Nov-2020 22:44 39K
CentOS-7-x86_64-NetInstall-2009.iso 27-Oct-2020 00:26 575M
CentOS-7-x86_64-NetInstall-2009.torrent 06-Nov-2020 22:44 23K
安装流程
描述: 当基础环境准备好后我们就需要开始创建 KVM-Server 的虚拟机了,在我们准备的 VMware Workstation 16 进行配置基础的操作系统,然后在此系统中安装KVM相应软件。
步骤 01.如图所示根据需求进行配置虚拟机,注意必须勾选虚拟化引擎来或者硬件辅助虚拟化的支持,例如虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(V)
步骤 02.选择创建带有桌面的CentOS 7的版本,并且开启网络和设置主机名称方便后续连接。
步骤 03.安装完成启动系统并进入以下界面后,输入对于的命令进行简单设置与查看
# (0) 内核查看 (一般正常版本在2.6以上)
$ uname -a
Linux kvm-server 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
# (1) 关闭和禁用防火墙
[root@kvm-server ~]# systemctl stop firewalld.service
[root@kvm-server ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
# (2) 关闭selinux
[root@kvm-server ~]# sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
[root@kvm-server ~]# setenforce 0
# (3) 查看CPU是否支持VT技术
grep -E 'vmx|svm' /proc/cpuinfo
# 本机支持的vmx的虚拟化即Intel的处理器支持的。(有几个处理器就显示几个flags)
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx
步骤 04.环境清理卸载系统原本存在的KVM以及安装新的软件
# 1.旧的版本
rpm -qa | egrep 'qemu|virt|kvm'
# libvirt-daemon-driver-nwfilter-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-storage-mpath-4.5.0-36.el7.x86_64
# libvirt-libs-4.5.0-36.el7.x86_64
# libvirt-gobject-1.0.0-1.el7.x86_64
# qemu-guest-agent-2.12.0-3.el7.x86_64
# libvirt-daemon-driver-storage-logical-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-interface-4.5.0-36.el7.x86_64
# libvirt-glib-1.0.0-1.el7.x86_64
# libgovirt-0.3.4-5.el7.x86_64
# virt-what-1.18-4.el7.x86_64
# libvirt-daemon-driver-storage-disk-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-storage-gluster-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-storage-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-network-4.5.0-36.el7.x86_64
# libvirt-daemon-config-network-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-nodedev-4.5.0-36.el7.x86_64
# qemu-img-1.5.3-175.el7.x86_64
# libvirt-daemon-driver-storage-core-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-storage-iscsi-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-storage-rbd-4.5.0-36.el7.x86_64
# qemu-kvm-common-1.5.3-175.el7.x86_64
# libvirt-daemon-driver-qemu-4.5.0-36.el7.x86_64
# libvirt-daemon-driver-secret-4.5.0-36.el7.x86_64
# ipxe-roms-qemu-20180825-3.git133f4c.el7.noarch
# qemu-kvm-1.5.3-175.el7.x86_64
# libvirt-daemon-driver-storage-scsi-4.5.0-36.el7.x86_64
# libvirt-daemon-kvm-4.5.0-36.el7.x86_64
# libvirt-gconfig-1.0.0-1.el7.x86_64
# libvirt-daemon-4.5.0-36.el7.x86_64
# 2.卸载
yum remove `rpm -qa | egrep 'qemu|virt|kvm'` -y
# 3.清空目录文件夹
rm -rf /var/lib/libvirt/ /etc/libvirt
# 4.安装软件(如果安装过程出错请检查是否是操作系统的问题-此处我是很顺利的)
yum install *qemu* *virt* librbd1-devel -y # CentOS 7
# yum upgrade rpm -y && yum install *qemu* *virt* librbd1-devel -y # CentOS 8
步骤 05.在所谓的KVM技术中运用到的就是 QEMU+KVM的组合实现真正意义上的服务器虚拟化。
- KVM : 负责 CPU的虚拟化 + 内存的虚拟化 但却不能模拟其它设备。
- QEMU : 负责 IO设备的模拟例如磁盘 和 网络
# 安装的包简单介绍
1) qemu-kvm : 主包
2) libvirt : 调用KVM虚拟机技术的 Api 接口主要用于管理的作用。
3) virt-manager : 图形管理程序与hypervisor进行交互的作用。
步骤 06.安装完成后启动libvirtd服务并查看KVM模块是是否安装
[root@kvm-server ~]# systemctl start libvirtd.service && systemctl enable libvirtd.service
[root@kvm-server ~]# lsmod | grep "kvm"
kvm_intel 188740 0
kvm 637289 1 kvm_intel
irqbypass 13503 1 kvm
至此,在 CentOS 7 中安装 kvm 环境完毕。
温馨提示:若文章代码块中存在乱码或不能复制,请联系作者,也可阅读原文链接,或加入知识星球(支持作者)中阅读.
原文链接:https://articles.zsxq.com/id_nmnrdv8ww7wr.html
学习:作者知识星球
『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。
726