这里写目录标题
KVM虚拟化
美国环境保护EPA报告曾经统计过一组数据:EPA研究服务器和数据中心的能源效率时发现,实际上服务器只有5%的时间在工作,其他时间一直处于休眠状态。
为了提高服务器的利用率,研发出一种虚拟化技术。
广义的KVM实际上包含两个部分,一部分是基于Linux内核支持的KVM内核模块,另一部分是经过简化和修改的Qemu。
KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。
虚拟化类型
全虚拟化:将物理硬件资源全部通过软件方式抽象化,最后进行调用,使用hypervisor(VMM)软件,其原理是在底层硬件和服务器之间建立一个抽象层。
半虚拟化:物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor作为OS上的一个程序模块运行,并对虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation都属于这个类型
直通:直接使用物理硬件资源(需要支持,还不完善)
虚拟化技术
通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率,例如ensp、workstation等
在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(nginx和tomcat),从而实现一台宿主机搭建一个集群
通过软件/应用程序的方式,来实现物理硬件的功能,例:ensp以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)
虚拟化技术的优劣
KVM虚拟化架构/三种模式
1、客户模式(guestOS):VM中的OS为GuestOS
客户机在操作系统中运行的模式,客户机分为内核模式和用户模式,作用如下:
2、客户模式:
为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O,Qemu_ 工作在此模式下(Qemu的主要功能)
3、linux内核模式
模拟CPU、内存,实现客户模式切换,处理从客户模式的推出,KVM即运行在此模式下
KVM驱动提供处理器、内存的虚拟化,以及客户机I/O的拦截,guest的I/O被拦截后,
交由Qemu处理
Qemu利用接口libkvm调用(ioctl) 虚拟机设备接口/dev/kvm来分配资源、管理、维护虚拟机
kvm作用
提高物理服务器的资源利用率
可以批量部署
实现实时快照技术
支持克隆技术
可以实现虚拟机的离线迁移和动态迁移
可以将资源动态调整
工作流程
- 用户模式的Qemu利用接口libkvm通过ioctl系统调用进入内核模式。KVM驱动为虚拟机创建虚拟CPU和虚拟内存
- 然后执行VMLAU :NCH指令进入客户模式,装载Guest OS并运行。Guest OS运行过程中如果发生异常,则暂停GuestOS的运行并保存当前状态同时退出到内核模式来处理这些异常。
- 内核模式处理这些异常时如果不需要I/o则处理完成后重新进入客户模式。如果需要I/o则进入到用户模式,则由Qemu 来处理I/O,处理完成后进入内核模式,再进入客户模式。
创建本地源
实验环境
centos7.6 8G 6核 300G
先查看cpu是否支持虚拟化
//
[root@localhost ~]# vim /etc/fstab #进入配置,添加永久挂载
/dev/cdrom /mnt iso9660 defaults 0 0
[root@localhost ~]# mount -a /使配置文件生效
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# df -h ##查看是否挂载成功
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 293G 5.2G 288G 2% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 13M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 1014M 174M 841M 18% /boot
tmpfs 781M 4.0K 781M 1% /run/user/42
tmpfs 781M 20K 781M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /mnt
[root@localhost ~]# vim /etc/ssh/sshd_config ##将dns反向解析关掉,让客户端连接服务器更快
UseDNS no //取消DNS注释,改为NO
[root@localhost ~]# cd /etc/yum.repos.d/