KVM虚拟化介绍
摘要
虚拟化是云计算的基础。通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。
一、虚拟化介绍
物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。
根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为三种:
- 全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用,Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型
- 半虚拟化:基于普通的操作系统,需要修改操作系统
- 直通:直接使用物理硬件资源(需要支持,还不完善)
理论上讲:
全虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比半虚拟化要高;
半虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。
二、虚拟化优缺点
2.1、优势
① 集中化管理(远程管理、维护)
② 提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了“空闲”容量)
③ 动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
④ 高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
2.2、劣势
① 前期高额费用(初期的硬件支持)
② 降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
③ 更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)
④ 实施配置复杂、管理复杂(管理人员运维、排障困难)
⑤ 一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
⑥ 安全性(虚拟化技术自身的安全隐患)
三、虚拟化前后对比
3.1、为什么要使用虚拟化
①操作系统方面
LAMP 架构中,如果架构要求服务间的安全性隔离比较高的话,Apache的页面和MySQL数据库的目录一定是不能互相碰面,如果Apache漏洞暴露出来,攻击者就可以Apache的进程访问到MySQL的数据目录,从而获取MySQL中的数据,这种就是严重的安全隐患而想解决这种潜在危险,可以通过实现内核级别的隔离(使用虚拟化技术)。
②软硬件结合
因为硬件和操作系统不兼容或者不支持,导致有些软、硬件功能无法正常使用(也是最难的问题)使用虚拟化,软硬件之间是会通过虚拟化层驱动进行隔离(调配)的,只要虚拟化层可以识别软/硬件应用,就可以将软硬件结合使用
③ 端口冲突
Apache和Nginx 定位相同(80端口)只能使用反向代理的方式进行分离,而同时如果在同一台机器使用这种方式,Apache和Nginx中重要的数据文件如果同时被泄露出去,而虚拟化可以隔离服务。
3.2、虚拟化前后对比
3.2.1、虚拟化前
① 每台主机拥有一个操作系统
② 软硬件紧密结合
③ 在同一个主机上运行多个应用程序通常会产生冲突
④ 系统资源利用率低(例如:5%)
⑤ 硬件成本高昂并且不够灵活
3.2.2、虚拟化后
① 打破了操作系统和硬件的互相依赖
② 通过封装到虚拟机的技术,管理操作系统和应用程序为单一的个体
③ 强大的安全和故障隔离
④ 虚拟机时独立于硬件的,它们可以在任何硬件上运行
四、KVM介绍
KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。
那 IO 的虚拟化,比如存储和网络设备则是由 Linux 内核与Qemu来实现。
作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。
大家在网上看 KVM 相关文章的时候肯定经常会看到 Libvirt 这个东西。
Libvirt 就是 KVM 的管理工具。
其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。
Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
- libvirtd是服务程序,接收和处理 API 请求;
- API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;
- virsh 是我们经常要用的 KVM 命令行工具
KVM实际应用:
可以应用于Vmware workstation、virtualbox等,主要是模拟硬件资源/设备
五、KVM结构与原理分析
5.1、结构图
5.2、原理分析
①客户模式:客户机在操作系统中运行的模式,客户机分为内核模式和用户模式作用如下:
②用户模式:为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O,Qemu工作在此模式下,主要控制libkvm工具(工具作用,控制内核中的KVM)来调用物理虚拟化资源,并通过ioctl来调用物理虚拟化资源来供虚拟机使用
③Linux内核模式:模拟内存、CPU,实现客户模式切换,处理从客户模式的推出,KVM即运行在此模式下,主要为虚拟机提供CPU、内存(硬件资源)的虚拟化,来供Qemu组件调用
5.3、KVM工作流程:
用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。 KVM驱动为虚拟机创建虚拟 CPU 和虚拟内存,然后执行 VMLAU·NCH 指令进入客户模式,装载 Guest OS 并运行。Guest OS 运行过程中如果发生异常,则暂停Guest OS的运行并保存当前状态同时退出到内核模式来处理这些异常。
内核模式处理这些异常时如果不需要 I/O则处理完成后重新进入客户模式。如果需要 I/O 则进入到用户模式, 则由 Qemu 来处理 I/O,处理完成后进入内核模式,再进入客户模式
六、KVM-创建虚拟机
6.1、部署环境
1 修改主机名
2 [root@server1 ~]# hostnamectl set-hostname kvm
3 [root@server1 ~]# su
4
5 将镜像光盘设为自动/永久挂载
6 [root@kvm ~]# vim /etc/fstab
7 /dev/cdrom /mnt iso9660 defaults 0 0 #末尾添加
8 [root@kvm ~]# mount -a
9 [root@kvm ~]# df -hT
10
11 制作本地仓库
12 [root@kvm ~]# cd /etc/yum.repos.d
13 [root@kvm yum.repos.d]# mkdir backup
14 [root@kvm yum.repos.d]# mv CentOS* backup
15 [root@kvm yum.repos.d]# vi local.repo
16 [local]
17 name=kvm
18 baseurl=file:///mnt
19 gpgcheck=0
20 enabled=1
21
22 重新加载Yum仓库
23 [root@kvm yum.repos.d]# yum clean all
24 [root@kvm yum.repos.d]# yum makecache
25
26 关闭防火墙和核心防护
27 [root@kvm yum.repos.d]# systemctl stop firewalld.service
28 [root@kvm yum.repos.d]# setenforce 0
6.2、安装KVM
①安装KVM基本组件
1 # 安装 GNOME 桌面环境 如果装了图形界面可以不需要装
2 [root@kvm yum.repos.d]# yum groupinstall -y "GNOME Desktop"
3 # KVM 模块
4 [root@kvm yum.repos.d]# yum -y install qemu-kvm
5 # 安装KVM 调试工具,可不安装
6 [root@kvm yum.repos.d]# yum -y install qemu-kvm-tools
7 # 构建虚拟机的命令行工具
8 [root@kvm yum.repos.d]# yum -y install virt-install
9 # qemu 组件,创建磁盘、启动虚拟机等
10 [root@kvm yum.repos.d]# yum -y install qemu-img
11 # 网络支持工具
12 [root@kvm yum.repos.d]# yum -y install bridge-utils
13 # 虚拟机管理工具
14 [root@kvm yum.repos.d]# yum -y install libvirt
15 # 图形界面管理虚拟机
16 [root@kvm yum.repos.d]# yum -y install virt-manager
②检测CPU是否支持虚拟化
1 [root@kvm ~]# cat /proc/cpuinfo | grep vmx
③查看KVM模块是否已安装
1 [root@kvm ~]# lsmod | grep kvm
2 kvm_intel 170086 0
3 kvm 566340 1 kvm_intel
4 irqbypass 13503 1 kvm
④设置开启启动界面的显示模式
1 [root@kvm ~]# ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
6.3、设置KVM网络
KVM网络的两种模式:
① NAT: 默认设置,数据包由 NAT 方式通过主机的接口进行传送,可以访问外网,但是无法从外部访问虚拟机网络
② 网桥:这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持(一般有线网卡都支持)
6.3.1、使用Bridge网桥模式进行部署
1 [root@kvm ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
6.3.2、创建、编辑桥接网卡
1 [root@kvm ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-br0
2 [root@kvm ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
6.3.3、重启网卡
1 [root@kvm ~]# systemctl restart network
2 [root@kvm ~]# ifconfig
3 br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
4 inet 20.0.0.10 netmask 255.255.255.0 broadcast 20.0.0.255
5 inet6 fe80::b6fc:d281:690b:eab1 prefixlen 64 scopeid 0x20<link>
6 ether 00:0c:29:9a:cd:27 txqueuelen 1000 (Ethernet)
7 RX packets 25 bytes 1656 (1.6 KiB)
8 RX errors 0 dropped 0 overruns 0 frame 0
9 TX packets 35 bytes 4536 (4.4 KiB)
10 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
11
12 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
13 ether 00:0c:29:9a:cd:27 txqueuelen 1000 (Ethernet)
14 RX packets 1320 bytes 110290 (107.7 KiB)
15 RX errors 0 dropped 0 overruns 0 frame 0
16 TX packets 739 bytes 100256 (97.9 KiB)
17 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
6.4、KVM部署于管理
6.4.1、创建KVM存储和镜像数据的目录、上传centos7镜像
1 [root@kvm ~]# mkdir -p /data_kvm/iso
2 [root@kvm ~]# mkdir -p /data_kvm/store
3 [root@kvm ~]# cd /data_kvm/iso/
4 [root@kvm iso]# ll
5 总用量 4415488
6 -rw-r--r--. 1 root root 4521459712 12月 8 15:26 CentOS-7-x86_64-DVD-1708.iso
6.4.2、使用虚拟系统管理器管理虚拟机
①创建存储池(iso、store)
1 [root@kvm ~]# virt-manager #输入后会弹出虚拟系统管理器
②在store池中添加存储卷
③创建虚拟机
然后一直点击前进并点击完成进入centOS安装画面