目录

  • 一.KVM简介:
  • 二.KVM的特性
  • 三.KVM 是实现拦截虚机的 I/O 请求的原理
  • 四.KVM QEMU-KVM
  • 五.KVM 的功能列表
  • 六.KVM 工具集合
  • 七.虚拟化前后对比
  • 虚拟化前
  • 虚拟化后
  • 对比:
  • 软硬件结合
  • 八.kvm虚拟化平台部署
  • 8.1实验环境
  • 8.1.1 挂载光盘镜像
  • 8.1.2 环境优化
  • 8.1.3制作本地yum仓库
  • 8.1.4 关闭防火墙、核心防护
  • 8.2安装KVM
  • 8.2.1安装KVM基本组件
  • 8.2.2 查看KVM模块是否安装
  • 8.2.3 设置开启启动界面的显示模式
  • 8.3 设置KVM网络
  • 8.3.1 使用Bridge网桥模式进行部署
  • 8.3.2使用虚拟系统管理器管理虚拟机
  • 8.4 新建虚拟机


一.KVM简介:

广义KVM:
KVM(Kernel-based Vritual Machine)–基于内核的虚拟机
KVM 是基于虚拟化扩展的X86硬件的开源Linux原生的全虚拟化方案(要求cpu支持Intel-VT-x或AMD-V)
KVM内嵌于内核模块中,模拟处理器和内存以支持虚拟机运行
虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;
虚拟机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能
但KVM本身不执行任何模拟。需要客户空间程序(虚拟机)通过/dev/kvm(此虚拟设备需要开起硬件辅助虚拟化才能看到)接口设置一个客户机虚拟服务器的地址空间,
并且由Qemu模拟I/O(ioctl)进行调度资源和维护管理
Libvirt:KVM的管理工具,除了可以管理KVM这类VMM,还可以管理Xen,VirtualBox,甚至OpenStack底层
Libvirt包含3个组件:后台daemon程序libvirtd、API库、命令行工具virsh

二.KVM的特性

