KVM简介加部署

发布于:2021-09-18 15:14:49

前言:

虚拟化是云计算的基础。通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。


虚拟化介绍:

虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让这多份资源都使用起来,物尽其用,减少了浪费,提高了利用率,省了钱。


虚拟化技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来.


在物理硬件之*沧叭砑盒槟饣嗫*鳎╒irtual 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 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 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 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 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
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 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安装画面

相关推荐