前言:
虚拟化是云计算的基础。通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。
虚拟化介绍:
虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让这多份资源都使用起来,物尽其用,减少了浪费,提高了利用率,省了钱。
虚拟化技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来.
在物理硬件之上安装软件:虚拟机监控器(Virtual Machine Monitor,VMM),并且用VMM来控制产生多个的虚拟机(Virtual Machine)实例,每个vm都可以运行独立操作系统及应用软件。
虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。
比如对物理内存的抽象:产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间(Address Space),而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。
虚拟化分类:
全虚拟化:全虚拟化的核心就在全,‘全’指的是VMM为虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等。
优点:原本是为物理硬件设计的操作系统或其它系统软件,完全不做任何修改就可以在虚拟机中运行。
缺点:
- 然而飞的再高最后也得落地,vm最后还是要与vmm打交道,对于全虚拟化来说, VMM 必须完全并且完整地把自己模拟成硬件,为vm提供全部硬件调用接口
- 必须模拟特权指令的执行过程
半虚拟化:这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。
直通:直接使用物理硬件资源(需要支持,还不完善)
虚拟化优缺点
优势:
- 集中化管理(远程管理、维护)
- 提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了“空闲”容量)
- 动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
- 高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
劣势:
- 前期高额费用(初期的硬件支持)
- 降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
- 更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)
- 实施配置复杂、管理复杂(管理人员运维、排障困难)
- 一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
- 安全性(虚拟化技术自身的安全隐患)
虚拟化前后对比
为什么要使用虚拟化:
- 操作系统方面:
LAMP 架构中,如果架构要求服务间的安全性隔离比较高的话,Apache的页面和MySQL数据库的目录一定是不能互相碰面,如果Apache漏洞暴露出来,攻击者就可以Apache的进程访问到MySQL的数据目录,从而获取MySQL中的数据,这种就是严重的安全隐患而想解决这种潜在危险,可以通过实现内核级别的隔离(使用虚拟化技术)。 - 软硬件结合:
因为硬件和操作系统不兼容或者不支持,导致有些软、硬件功能无法正常使用(也是最难的问题)使用虚拟化,软硬件之间是会通过虚拟化层驱动进行隔离(调配)的,只要虚拟化层可以识别软/硬件应用,就可以将软硬件结合使用 - 端口冲突
Apache和Nginx 定位相同(80端口)只能使用反向代理的方式进行分离,而同时如果在同一台机器使用这种方式,Apache和Nginx中重要的数据文件如果同时被泄露出去,而虚拟化可以隔离服务。
虚拟化前后对比:
虚拟化前:
- 每台主机拥有一个操作系统
- 软硬件紧密结合
- 在同一个主机上运行多个应用程序通常会产生冲突
- 系统资源利用率低(例如:5%)
- 硬件成本高昂并且不够灵活
虚拟化后:
- 打破了操作系统和硬件的互相依赖
- 通过封装到虚拟机的技术,管理操作系统和应用程序为单一的个体
- 强大的安全和故障隔离
- 虚拟机时独立于硬件的,它们可以在任何硬件上运行
KVM介绍:
KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:
- 它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
- 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
- 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
- 它需要支持虚拟化扩展的 CPU。
- 它是完全开源的。
KVM架构:
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。
但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
Linux 上的用户空间、内核空间和虚机:
Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。
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,非一致存储访问结构 )
结构图:
原理分析:
- 客户模式:客户机在操作系统中运行的模式,客户机分为内核模式和用户模式作用如下:
- 用户模式:为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O,Qemu工作在此模式下,主要控制libkvm工具(工具作用,控制内核中的KVM)来调用物理虚拟化资源,并通过ioctl来调用物理虚拟化资源来供虚拟机使用
- Linux内核模式:模拟内存、CPU,实现客户模式切换,处理从客户模式的推出,KVM即运行在此模式下,主要为虚拟机提供CPU、内存(硬件资源)的虚拟化,来供Qemu组件调用
KVM工作流程:
用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。 KVM驱动为虚拟机创建虚拟 CPU 和虚拟内存,然后执行 VMLAU·NCH 指令进入客户模式,装载 Guest OS 并运行。Guest OS 运行过程中如果发生异常,则暂停Guest OS的运行并保存当前状态同时退出到内核模式来处理这些异常。
内核模式处理这些异常时如果不需要 I/O则处理完成后重新进入客户模式。如果需要 I/O 则进入到用户模式, 则由 Qemu 来处理 I/O,处理完成后进入内核模式,再进入客户模式
KVM-创建虚拟机
部署环境:
修改主机名:
[root@localhost ~]# hostnamectl set-hostname kvm
[root@localhost ~]# su
将镜像光盘设为自动/永久挂载:
挂载前需保证光盘已连接
将镜像光盘设为自动/永久挂载:
[root@kvm ~]# vim /etc/fstab
/dev/cdrom /mnt iso9660 defaults 0 0 #末尾添加
[root@kvm ~]# mount -a
mount: /dev/sr0 is write-protected, mounting read-only
[root@kvm ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 xfs 292G 4.5G 288G 2% /
devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 9.1M 3.9G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 297M 157M 141M 53% /boot
tmpfs tmpfs 781M 4.0K 781M 1% /run/user/42
tmpfs tmpfs 781M 32K 781M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt
制作本地仓库:
[root@kvm ~]# cd /etc/yum.repos.d/
[root@kvm yum.repos.d]# ls
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-Media.repo
CentOS-Debuginfo.repo CentOS-Sources.repo
[root@kvm yum.repos.d]# mkdir backup
[root@kvm yum.repos.d]# mv C* backup/
[root@kvm yum.repos.d]# vi local.repo
[local]
name=kvm
baseurl=file:///mnt
gpgcheck=0
enable=1
重新加载Yum仓库:
[root@kvm yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, langpacks
Cleaning repos: local
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
[root@kvm yum.repos.d]# yum makecache
Loaded plugins: fastestmirror, langpacks
local | 3.6 kB 00:00 网络支持工具
(1/4): local/group_gz | 156 kB 00:00
(2/4): local/filelists_db | 3.1 MB 00:00
(3/4): local/primary_db | 3.1 MB 00:00
(4/4): local/other_db | 1.2 MB 00:00
Determining fastest mirrors
Metadata Cache Created
关闭防火墙和核心防护:
[root@kvm yum.repos.d]# systemctl stop firewalld
[root@kvm yum.repos.d]# setenforce 0
安装KVM
安装KVM基本组件;
安装 GNOME 桌面环境 如果装了图形界面可以不需要装:
[root@kvm yum.repos.d]# yum groupinstall -y "GNOME Desktop"
KVM 模块:
[root@kvm yum.repos.d]# yum -y install qemu-kvm
安装KVM 调试工具,可不安装:
[root@kvm yum.repos.d]# yum -y install qemu-kvm-tools
构建虚拟机的命令行工具:
[root@kvm yum.repos.d]# yum -y install virt-install
qemu 组件,创建磁盘、启动虚拟机等:
[root@kvm yum.repos.d]# yum -y install qemu-img
网络支持工具:
[root@kvm yum.repos.d]# yum -y install bridge-utils
虚拟机管理工具:
[root@kvm yum.repos.d]# yum -y install libvirt
图形界面管理虚拟机:
[root@kvm yum.repos.d]# yum -y install virt-manager
检测CPU是否支持虚拟化:
[root@kvm ~]# cat /proc/cpuinfo | grep vmx
查看KVM模块是否已安装:
[root@kvm ~]# lsmod | grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
设置开启启动界面的显示模式:
[root@kvm ~]# ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
KVM网络的两种模式:
- NAT: 默认设置,数据包由 NAT 方式通过主机的接口进行传送,可以访问外网,但是无法从外部访问虚拟机网络
- 网桥:这种模式允许虚拟机像一*立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持(一般有线网卡都支持)
使用Bridge网桥模式进行部署:
[root@kvm ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
创建、编辑桥接网卡:
[root@kvm ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-br0
[root@kvm ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
重启网卡:
[root@kvm ~]# systemctl restart network
[root@kvm ~]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.133 netmask 255.255.255.0 broadcast 192.168.
inet6 fe80::b22d:afe3:b593:dd16 prefixlen 64 scopeid 0x20<lin
ether 00:0c:29:18:f1:cd txqueuelen 1000 (Ethernet)
RX packets 109 bytes 9383 (9.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 117 bytes 18338 (17.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:18:f1:cd txqueuelen 1000 (Ethernet)
RX packets 683939 bytes 1013462127 (966.5 MiB)
RX errors 0 dropped 1 overruns 0 frame 0
TX packets 262919 bytes 16121133 (15.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.12
ether 52:54:00:c9:4d:d4 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
KVM部署于管理:
创建KVM存储和镜像数据的目录、上传centos7镜像:
[root@kvm ~]# mkdir -p /data_kvm/iso
[root@kvm ~]# mkdir -p /data_kvm/store
[root@kvm ~]# cd /data_kvm/iso/
[root@kvm iso]# ls
[root@kvm iso]# ll
total 0
[root@kvm iso]# rz -E
rz waiting to receive.
[root@kvm iso]# ll
total 221184
-rw-r--r--. 1 root root 226492416 Jan 4 2018 CentOS-7-x86_64-DVD-1708.iso
使用虚拟系统管理器管理虚拟机
创建存储池(iso、store):
[root@kvm ~]# virt-manager #输入后会弹出虚拟系统管理器
然后一直点击前进并点击完成进入centOS安装画面