优势
① 集中化管理(远程管理、维护)
② 提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了“空闲”容量)
③ 动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
④ 高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
劣势
① 前期高额费用(初期的硬件支持)
② 降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
③ 更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)
④ 实施配置复杂、管理复杂(管理人员运维、排障困难)
⑤ 一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
⑥ 安全性(虚拟化技术自身的安全隐患

三.KVM 是实现拦截虚机的 I/O 请求的原理

现代 CPU 本身实现了对特殊指令的截获和重定向的硬件支持,甚至新硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化从而提高性能。以 X86 平台为例,支持虚拟化技术的 CPU 带有特别优化过的指令集来控制虚拟化过程。通过这些指令集,VMM 很容易将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机运行,将控制权交回给 VMM 处理。VMM 还可以利用硬件的虚级化增强机制,将客户机在受限模式下对一些特定资源的访问,完全由硬件重定向到 VMM 指定的虚拟资源,整个过程不需要暂停客户机的运行和 VMM 的参与。由于虚拟化硬件提供全新的架构,支持操作系统直接在上面运行,无需进行二进制转换,减少了相关的性能开销,极大简化了VMM的设计,使得VMM性能更加强大。从 2005 年开始,Intel 在其处理器产品线中推广 Intel Virtualization Technology 即 IntelVT 技术。

四.KVM QEMU-KVM

KVM 内核模块在运行时按需加载进入内核空间运行。KVM 本身不执行任何设备模拟,需要 QEMU 通过 /dev/kvm 接口设置一个 GUEST OS 的地址空间,向它提供模拟的 I/O 设备,并将它的视频显示映射回宿主机的显示屏。它是KVM 虚机的核心部分,其主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚机的运行提供一定的支持。以在 Intel 上运行为例,KVM 模块被加载的时候,它:
首先初始化内部的数据结构;
做好准备后,KVM 模块检测当前的 CPU,然后打开 CPU 控制及存取 CR4 的虚拟化模式开关,并通过执行 VMXON 指令将宿主操作系统置于虚拟化模式的根模式;
最后,KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令。

接下来的虚机的创建和运行将是 QEMU 和 KVM 相互配合的过程。两者的通信接口主要是一系列针对特殊设备文件 /dev/kvm 的 IOCTL 调用。其中最重要的是创建虚机。它可以理解成KVM 为了某个特定的虚机创建对应的内核数据结构,同时,KVM 返回一个文件句柄来代表所创建的虚机。

针对该句柄的调用可以对虚机做相应地管理,比如创建用户空间虚拟地址和客户机物理地址、真实物理地址之间的映射关系,再比如创建多个 vCPU。KVM 为每一个 vCPU 生成对应的文件句柄,对其相应地 IOCTL 调用,就可以对vCPU进行管理。其中最重要的就是“执行虚拟处理器”。通过它,虚机在 KVM 的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都被CPU捕捉到,CPU 在保存现场之后自动切换到根模式,由 KVM 决定如何处理。

除了 CPU 的虚拟化,内存虚拟化也由 KVM 实现。实际上,内存虚拟化往往是一个虚机实现中最复杂的部分。CPU 中的内存管理单元 MMU 是通过页表的形式将程序运行的虚拟地址转换成实际物理地址。在虚拟机模式下,MMU 的页表则必须在一次查询的时候完成两次地址转换。因为除了将客户机程序的虚拟地址转换了客户机的物理地址外,还要将客户机物理地址转化成真实物理地址。

其实 QEMU 原本不是 KVM 的一部分,它自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是,QEMU 代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及 KVM需要使用到的虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。
为了简化代码,KVM 在 QEMU 的基础上做了修改。VM 运行期间,QEMU 会通过 KVM 模块提供的系统调用进入内核,由 KVM 负责将虚拟机置于处理的特殊模式运行。当虚机进行 I/O 操作时,KVM 会从上次系统调用出口处返回 QEMU,由 QEMU 来负责解析和模拟这些设备。

从 QEMU 角度看,也可以说是 QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚机提供了硬件虚拟化加速。除此以外,虚机的配置和创建、虚机运行所依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是 QEMU 自己实现的。

五.KVM 的功能列表

KVM 所支持的功能包括:
支持 CPU 和 memory 超分(Overcommit)
支持半虚拟化 I/O (virtio)
支持热插拔 (cpu,块设备、网络设备等)
支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
支持实时迁移(Live Migration)
支持 PCI 设备直接分配和 单根 I/O 虚拟化 (SR-IOV)
支持 内核同页合并 (KSM )
支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )

六.KVM 工具集合

libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等在内的多种 Hypervisor。
Virsh:基于 libvirt 的 命令行工具 (CLI)
Virt-Manager:基于 libvirt 的 GUI 工具
virt-v2v:虚机格式迁移工具
virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等
sVirt:安全工具

七.虚拟化前后对比

虚拟化前

① 每台主机拥有一个操作系统
② 软硬件紧密结合
③ 在同一个主机上运行多个应用程序通常会产生冲突
④ 系统资源利用率低(例如:5%)
⑤ 硬件成本高昂并且不够灵活

虚拟化后

① 打破了操作系统和硬件的互相依赖
② 通过封装到虚拟机的技术,管理操作系统和应用程序为单一的个体
③ 强大的安全和故障隔离
④ 虚拟机时独立于硬件的,它们可以在任何硬件上运行

对比:

操作系统方面(虚拟化前):
LAMP 架构中(以一台主机实现)
LINUX + Apache + MySQL + PHP
其中Apache 与 MySQL资源是共享的
如果架构要求服务间的安全性隔离比较高的话,Apache的页面和MySQL数据库的目录一定是不能互相碰面,如果Apache漏洞暴露出来,攻击者就
可以Apache的进程访问到MySQL的数据目录,从而获取MySQL中的数据,这种就是严重的安全隐患
而想解决这种潜在危险,可以通过实现内核级别的隔离(使用虚拟化技术)

软硬件结合

