虚拟化技术的分类:
(1) 模拟:Emulation (模拟出的架构,和底层的架构是可以异构,可以不同)
Qemu, PearPC, Bochs, …
(2) 完全虚拟化:Full Virtualization,Native Virtualization(把环0所提供的内核代码,以软件模拟的方式,或者提供环-1的方式来解决)(如果cpu硬件不支持虚拟化,没有环-1,就需要把环0,对每个虚拟机实例用软件来进行模拟)
(支持环-1比较容易解决,宿主机位于环-1,虚拟机内核运行环0,不必要用软件给虚拟机模拟出一颗cpu来)
虚拟机无须了解,也无须知道运行在虚拟化中,硬件支持虚拟化,才能运行在完全虚拟化中
BT/hvm
VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm),
XEN(hvm)
(3) 半虚拟化:Para-Virutalization (环3运行在环0当中某部分指令,其他指令能够让宿主机操作系统来发现,自己知道自己在虚拟化环境中
性能非常接近底层硬件平台的性能)
特点:GuestOS明确知道自己运行虚拟机之上;
xen, UML(user-mode linux)
(4) 容器级虚拟化:(抛弃了guest-os内核,而是将本来属于宿主机的用户空间,切割分离成多个,彼此之前隔离
达到类似实验虚拟机一样的目的)
LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, …
(5) 库级别虚拟化:
wine
(6) 程序级虚拟化
jvm, pvm, …
主机虚拟化:Emulation 模拟 , Full Virtualization 虚拟化, Para-Virutalization 半虚拟化
主机虚拟化分两种
Type-I:Hypervisor直接运行于硬件;
Type-II:Hypervisor运行主机OS之上;
云栈的类别:
IaaS, PaaS, SaaS, FWaaS, DBaaS, LBaaS, …
m个主机N个虚拟主机
openstack,想象成安装在一组主机上的,能监控运行n台虚拟机实例的统一操作接口,称为cloudos
一旦有了云计算环境,就有这么个结果,需要调用一个主机,环境,一键完成,
操作系统都部署好了,用户只需要部署软件程序
基础架构即服务laaS,创建实例,用户依然需要部署操作系统,部署程序的依赖库环境,依然需要用户做
如果把依赖的环境都提供好,操作环境有了,依赖库环境好了,PAAS,就是doccker云环境提供的,直接部署引用即可
saas软件即服务,用户直接使用,(qq这样的)
软件后期也需要后面管理的服务,软件的具体需求级别,DBaaS(自动帮你备份,恢复数据库)
LBaas 负载均衡即服务
FWaas 防火墙都帮你部署
青牛云,存储解决方案,mysql自己备份的放在本地就比较麻烦
云很坑,尤其是公有云
这操作系统接口如果提供的是主机接口就是LAAS(openstack),如果是平台接口就是PAAS(docker ,k8s),
KVM(02)
kvm: Kernel-based Virtual Machine
Qumranet公司 --> RedHat
(1) X86_64 支持,不支持其他平台
(2) HVM: 要求cpu必须支持硬件虚拟化 hvm
Intel VT
AMD AMD-v
KVM的组件:
两类组件:
(kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能;
(每个kvm启动的虚拟机表现为qemu-kvm进程)qemu-kvm进程:工作于用户空间,用于实现IO设备模拟;最终用于实现一个虚拟机实例;
每一个启动的kvm虚拟机,表现为一个qemu进程,qemu-kvm是一个程序,程序运行起来后,可以帮用户创建出模拟的IO设备,而且更重要的是,这些进程能表现为最终的虚拟机实例,工作于用户空间,用于IO设备模拟,并实现虚拟机实例
(虚拟机可以虚拟多颗cpu,每一颗cpu表现为宿主机上的一个线程,每一个线程被单独调度的物理机,一个cpu核心上来运行,如果某一个虚拟机的虚拟cpu核心数超过物理机的核心数,还是没有任何意义的,反而性能会下降)
每一个虚拟机从cpu被对应为宿主机之上的qemu-kvm进程的一个线程,从而模拟出多个cpu的效果
操作系统本来只要两种模式,用户模式和内核模式,多了一个guest mode 来宾模式
io设备有三种虚拟化方式,
模拟,
半虚拟化,
io透传
KVM模块load进内存之后,系统的运行模式:
内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式;
用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
来宾模式:GuestOS的用户模式;所有的非IO类请求;
统一的半虚拟化解决方案,virtio
对于virtio支持的半虚拟化设备有这么几种,
块半虚拟化 vritio-blk
网络半虚拟化vritio-net
pci设备半虚拟化 vritio-pci
vritio-ballon(物理机内存32,虚拟机启动,物理机的内存会分配给虚拟机,分配给虚拟后,假如想把内存回收回来,分的太多了(一般是只能关闭虚拟机实例,回收内存)
想要动态回收,就是气球的作用,膨胀收缩)
控制台半虚拟化 vritio-console
ksm,内核共享内存,如果在一个物理机上,启动了三个虚拟机实例,跑的都说centos7.2,就可以认为三个虚拟机里面有些内存数据都是一样的,每一个虚拟机内核启动以后,要给每一个程序加载共享库文件,把三个共享内容合并成一个
KSM就是这样的,扫描物理内存,发现多个虚拟机实例,如果有共同的内存数据空间,把他们合并成一个,但是也麻烦,毕竟共享都会导致锁的,所以用的不多
对虚拟化技术,不同的方式不同的设备,虚拟化的性能如何
对cpu而言如果用模拟器,真正性能相当于物理性能的7%,损失了93%
paravirtualized 半虚拟化 kvm不指出半虚拟化
host pass-through 透传技术,硬件辅助虚拟化,97%(支持扩展嵌套页表,相当于物理性能97%),85%(不支持硬件虚拟化,用软件的方式,影子页表,85%)
对网络IO
模拟方式 相当于物理网卡的60%,损失40%
如果半虚拟化,75%
透传 95%
磁盘IO
模拟 IDE 接口 40%
半虚拟化 85%
透传 95%
显卡 只能模拟
因为显示器只有一个,做显示加速,也只有一组显存
time accuracy 时间精准度,linux有两套时钟,系统时钟(基于内核频率,用于进行进程间切换的时序控制,对于虚拟化来讲,时间慢是必然的,时间是不可能精准的),
如何去使用KVM
有两套工具栈kvm,一个是kvm原生的,还有一个qemu-kvm,当进行IO模拟,并运行为一个进程,对qemu而言,每一个虚拟机的硬盘设备,都是一个映像磁盘文件用qemu-img来管理
对于磁盘的数据访问和监控都用qemu-io实现
virsh命令行工具
virt-manager 图形化工具
virt-viewer 虚拟机播放器,不能做管理
virtinst 安装,要想启动虚拟机,需要安装和创建,创建虚拟机实例的命令行工具
libvirt可以监听在一个套接字上,这些工具都可以远程运行,
如何用qemu命令行工具,来完成虚拟机管理
使用qemu-kvm管理vms:
Qemu:
处理器模拟器
仿真各种IO设备
将仿真设备连接至主机的物理设备
提供用户接口
为了避免qemu手动操作,安装后,并没有放在path路径下,放在了。usr/libexec/qemu.kvm
但是可以创建软连接
功能包括创建,引导启动一个虚拟机实例,有很多选项是用来配置虚拟机的
块选项
各种选项
要想运行kvm,得主机指定创建一个虚拟机实例
标准选项、块设备相关选项、显示选项、网络选项、…
标准选项:
-machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型; 模拟出来的硬件平台架构是哪一种
-cpu cpu:-cpu help来获取列表;用于指定要模拟的CPU型号;(amd,intel,kvm)
-smp n[,maxcpus=cpus][,cores=cores](每一个插槽有几核)[,threads=threads](1核是几线程)[,sockets=sockets](有几个插槽):指明虚拟机上vcpu的数量及拓扑;(对称多处理器,打算虚拟出几颗cpu,n=4 先可以4个 maxcpus最多可以到8个,不一下子8个)
-boot [order=drives][,once=drives](光驱只在第一次启动引导)[,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备
;-boot order=dc,once=d
-m megs:虚拟机的内存大小;
-name NAME:当前虚拟机的名称,要惟一(在一个屋里主机上要唯一);
主机平台类型
想要知道支持哪些cpu
块设备相关的选项:
-hda/-hdb file:指明IDE总线类型的磁盘映射文件路径;第0和第1个;
-hdc/-hdd file:第2和第3个;
-cdrom file:指定要使用光盘映像文件;
(指定磁盘设备)-drive [file=file][,if=type](接口类型)[,media=d](媒介类型,光驱,还是硬盘)[,index=i] [,cache=writethrough通写|writeback回写|none不使用|directsync直接同步|unsafe]缓存方式有4种[,format=f]:
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径 ;
if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio,…
media=TYPE:介质类型,cdrom和disk;
index=i:设定同一类型设备多个设备的编号;
cache=writethrough|writeback|none|directsync|unsafe:缓存方式;
format=f:磁盘映像文件的格式;
进程进行写操作时,先写到缓存,接下去写到硬盘,硬盘写完,返回给进程写完了,这种叫做通写,性能低,但是数据安全性高
directsync 直接写到磁盘,数据安全性更高,但是性能更差
回写,写入缓冲区,就告诉你写完了,过一会由内核自行 决定什么时候同步到硬盘上,性能好,但是数据安全性查
unsafe 性能更好,但是数据安全性得不到保障
这个命令可以显示磁盘镜像文件的型号,vwmare是vmdk的
kvm是qcow2
显示选项:
-display type:显示的类型,sdl, curses, none和vnc;
-nographic:不使用图形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:指明模拟出的显卡的型号;
-vnc display[,option[,option[,…]]]]:启动一个vnc server来显示虚拟机接口(vnc在宿主机上,而不是在虚拟机上的);让qemu进程监听一个vnc接口;
display:
(1) HOST:N
在HOST主机的第N个桌面号输出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:连接此服务所需要的密码;
-monitor stdio:在标准输出上显示monitor界面;
Ctrl-a, c:在console和monitor之间切换;
Ctrl-a, h
现在在命令行操作
先看下如何启用命令行来安装虚拟机
name centos7
-m 内存大小 512M 默认单位M
-cpu cpu类型 使用host主机类型cpu
-smp cpu核心数 2,有多少颗cpu=1,一颗cpu2核
-cdfrom file 磁盘映像文件
info查看映像文件信息,虚拟硬盘大小是39M,真正的disksize 磁盘文件大小是11M
format specific information 格式特有信息
** create创建空白映像文件。-f指定格式,-o指定选项,filename 指定文件名称,**
?问号可以获取帮助,这里显示创建时支持的哪些选项
encryption 文件要不要加密
prellocation 立即分配, metadata 立即分配拟元数据,falloc 文件分配器决定,使用一个很大的磁盘映像文件最好使用ometadata ,表示只预先分配元数据
size可以直接指明大小
du才是真正大小,所以称为稀疏格式的磁盘映像文件
显示选项:
-display type:显示的类型,sdl, curses, none和vnc;
-nographic:不使用图形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;
-vnc display[,option[,option[,…]]]]:启动一个vnc server来显示虚拟机接口;
让qemu进程监听一个vnc接口;
display:
(1) HOST:N
在HOST主机的第N个桌面号输出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:连接此服务所需要的密码;
-monitor stdio:在标准输出上显示monitor界面;
Ctrl-a, c:在console和monitor之间切换;
Ctrl-a, h
virtio,用半虚拟化,性能会好很多,media整个设备是什么,disk 是磁盘设备,
cacahe=writeback回写
format=qcow2格式
-nographic
现在就准备创建一个虚拟机实例,并尝试启动,没有启动图形界面,就卡在这里
可以ps aux查看,可以直接kill掉
、可以用vnc来进行显示,有个参数,显示在哪个桌面上 冒号:0代表第0个桌面(也标识监听在本机的5900端口,1表示监听在5901端口)
可以用客户端链接
没有可引导设备,所以启动虚拟机的时候需要装系统,需要一个iso镜像文件
重新启动刚才的虚拟机实例
–dirve file =文件
order 启动方式
d第一个光盘设备c第一个硬盘c ,,once
如果用网卡可以基于PXE来安装
网络选项:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
为虚拟机创建一个网络接口,并将其添加至指定的VLAN;
model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,
virtio;
-net nic,model=?
macaddr=mac:指明mac地址;默认是52:54:00:(多个会冲突,所以需要指明)
-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:
通过物理的TAP网络接口连接至vlan n;
script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
ifname=NAME:自定义接口名称;
/etc/qemu-ifup
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
网络虚拟化,是操作起来最复杂的部分