虚拟化技术的演变过程分为软件模拟、虚拟化层翻译、容器虚拟化三个阶段
1 软件模拟的技术方式
软件模拟是通过软件完全模拟CPU、网卡、芯片组、磁盘等计算机硬件,因为是软件模拟,所以理论上可以模拟任何硬件,甚至不存在的硬件。但是由于是软件模拟硬件,效率低,典型产品有 Bochs、QEMU。
2 虚拟化层翻译
X86平台指令集划分为4个特权模式:ring0、Ring1、Ring2、Ring3 操作系统工作在 Ring0 级别,应用程序使用Ring3,驱动程序使用 Ring1和 Ring2。
①完全虚拟化
X86在虚拟化方面的一个难点就是如何将虚拟机越级的指令使用进行隔离。这种方式称为全虚拟化,典型应用 VMware。
多数的虚拟化采用虚拟机管理程序Hypervisor
Hypervisor是一个软件层或者子系统(也称为VMM–Virtual Machine Monitor)
允许多种 OS 在相同的物理 OS 中运行;控制硬件并向 GuestOS 提供访问底层硬件的途径向 GuestOS 提供虚拟化的硬件
- 类型一:裸金属型(直接安装在硬件设备)
裸金属型虚拟化是一种在物理硬件上直接安装虚拟化软件的方式。在这种模式下,虚拟化软件(也称为hypervisor或虚拟机监控器)直接运行在物理硬件上,而不需要操作系统的支持。这意味着虚拟机可以直接访问底层硬件资源,如处理器、内存和存储设备,从而提供接近原生性能的虚拟化体验。
裸金属型虚拟化适用于需要最高性能和隔离性的场景,如高性能计算、大规模数据库和云计算等。由于没有操作系统的干扰,裸金属型虚拟化可以提供更高的性能和更好的资源利用率。 - 类型二:宿主型(安装的有OS的设备上)
宿主型虚拟化是一种在已安装操作系统的设备上运行虚拟化软件的方式。在这种模式下,虚拟化软件作为应用程序运行在宿主操作系统之上,称为宿主操作系统。虚拟机则作为这个宿主操作系统的进程运行,并通过宿主操作系统提供的接口来访问硬件资源。
宿主型虚拟化相对于裸金属型虚拟化来说更加灵活,因为它可以在常见的操作系统上运行,如Windows、Linux等。它也可以利用宿主操作系统的设备驱动程序来提供虚拟化的硬件支持,从而简化了虚拟机的管理和配置。 - 裸金属型虚拟化适用于需要高性能和隔离性的场景,而宿主型虚拟化更加灵活且易于管理。选择哪种虚拟化方式取决于具体的应用需求和硬件环境。
“OS"指的是操作系统(Operating System),它是一种软件,负责管理计算机的硬件和软件资源,并提供各种服务和功能给应用程序使用。常见的操作系统包括Windows、macOS和Linux等。
而"GuestOS"指的是在虚拟化环境中运行的虚拟机的操作系统。虚拟机是一种软件实体,它在物理计算机上模拟出一个完整的计算机系统,包括处理器、内存、硬盘等。GuestOS是在虚拟机中安装和运行的操作系统,可以是任意支持虚拟化技术的操作系统,例如Windows、Linux等。
在虚拟化技术中,物理计算机上的"Host OS”(宿主操作系统)负责管理物理硬件,并提供虚拟化的功能。它允许多个不同的GuestOS同时运行在同一台物理计算机上,每个GuestOS都被隔离在自己的虚拟机中,互相之间相互独立并且不能直接访问宿主操作系统或其他GuestOS。
通过虚拟化技术,Host OS向GuestOS提供了对底层硬件的访问,并将其虚拟化,使得GuestOS可以以为自己独占使用了底层硬件资源,从而实现了运行多个操作系统的能力。这种虚拟化的硬件通常称为"虚拟化的硬件"(virtualized hardware)。
②半虚拟化
对虚拟机的操作系统内核进行改造,使虚拟机自己对特殊指令进行更改,然后和虚拟化层一起配合工作,改造的虚拟机虽然使用上有限制,配置比较麻烦,但是这种方式效率非常高,也称为半虚拟化
对CPU指令进行改造.
x86 CPU环
核心指令直接调用运行Ring 0
应用程序运行调用Ring 3
Intel推出了硬件的方案,对CPU指令进行改造,即VT-x.增加了两种操作模式
③硬件辅助虚拟化
Intel-VT和AMD-V创建了一个新的Ring -1单独给Hypervisor使用
GuestOS可以直接使用Ring 0而无需修改
主流例如:KVM VM.ESXi Xen-3.0
3 容器虚拟化
容器虚拟化的原理时基于CGroups、Namespace等技术将进程隔离,每个进程就像一台单独的虚拟机一样,有自己被隔离出来的资源,也有自己的根目录,独立的进程编号,被隔离的内存空间。典型应用DOCKER
常见的虚拟化产品
-
RedHat KVM
虚拟化方式:完全虚拟化
架构:寄居架构(linux内核);祼金属架构RHEV-H -
VmWare ESX
虚拟化方式:完全虚拟化
架构:裸金属架构 -
Citrix XenServer
虚拟化方式:半虚拟化(linux安装linux);全虚拟化(linux安装windows),硬件辅助虚拟化 -
Microsoft Hyper-V
虚拟化方式:半虚拟化
架构:裸金属架构Hyper-V Server;寄居架构 Windows 2008 -
DOCKER
KVM 概述
KVM(Kernel-based Virtual Machine)是一种基于Linux内核的虚拟化技术,能够将Linux作为虚拟机监视器(VMM),实现对硬件资源的虚拟化。
广义的 KVM 实际上包含两部分,一部分是基于 Linux 内核支持的 KVM 内核模块,另一部分就是经过简化和修改的 Qemu。
QEMU是一种通用的开源计算机仿真器和虚拟器。QEMU共有两种操作模式
- 全系统仿真:能够在任意支持的架构上为任何机器运行一个完整的操作系统
- 用户模式仿真:能够在任意支持的架构上为另一个Linux/BSD运行程序
具体来说,当作为机器仿真器使用时,QEMU可以通过动态代码翻译机制(dynamic translation)在不同的机器上仿真任意一台机器(例如ARM),并执行不同于主机架构的代码。同时由于动态代码翻译机制,它也能够实现不错的性能。
而当QEMU用作虚拟器时,QEMU的优点在于其实纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,但是也正因为QEMU是纯软件实现的,因此所有指令都需要QEMU转手,因此会严重的降低性能。而可行的办法是通过配合KVM或者Xen来进行加速,目前肯定是以KVM为主。
KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 QEMU 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。
KVM 工作原理
用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。
KVM Driver 为虚拟机创建虚拟 CPU 和虚拟内存,然后执行VMLAUNCH 指令进入客户模式,装载 Guest OS 并运行。
Guest OS 运行过程中如果发生中断或者影子缺页等异常,将暂停 Guest OS的运行并保存当前上下文退出到内核模式来处理这些异常。
内核模式处理这些异常时如果不需要 I/O 则处理完成后重新进入客户模式。
如果需要 I/O 则进入到用户模式,由 Qemu 来处理 I/O,处理完成后进入内核模式,再进入客户模式,
案例实施:Linux 安装虚拟机(图形化)
YUM 安装 KVM
在 CentOS 的系统光盘镜像中,已经提供了安装 KVM 所需软件。通过部署基于光盘镜像的本地 YUM 源,直接使用 YUM 安装所需软件即可,安装 KVM 所需软件具体包含以下几个:
yum groupinstall -y "GNOME Desktop" //安装 GNOME 桌面环境
yum -y install qemu-kvm //KVM 模块
yum -y install qemu-kvm-tools //KVM 调试工具,可不安装
yum -y install virt-install //构建虚拟机的命令行工具
yum -y install qemu-img //qemu 组件,创建磁盘、启动虚拟机等
yum -y install bridge-utils //网络支持工具
yum -y install libvirt //虚拟机管理工具
yum -y install virt-manager //图形界面管理虚拟机
yum -y install virt-viewer //显示虚拟机的控制台
重启系统后,查看 CPU 是否支持虚拟化。
对于 Intel 的服务器可以通过以下命令查看,只要有输出就说明 CPU 支持虚拟化;
# cat /proc/cpuinfo | grep vmx
AMD 服务器可用 cat /proc/cpuinfo | grep smv
命令查看
开启 libvirtd 服务
安装完成后还需要开启 libvirtd 服务,以开启相关支持。
# systemctl start libvirtd
# systemctl enable libvirtd
配置桥接网络
NAT 方式是 kvm 安装后的默认方式。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。
建立 br0 网卡
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@localhost network-scripts]# vim ifcfg-br0
TYPE="Bridge"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
IPADDR=192.168.27.145
NETMASK=255.255.255.0
GATEWAY=192.168.27.2
DNS1=192.168.27.2
桥接物理网卡 ens33
[root@localhost network-scripts]# vim ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
DEVICE=ens33
BRIDGE=br0
重启网络
# systemctl restart network
测试能否连接外网
创建KVM存储池
启动 virt-manager
# virt-manager
创建存储池–存放虚拟硬盘
双击 QUMU,选择 “存储" 选项卡,如图新建存储池,设置存储目录为/home/KVMimg
创建存储池–存放镜像文件
以同样的方式创建一个镜像存储池,存放目录为/home/KVMISO
同时上传 ISO 镜像文件,以便后面安装虚拟机(可以使用 MX 或者 Xshell 等工具上传)
创建存储卷
点击刚才创建好的 bdqn 存储池,点击加号新建存储卷,设置最大容量和分配容量
创建虚拟机
返回到主界面,右键单击,选择”新建“
选择虚拟机存放的位置
在点击完成后就自动开始安装,后面的操作和安装 Linux 没有区别
案例:使用 KVM 命令集管理虚拟机
1、查看命令帮助
[root@localhost ~]# virsh -h
2、查看KVM的配置文件存放目录(centos01是虚拟机系统实例的配置文件)
[root@localhost ~]# ls /etc/libvirt/qemu
centos01.xml networks
3、查看虚拟机状态
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 centos01 running
4、虚拟机关机与开机
首先需要确认acpid服务安装并运行
[root@localhost ~]# virsh shutdown centos01
域 centos01 被关闭
[root@localhost ~]# virsh start centos01
域 centos01 已开始
5、强制实例系统关闭电源
[root@localhost ~]# virsh destroy centos01
6、通过配置文件启动虚拟机系统实例
[root@localhost ~]# virsh create /etc/libvirt/qemu/centos01.xml
域 centos01 被创建(从 /etc/libvirt/qemu/centos01.xml)
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 centos01 running
7、挂起虚拟机
[root@localhost ~]# virsh suspend centos01
域 centos01 被挂起
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 centos01 暂停
8、恢复虚拟机
[root@localhost ~]# virsh resume centos01
域 centos01 被重新恢复
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 centos01 running
9、配置虚拟机实例伴随宿主机自动启动
[root@localhost ~]# virsh autostart centos01
域 centos01标记为自动开始
上述命令创建/etc/libvirt/qemu/autostart/目录,目录内容为开机自动启动的系统
[root@localhost ~]# ls /etc/libvirt/qemu/autostart/
centos01.xml
[root@localhost ~]# virsh autostart centos01 --disable
域 centos01取消标记为自动开始
10、导出虚拟机配置
[root@localhost ~]# virsh dumpxml centos01 > /etc/libvirt/qemu/centos02.xml
11、虚拟机的删除与添加
删除虚拟机:
[root@localhost ~]# virsh shutdown centos01
域 centos01 被关闭
[root@localhost ~]# virsh undefine centos01
域 centos01 已经被取消定义
查看删除结果,centos01的配置文件被删除,但是磁盘文件不会删除
[root@localhost ~]# ls /etc/libvirt/qemu
autostart centos02.xml networks
通过virsh list --all查看不到centos01的信息,说明虚拟机被删除
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
通过备份的配置文件重新定义虚拟机
[root@localhost ~]# mv /etc/libvirt/qemu/centos02.xml
/etc/libvirt/qemu/centos01.xml
[root@localhost ~]# virsh define /etc/libvirt/qemu/centos01.xml
定义域 centos01(从 /etc/libvirt/qemu/centos01.xml)
查看虚拟机信息
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- centos01 关闭
12、修改虚拟机配置信息(用来修改系统内存大小、磁盘文件等信息)
直接通过vim命令修改
[root@localhost ~]# vim /etc/libvirt/qemu/centos01.xml
通过virsh命令修改
[root@localhost ~]# virsh edit centos01
13、虚拟机的其他管理(在宿主机上)
# virsh start centos01 # 虚拟机开启(启动):
# virsh reboot centos01 # 虚拟机重新启动
# virsh shutdown centos01 # 虚拟机关机
# virsh destroy centos01 # 强制关机(强制断电)
# virsh suspend centos01 # 暂停(挂起)KVM 虚拟机
# virsh resume centos01 # 恢复被挂起的 KVM 虚拟机
# virsh undefine centos01 # 该方法只删除配置文件,磁盘文件未删除
# virsh autostart centos01 # 随物理机启动而启动(开机启动)
# virsh autostart --disable centos01 # 取消标记为自动开始(取消开机启动)
KVM 命令安装虚拟机
创建客户机所需要的磁盘
[root@localhost ~]# mkdir /home/KVMimg
[root@localhost ~]# qemu-img create -f raw /home/KVMimg/centos02.raw 10G
Formatting '/home/KVMimg/centos02.raw', fmt=raw size=10737418240
qemu-img 主要用来创建虚拟客户机所需的磁盘
create表示创建
-f raw 表示创建一个格式为 raw 的磁盘
/home/KVMimg/centos02.raw 10G 表示创建的磁盘名称及磁盘文件
10G表示该磁盘可用大小
安装虚拟客户机
[root@localhost ~]# virt-install --virt-type=kvm --name=centos02 --vcpus=1 --memory=1024 --location=/home/KVMISO/CentOS-7-x86_64-DVD-1810.iso --disk path=/home/KVMimg/centos7-1.qcow2,size=10,format=qcow2 --network bridge=br0 --graphics none --extra-args='console=ttyS0' --force
--virt-type=kvm 虚拟机类型
--name=centos02 虚拟客户机名称
--vcpus=1 给虚拟客户机分配的虚拟CPU数量
--memory=1024 内存大小
-location=/home/KVMimg/CentOS-7-x86_64-DVD-1810.iso 指定客户机安装镜像文件
路径
--disk path=/home/KVMimg/centos02.raw,size=10,format=raw 客户端磁盘的位置及
格式
--network bridge=br0 客户端网卡配置(机器默认会有virbr0,这里的br0为上一章节
中配置过的)
--graphics none 不用图像配置界面
--extra-args='console=ttyS0' 表示使用console ttys0进行管理
--force
注意:.iso镜像文件一定放到/home 或者根目录重新创建目录,不然会因为权限报错,无法创建虚拟机。
KVM文件管理
通过文件管理可以直接查看、修改、复制虚拟机的内部文件。例如,当系统因为配置问题无法启动时,可以直接修改虚拟机的文件。虚拟机磁盘文件有raw与qcow2两种格式,KVM虚拟机默认使用raw格式,raw格式性能最好、速度最快,其缺点是不支持一些新的功能,如镜像、zlib磁盘压缩、AES加密等。针对两种格式的文件有不同的工具可用选择。这里介绍本地YUM安装 libguestfs-tools 后产生的命令行工具(这个工具可以直接读取qcow2格式的磁盘文件,因此需要将raw格式的磁盘文件转换成qcow2的格式).
虚拟机的克隆
# virsh shutdown centos02
# virt-clone -o centos02 -n centos03 -f /home/KVMimg/centos03.qcow2
-o 要克隆的原虚拟机名字
-n 克隆后新虚拟机的名字
-f 新虚拟机磁盘镜像文件的存储位置
虚拟机快照
# virsh list --all //列出所有虚拟机
# virsh shutdown centos01 //关闭centos01虚拟机
# virsh snapshot-create-as centos01 centos01-s1 //为虚拟机centos01创建快照centos01-s1
# virsh snapshot-list centos01 //列出虚拟机test1的所有快照
# virsh snapshot-info centos01 centos01-s1 //查看快照的详细信息
# virsh snapshot-delete centos01 centos01-s1 //删除虚拟机centos01的快照centos01-s1
// 恢复快照
# virsh shutdown centos01
# virsh snapshot-revert centos01 centos01-s1
# virsh start centos01
web管理端
安装基础依赖
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx
yum install apt install -y python3-pip
yum install -y gcc make autoconf automake git python3-pip python3-requests python3-mock gettext pkgconf xsltproc python3-dev pep8 pyflakes python3-yaml
yum install -y systemd logrotate python3-psutil python3-ldap python3-lxml python3-websockify python3-jsonschema openssl nginx python3-cherrypy3 python3-cheetah python3-pampy python-m2crypto gettext python3-openssl
启动服务
systemctl start nginx
systemctl enable nginx
systemctl start wokd
systemctl enable wokd
浏览器访问 https://192.168.27.145:8001/login.html