因为硬件和操作系统不兼容或者不支持,导致有些软、硬件功能无法正常使用(也是最难的问题)
使用虚拟化,软硬件之间是会通过虚拟化层驱动进行隔离(调配)的,
只要虚拟化层可以识别软/硬件应用,就可以将软硬件结合使用

在同一个主机上运行多个应用程序通常会产生冲突
Apache和Nginx 定位相同(80端口)
只能使用反向代理的方式进行分离,而同时如果在同一台机器使用这种方式,Apache
和Nginx中重要的数据文件如果同时被泄露出去…而虚拟化可以隔离服务

八.kvm虚拟化平台部署

8.1实验环境

8.1.1 挂载光盘镜像

windows部署cockpit和kvm kvm部署详解_虚拟化

8.1.2 环境优化

vim /etc/ssh/sshd_config      #取消DNS注释,改为NO

windows部署cockpit和kvm kvm部署详解_虚拟机_02

8.1.3制作本地yum仓库

[local]
name=kvm
baseurl=file:///mnt
gpgcheck=0
enabled=1
yum clean all     #清空依赖关系
yum repolist

windows部署cockpit和kvm kvm部署详解_服务器_03

8.1.4 关闭防火墙、核心防护

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

8.2安装KVM

8.2.1安装KVM基本组件

安装 GNOME 桌面环境  如果装了图形界面可以不需要装
yum groupinstall -y "GNOME Desktop"
KVM 模块
yum -y install qemu-kvm
安装KVM 调试工具,可不安装
yum -y install qemu-kvm-tools
构建虚拟机的命令行工具
yum -y install virt-install
qemu 组件,创建磁盘、启动虚拟机等
yum -y install qemu-img
网络支持工具
yum -y install bridge-utils
虚拟机管理工具
yum -y install libvirt
图形界面管理虚拟机	
yum -y install virt-manager

8.2.2 查看KVM模块是否安装

windows部署cockpit和kvm kvm部署详解_虚拟化_04

8.2.3 设置开启启动界面的显示模式

ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target

8.3 设置KVM网络

KVM网络的两种模式:
① NAT: 默认设置,数据包由 NAT 方式通过主机的接口进行
传送,可以访问外网,但是无法从外部访问虚拟机网络
② 网桥:这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持(一般有线网卡都支持)

8.3.1 使用Bridge网桥模式进行部署

vi /etc/sysconfig/network-scripts/ifcfg-ens33
BRIDGE=br0			#删除原先地址,设置为网桥模式,关联br0
[root@localhost network-scripts]# vi br0 
TYPE=Bridge
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=20.0.0.141
NETMASK=255.255.255.0
GATEWAY=20.0.0.2

windows部署cockpit和kvm kvm部署详解_Apache_05


windows部署cockpit和kvm kvm部署详解_虚拟化_06

[root@kvm network-scripts]# mkdir -p /data_kvm/iso         #复制镜像源到iso内
[root@kvm network-scripts]# mkdir -p /data/_kvm/store

windows部署cockpit和kvm kvm部署详解_kvm_07

8.3.2使用虚拟系统管理器管理虚拟机

创建思路:

① 创建存储池(ISO、STORE)

② 添加存储卷

③ 创建虚拟机

创建store池

windows部署cockpit和kvm kvm部署详解_Apache_08


选择目录:data_kvm/store

windows部署cockpit和kvm kvm部署详解_kvm_09


windows部署cockpit和kvm kvm部署详解_Apache_10


创建iso池

选择目录:data-kvm/iso 可以看到镜像源点击打开

windows部署cockpit和kvm kvm部署详解_Apache_11

8.4 新建虚拟机

windows部署cockpit和kvm kvm部署详解_Apache_12


windows部署cockpit和kvm kvm部署详解_kvm_13

选择自定义安装

windows部署cockpit和kvm kvm部署详解_虚拟机_14


完成后,点击引导选项,主机引导时启动虚拟机,点击应用后,开始安装即可

windows部署cockpit和kvm kvm部署详解_Apache_15


windows部署cockpit和kvm kvm部署详解_虚拟机_16