虚拟化(Virtualization)是一种资源分配和管理技术,是将计算机的各种实体资源,比如CPU、内存、磁盘空间、网络适配器等,进行抽象转换后虚拟的设备,可以实现灵活地分割、组合为一个或多个计算机配置环境,并还支持重新分割、重新组合,以达到最大化合理利用物理资源的目的。
参考资料: https://www.vmware.com/cn/solutions/virtualization.html
虚拟化可以提高 IT 敏捷性、灵活性和可扩展性,同时大幅节约成本。更高的工作负载移动性、更高的性
能和资源可用性、自动化运维 - 这些都是虚拟化的优势,虚拟化技术可以使 IT 部门更轻松地进行管理以
及降低拥有成本和运维成本。其优势包括:
1959年,计算机科学家Christopher Strachey发表了一篇名为《大型高速计算机中的时间共享》(Time
Sharing in Large Fast Computers)的学术报告,他在文中首次提出了虚拟化的基本概念,被认为是虚
拟化技术的最早论述
1964年,IBM推出了专为 System/360 Mainframe 量身订造的操作系统 CP-40,首次实现了虚拟内存和
虚拟机。
1967年,第一个管理程序(hypervisor)诞生,5年之后,IBM 发布用于创建灵活大型主机的虚拟机(VM)技
术,该技术可根据动态的需求快速而有效地使用各种资源。从此,虚拟化这一词汇正式被引入了IT的现实世
界。
20世纪70年代的 System 370 系列中通过虚拟机监控器(Virtual Machine Monitor,VMM)的程序在
物理硬件之上生成多个可以独立运行操作系统软件的虚拟机实例
20世纪 90 年代 Windows 的广泛使用以及 Linux 作为服务器系统的出现奠定了 x86 服务器的行业标准
地位。
1998年VMware公司在美国成立,1999年VMware发布了它的第一款产品VMware Workstation、 2001年
发布VMware GSX Server和VMware ESXi Server宣布进入服务器虚拟化市场, 2003年VMware推出了
VMware Virtual Center, 2004年推出了64位支持版本,同年被EMC收购,2013年收入52.1亿美元。
2015年10月12日,戴尔与数据存储公司EMC的并购宣布完成,最终戴尔以670亿美元收购了EMC
2003年,Xen实现半虚拟化
2005年,HVM硬件辅助的虚拟化,Intel VT-x,AMD-V
2005年,openVZ出现,在Linux平台上的容器化技术实现
2006年,QEMU
2007年,KVM(Kernel-based Virtual Machine)基于内核Linux 2.6.20
2007年8月21日,思杰宣布5亿美元收购XenSource公司,并推出服务器虚拟化XenServer、桌面虚拟化
XenDesktop和应用虚拟化XenApp,2013年收入29亿美元。
2008年,LXC发布
2008年3月13日微软在北京发布Windows Server 2008,内置虚拟化技术hyper-v。
2008年9月,红帽以1.07亿美元的价格收购KVM的以色列母公司Qumranet,并推出企业级虚拟化解决方案
RHEV,目前最新版本3.3,2013年收入超过13亿美元
2013年,docker发布
2017年11月全球最大公有云厂商AWS宣布了全新的C5实例,该实例完全基于新的虚拟机监控程序
(Hypervisor):KVM。在之前的11年里,AWS的所有虚拟化实例都是基于XEN技术实现的。也就是说AWS也
开始转向了KVM之路而不再坚持使用从其诞生之日起一直使用的XEN技术,事实上国内的阿里云早在2015年就开
始从XEN切换到KVM
服务器虚拟化支持在单个物理服务器上运行多个操作系统,每个操作系统作为虚拟机独立运行。
通过软件定义网络(Software Defined Network,SDN),即网络的创建不再依赖于物理设备,如公有云
厂商支持用户自己通过配置界面创建新的网络,在 KVM、docker、kubernetes、openstack等虚拟化
技术中都使用到了网络虚拟化。
将桌面部署为托管的服务,使 IT 组织能够更快地响应不断变化的工作场所需求和新出现的机会。还可以将
虚拟化桌面和应用快速、轻松地交付给分支机构、外包和远程员工以及使用 iPad 和 Android 平板电脑
的移动员工。
Citrix 思杰公司在云计算虚拟化、虚拟桌面和远程接入技术领域的处于优势地位
将软件应用通过网络实现虚拟化,比如 office 365,钉钉,企业微信
将存储用软件虚拟化实现, 如 SAN/NAS(NFS/Samba)/GlusterFS/ceph等
在Linux上使用 wine来运行Windows 程序,在Mac系统使用CrossOver来运行Windows程序
当前比较火的虚拟化技术,典型代表: Docker、Podman、Linux Container(LXC)、Pouch
虚拟计算机称为“虚拟机”(VM,Virtual Machine),它是一种严密隔离且内含操作系统和应用的软件容器。
每个虚拟机都是完全独立的。通过将多台虚拟机放置在一台物理计算机上,可仅在一台物理服务器或“主机”上运行多个操作系统和应用,名为“hypervisor”的精简软件层可将虚拟机与主机分离开来,并根据需要为每个虚拟机动态分配计算资源。
虚拟机具有以下特征,这些特征可提供多项优势
分区
可在一台物理机上运行多个操作系统
可在虚拟机之间分配系统资源。
隔离
可在硬件级别进行故障和安全隔离。
可利用高级资源控制功能保持性能
封装
可将虚拟机的完整状态保存到文件中。
移动和复制虚拟机就像移动和复制文件一样轻松
独立于硬件
可将任意虚拟机调配或迁移到任意物理服务器上
安装系统不会受硬件兼容性的影响
注意:CPU为了保证程序代码执行的安全性、多用户的独立性、保护OS的正常运行,提出了CPU执行状态的概念。这样能够限制不同程序之间的访问能力,避免一个程序获取另一个程序的内存数据造成数据混乱,同时也避免了程序错误的操作物理硬件。一般CPU都会划分为 用户态 和内核态 ,x86的CPU架构
更是细分为了Ring3~0四种状态。
Ring3 用户态(User Mode):运行在用户态的程序代码需要受到CPU的检查,用户态程序代码只能访问内存页表项中规定能被用户态程序代码访问的页面虚拟地址(受限的内存访问),而且还只能访问任务描述符TSS中的I/O Permission Bitmap中规定能被用户态程序代码访问的端口。甚至不能直接访问外围硬件设备、不能抢占CPU。所有的应用程序都运行在用户态上。当运行在用户态的Application需要调用只能被核心态代码直接访问的硬件设备时,CPU会通过特别的接口去调用核心态的代码,以此来实现
Application对硬件设备的调用。如果用户态的Application直接调用硬件设备时,就会被Host OS捕捉到并触发异常,弹出警告窗口。
Ring0 核心态(Kernel Mode):是Host OS Kernel运行的模式,运行在核心态的代码可以无限制的对系统内存、设备驱动程序、网卡接口、显卡接口等外围硬件设备进行访问。只有Host OS能够无限制的访问磁盘、键盘等外围硬件设备的数据,但是首先需要在Host OS上安装驱动程序
1974年Gerald J.Popek和Robert P.Goldberg的文章“Formal Requirements forVirtualizable Third
Generation Architectures" 将Hypervisor分为两类:
直接运行到物理机的Hypervisor上,这种架构搭建的虚拟化环境称为裸机虚拟化环境(Bare-Metal Hardware)
KVM
XEN
vmware esxi
rhev hypervisor
Hyper-v Server
#Redhat将KVM划分到类型I即裸机型:
https://www.redhat.com/zh/topics/virtualization/what-is-KVM
即需要运行在具有虚拟化功能的操作系统上的Hypervisor,构建的是主机虚拟化环境(Hosted Virtualization)
vmware workstation
Microsoft Hyper-V
VirtualBox
paralles desktop #Mac系统最强虚拟机技术
不需要对GuestOS操作系统软件的源代码做任何的修改,就可以运行在这样的VMM中
在全虚拟化的虚拟平台中,GuestOS并不知道自己是一台虚拟机,它会认为自己就是运行在计算机物理硬件设备上的HostOS。全虚拟化的GuestOS具有完全的物理机特性。因为全虚拟化的VMM会将一个OS所能够操作的CPU、内存、外设等物理设备逻辑抽象成为虚拟CPU、虚拟内存、虚拟外设等虚拟设备后,再交由GuestOS来操作使用。这样的GuestOS会将底层硬件平台视为自己所有的,但是实际上,这些都是VMM为GuestOS制造了这种假象。
全虚拟化/本地虚拟化不做CPU和内存模拟,只对CPU和内存做相应的分配等操作
全虚拟化又分为:软件辅助的全虚拟化 & 硬件辅助的全虚拟化
在Intel等CPU厂商还没有发布x86 CPU虚拟化技术之前,完全虚拟化都是通过软件辅助的方式来实现
的。
代表技术: Vmware Workstation,QEMU,Virtual PC
当使用GuestOS的时候,不可避免的会调用GuestOS中的虚拟设备驱动程序 和核心调度程序来操作硬件设备。与HostOS的不同在于,HostOS运行在CPU的核心态中,这就表示HostOS可以直接对硬件设备进行操作。但GuestOS作为一个运行在CPU用户态中应用程序,不能够直接的操作硬件设备。
简而言之,软件辅助虚拟化能够成功的将所有在GuestOS中执行的系统内核特权指令进行捕获、翻译,使之成为只能对GuestOS生效的虚拟特权指令。之所以需要这么做的前提是因为CPU并不能准确的去判断一个特权指令到底是由GuestOS发出的还是由HostOS发出的,这样也就无法针对一个正确的OS去将这一个特权指令执行。
由于全虚拟化VMM会频繁的捕获这些核心态的和敏感的指令,将这些指令进行转换之后,再交给CPU执行。所以经过了转换,导致其效率低,但全虚拟化VMM应用程序的好处在于其不需要对GuestOS的核心源码做修改,所以全虚拟化的VMM可以安装绝大部分的OS(暂时来说只有已Linux、open soralis、BSD等几种OS开源了内核代码)。
直到后来CPU厂商们发布了能够判断特权指令归属的标准x86 CPU之后,迎来了硬件辅助全虚拟化。
2005年Intel提出并开发了由CPU直接支持的虚拟化技术。这种虚拟化技术引入新的CPU运行模式和新的指令集,使得VMM和GuestOS运行于不同的模式下(VMM=Root Mode;GuestOS=Non-Root Mode),GuestOS运行于受控模式,原来的一些敏感指令在受控模式下会全部陷入VMM,由VMM来实现模拟,这样就解决了部分非内核态敏感指令的陷入——模拟难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了陷入——模拟时上下文切换的效率 。该技术的引入使x86 CPU可以很容易地实
现完全虚拟化。故皆被几乎所有之前分歧的各大流派所采用,包括KVM-x86,VMWare ESX Server 3,Xen 3.0 。
虚拟化CPU形成了新的CPU执行状态 Non-Root Mode 和 Root Mode .GuestOS运行在Non-Root Mode 的Ring 0核心态中,这意味着GuestOS能够直接执行特权指令,而不再需要特权解除和陷入模拟机制。并且在硬件层上面紧接的就是虚拟化层的VMM,而不需要HostOS。这是因为在硬件辅助全虚拟化的VMM会以一种更具协作性的方式来实现虚拟化 —— 将虚拟化模块加载到HostOS的内核中,例如:KVM,KVM通过在HostOS内核中加载KVM Kernel Module来将HostOS转换成为一个VMM。所以此时VMM
可以看作是HostOS,反之亦然。
硬件辅助全虚拟化主要使用了支持虚拟化功能的CPU进行支撑,CPU可以明确的分辨出来自GuestOS的特权指令,并针对GuestOS进行特权操作,而不会影响到HostOS。
硬件辅助全虚拟化需要物理硬件的支持,比如需要CPU必须支持并且打开虚拟化功能,例如Intel 的 Intel VT-X/EPT,AMD的AMD-V/RVI,以在CPU 层面支持虚拟化功能和内存虚拟化技术
全虚拟化软件(硬件辅助全虚拟化):
vmware esxi
Xen3.0
KVM
Microsoft Hyper-V
vmware workstation #https://www.vmware.com/cn/products/workstation-pro.html
VirtualBox
paralles desktop
KVM 是硬件辅助的虚拟化技术
主要负责比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O 虚拟化,两者合作各自发挥自身的功能
半虚拟化是需要GuestOS协助的虚拟化。因为在半虚拟化VMM中运行的GuestOS,都需要将其内核源码进行都进过了特别的修改。
通过修改客户操作系统代码,将原来在物理机上执行的一些特权指令(主要是修改GuestOS指令集中的敏感指令和核心态指令),修改成可以和VMM直接交互的方式,实现操作系统的定制化。这样,就不会有捕获异常、翻译和模拟的过程,性能损耗比较少。
半虚拟化VMM在处理敏感指令和内核态指令的流程上相对更简单一些。让HostOS在捕抓到GuestOS内核态指令或敏感指令时,HostOS也能够准确的判断出该指令是否属于GuestOS(GuestOS知道自己是虚拟机)。这样就可以高效的避免了上述问题。典型的半虚拟化软件有——Xen、KVM-PowerPC(简易指令集)
半虚拟化除了修改内核外还有另外一种实现方法——在每一个GuestOS中安装半虚拟化软件,如: VMTools、RHEVTools。
注意:若使用KVM运行Windows时,一定要安装半虚拟化驱动Tools,否则无法工作。现在主流的半虚拟化驱动是由IBM和redhat联合开发一个通用半虚拟机驱动virtio 。
半虚拟化要求guest OS 的内核是知道自己运行在虚拟化环境当中的,因此guest OS的系统架构必须和宿主机的系统架构相同,并且要求对guest OS的内核做相应的修改,因此半虚拟化只支持开源内核的系统,不支持闭源的系统,比较常见的半虚拟化就是早期版本的XEN,但是Xen 从其3.0 版本开始,可以支
持利用硬件辅助虚拟化技术
这里就不展开说明了,可以访问我的gitee,里面有现成的应用安装脚本
https://gitee.com/song-yao/remote-shell-script-backup
[root@Centos7 ~]# mkdir /data/vmdk
[root@Centos7 ~]# cd /data/vmdk/
[root@Centos7 vmdk]# ll
total 4005120
-rw-r--r-- 1 root root 4101242880 Jul 21 21:21 Ubuntu1804.vmdk
使用到qemu-img命令,这个命令不仅可以创建磁盘,还可进行磁盘格式的转换,qemu-img加上convert指令,可以将源文件转换为指定格式的磁盘文件。
[root@Centos7 vmdk]# qemu-img -h #查看命令的帮助
qemu-img version 1.5.3, Copyright (c) 2004-2008 Fabrice Bellard
usage: qemu-img command [command options]
QEMU disk image utility
Command syntax:
check [-q] [-f fmt] [--output=ofmt] [-r [leaks | all]] [-T src_cache] filename
create [-q] [-f fmt] [-o options] filename [size]
commit [-q] [-f fmt] [-t cache] filename
compare [-f fmt] [-F fmt] [-T src_cache] [-p] [-q] [-s] filename1 filename2
convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename
info [-f fmt] [--output=ofmt] [--backing-chain] filename
map [-f fmt] [--output=ofmt] filename
snapshot [-q] [-l | -a snapshot | -c snapshot | -d snapshot] filename
rebase [-q] [-f fmt] [-t cache] [-T src_cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
resize [-q] filename [+ | -]size
amend [-q] [-f fmt] [-t cache] -o options filename
Command parameters:
'filename' is a disk image filename
'fmt' is the disk image format. It is guessed automatically in most cases
'cache' is the cache mode used to write the output disk image, the valid
options are: 'none', 'writeback' (default, except for convert), 'writethrough',
'directsync' and 'unsafe' (default for convert)
'src_cache' is the cache mode used to read input disk images, the valid
options are the same as for the 'cache' option
'size' is the disk image size in bytes. Optional suffixes
'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),
'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P) are
supported. 'b' is ignored.
'output_filename' is the destination disk image filename
'output_fmt' is the destination format
'options' is a comma separated list of format specific options in a
name=value format. Use -o ? for an overview of the options supported by the
used format
'-c' indicates that target image must be compressed (qcow format only)
'-u' enables unsafe rebasing. It is assumed that old and new backing file
match exactly. The image doesn't need a working backing file before
rebasing in this case (useful for renaming the backing file)
'-h' with or without a command shows this help and lists the supported formats
'-p' show progress of command (only certain commands)
'-q' use Quiet mode - do not print any output (except errors)
'-S' indicates the consecutive number of bytes (defaults to 4k) that must
contain only zeros for qemu-img to create a sparse image during
conversion. If the number of bytes is 0, the source will not be scanned for
unallocated or zero sectors, and the destination image will always be
fully allocated
'--output' takes the format in which the output must be done (human or json)
'-n' skips the target volume creation (useful if the volume is created
prior to running qemu-img)
Parameters to check subcommand:
'-r' tries to repair any inconsistencies that are found during the check.
'-r leaks' repairs only cluster leaks, whereas '-r all' fixes all
kinds of errors, with a higher risk of choosing the wrong fix or
hiding corruption that has already occurred.
Parameters to snapshot subcommand:
'snapshot' is the name of the snapshot to create, apply or delete
'-a' applies a snapshot (revert disk to saved state)
'-c' creates a snapshot
'-d' deletes a snapshot
'-l' lists all snapshots in the given image
Parameters to compare subcommand:
'-f' first image format
'-F' second image format
'-s' run in Strict mode - fail on different image size or sector allocation
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug
开始转换磁盘文件格式
[root@Centos7 vmdk]# qemu-img convert -f vmdk -O qcow2 Ubuntu1804.vmdk Ubuntu1804.qcow2
[root@Centos7 vmdk]# ll -h
total 12G
-rw-r--r-- 1 root root 3.8G Jul 21 21:23 Ubuntu1804.qcow2
-rw-r--r-- 1 root root 3.9G Jul 21 21:21 Ubuntu1804.vmdk
[root@Centos7 vmdk]# ll -h /var/lib/libvirt/images/
total 20G
-rw-r--r-- 1 root root 2.2G Jul 21 17:22 zg-test2.qcow2
-rw-r--r-- 1 root root 2.2G Jul 21 18:03 zg-test3.qcow2
-rw------- 1 root root 2.1G Jul 21 17:02 zg-test-clone.qcow2
-rw-r--r-- 1 root root 2.2G Jul 21 16:20 zg-test.qcow2
-rw-r--r-- 1 root root 10G Jul 21 10:15 zg-test.raw
-rw-r--r-- 1 root root 9.8G Jul 21 14:32 zg-window.qcow2
[root@Centos7 vmdk]# mv Ubuntu1804.qcow2 /var/lib/libvirt/images/
刚刚使用qemu-img命令已经切换了磁盘格式了,现在就使用virt-manager工具把文件导入后复原虚拟机。
[root@Centos7 vmdk]# ll -h /var/lib/libvirt/images/
total 28G
-rw-r--r-- 1 root root 3.8G Jul 21 21:23 Ubuntu1804.qcow2
-rw-r--r-- 1 root root 2.2G Jul 21 17:22 zg-test2.qcow2
-rw-r--r-- 1 root root 2.2G Jul 21 18:03 zg-test3.qcow2
-rw------- 1 root root 2.1G Jul 21 17:02 zg-test-clone.qcow2
-rw-r--r-- 1 root root 2.2G Jul 21 16:20 zg-test.qcow2
-rw-r--r-- 1 root root 10G Jul 21 10:15 zg-test.raw
-rw-r--r-- 1 root root 9.8G Jul 21 14:32 zg-window.qcow2
[root@Centos7 vmdk]# virt-manager
1、首先明确一点,这三个都是VMware公司的产品,VMware就是一家软件公司,最出名就是提供虚拟化解决方案
2、Vsphere不是一个软件,而是一个软件或者组件的套件,类似于office,VCenter和esxi都是vsphere其中的组件
3、Esxi
安装在物理机上的虚拟机监控程序,在本机或者服务器上创建安装虚拟机,实际上都是通过Esxi去完成,相当于一个hypervisor一旦在服务器硬件上安装了ESXi,底层的硬件就被虚拟化了,这意味着,你可以用这台服务器创建、配置、多个虚拟机和OS(Linux和Windows都行)
4、VCenter我们通过Esxi创建的虚拟机可以通过VCenter来集中管理,它的功能很强大,不仅可以管理和访问Esxi上方的虚拟服务器,也可以管理一个或多个Esxi服务器,有Windows和Linux版本
5、vsphere cilent
vsphere client也可以通过访问esxi服务管理虚拟机
vSphere client允许管理员访问 ESXi 服务并管理虚拟机。vSphere client 是安装在客户机(也就是管理员的笔记本)上面。vSphere client 被用来连接 ESXi 服务器和管理任务。那么什么是 vCenter?为什么虚拟它?尝试下在没有 vCenter server 的时候,只用 vSphere client 来克隆存在的虚拟机
这里过于基础就不展开说明了