本文共 6991 字,大约阅读时间需要 23 分钟。
虚拟化技术的分类: (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-vKVM的组件: 两类组件: (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-consoleksm,内核共享内存,如果在一个物理机上,启动了三个虚拟机实例,跑的都说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) noneoptions: 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) noneoptions: 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
网络虚拟化,是操作起来最复杂的部分
转载地址:http://gdkgn.baihongyu.com/