虚拟化介绍
虚拟化是指计算机在虚拟的基础上而不是真实的基础上运行
虚拟化技术的核心在于资源的抽象化,重新划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,虚拟化技术实现了物理硬件与软件逻辑架构的解耦。
虚拟化是云计算的核心技术,云计算中的虚拟化指的是IaaS层虚拟化解决方案。
虚拟化类型
全虚拟化
全虚拟化(Full Virtualization)是一种由虚拟机协调操作系统和硬件的模型,结构模型如下图所示,操作系统和硬件设备之间通过Hypervisor来协调处理,抽象的VM具有完全的物理特性,虚拟化层负责捕获CPU指令,为指令访问硬件充当媒介。
全虚拟化为宿主机操作系统提供完整的虚拟平台,如处理器、内存、I/O等,全虚拟化运行的宿主机操作系统无需任何修改即可迁移,但全虚拟化在性能方面不如裸机,因为Hypervisor在运行时需要占用一定的资源,另外一个影响性能开销的地方是二进制转换。
典型案例:VMware、Virtualbox,Virtual PC,KVM-x86
半虚拟化
半虚拟化的核心是为了解决全虚拟化效率不高的问题,让宿主机操作系统知道是在虚拟机上运行,因此物理机执行的一些指令就会变成其他方式来执行,这就需要修改宿主机内核代码来实现,或者将Hypervisor直接安装在物理机上,多个Hypervisor上运行,定制一个特殊的Linux系统。
半虚拟化也是利用Hypervisor来实现对底层硬件的共享访问,由于定制了一个特殊的Linux系统,这就使得宿主机的操作系统能够更契合的实现虚拟化。
典型案例:Xen、Vmware ESXI 、微软Hyper-v
硬件辅助虚拟化
Intel/AMD等硬件厂商通过对硬件的改造来支持虚拟化技术,硬件辅助虚拟化技术(Hardware Assisted Virtualization)常用于优化全虚拟化和半虚拟化产品,最典型的例子VMware Workstation,他虽然属于全虚拟化,但在后续版本引入硬件虚拟化技术,如Intel的VT-x和AMD的AMD-V。现在市面上所有的全虚拟化和半虚拟化产品基本上都支持硬件辅助虚拟化。
KVM
KVM是一个基于Linux内核的虚拟化技术,可以直接将Linux内核转换为Hypervisor。Linux内核能够直接管理虚拟机,直接调用Linux内核中的内存管理、进程管理子系统来管理虚拟机。
组成:由处于内核态的KVM模块和用户态的QEMU两部分组成
- KVM内核模块:现在是Linux kernel的一个模块,主要包括KVM虚拟化核心模块KVM.ko,以及硬件相关的KVM_intel或KVM_AMD模块;主要负责虚拟机的创建、CPU与内存虚拟化,虚拟内存分配与管理、vCPU寄存器读写等。
- QEMU设备模拟:实现I/O设备虚拟化,与KVM内核交互。由KVM内核与QEMU相互配合实现虚拟机的管理。KVM会复用部分Linux内核的能力,如进程管理调度、设备驱动,内存管理等。
KVM工作原理:KVM 模块让Linux 主机成为一个虚拟机监视/管理器(VMM),在KVM体系中,每一个Gust OS都是作为一个标准的linux进程,都可以使用linux进程管理命令管理。
KVM中三种模式:
- 客户模式(Guest Mode)VM运行在这个模式,执行Guest非I/O操作指令。
- 用户模式(User Mode)QEMU运行在这个模式,实现I/O模拟与管理。
- 内核模式(Kernel Mode)KVM运行在这个模式,实现模式的切换(VM Exit/VM Entry),执行特权与敏感指令。
QEMU通过ioctl发出KVM_CREATE_VM 指令,创建了一个VM后,QEMU需要需要发送一些命令给VM,如KVM_CREATE_VCPU。这些命令当然也是通过ioctl发送的,用户程序中用ioctl发送KVM_CREATE_VM得到的返回值就是新创建的VM对应的fd(kvm_vm),fd是创建的指向特定虚拟机实例的文件描述符,之后利用这个fd发送命令给VM进行访问控制。
KVM安装和部署
环境
系统类型 | IP | 主机名 |
CentOS7 | 192.168.139.134 | KVM |
CentOS7 | 192.168.139.142 | c7 |
在kvm主机进行操作
关闭防火墙和selinux
[root@kvm ~]# systemctl disable --now firewalld
[root@kvm ~]# setenforce 0
[root@kvm ~]# vim /etc/selinux/config
[root@kvm ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
安装基础软件包
[root@kvm ~]# yum -y install epel-release vim wget net-tools unzip zip gcc gcc-c++
验证CPU是否支持KVM;如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的
[root@kvm ~]# egrep -o 'vmx|svm' /proc/cpuinfo
svm
svm
svm
svm
svm
svm
svm
svm
安装KVM
[root@kvm ~]# yum -y install qemu-kvm qemu-kvm-common qemu-img virt-manager libvirt python3-libvirt libvirt-client virt-install virt-viewer bridge-utils libguestfs-tools
因为虚拟机中网络,我们一般都是和公司的其他服务器是同一个网段,所以我们需要把 \
KVM服务器的网卡配置成桥接模式。这样的话KVM的虚拟机就可以通过该桥接网卡和公司内部 \
其他服务器处于同一网段