虚拟化(将一个物理硬件平台虚拟成多个)

vmware(模拟出一堆硬件设备,每一个硬件设备都是独立平台)

虚拟化要解决的问题(硬件之上的OS,有用户空间、内核空间;vmware虚拟机所模拟出的多个硬件平台上的每一个OS也有用户空间、内核空间;每个内核都意识不到其它主机存在,直接使用硬件设备(内存),这将会覆盖掉其它的正在使用的内存空间,产生资源争用会使系统崩溃,硬件之上的这个OS将内存留一部分给kernel用,其它的给进程用,vmware虚拟机及其它进程使用的内存是高地址内存空间(非0地址空间),关键是每个内核都要使用从0开始的内存地址空间)

 guest OS(虚拟出来的虚拟机,内存地址转换要有两次,效率低,多个guest OS要与IO设备(网卡、磁盘)交互)

hypervisor(虚拟机管理程序)

  

CPU虚拟化(将时间片再分细点,指令分普通指令和特权指令,ring{0,1,2,3}ring0,privileged ring特权环是能运行敏感指令(特权指令)的,进程运行只能运行普通指令(进程在cpu上运行无非将进程的代码转换为cpu上运行的指令),要想用特权指令,如要访问硬盘、访问内存中的数据时通过system call,这时进程要退出,内核在cpuring0上运行;guest OSkernel中同样有普通指令、特权指令,当guest OS上的进程需要运行特权指令(实际上管理虚拟机软件vmware的运行是在用户空间的,所以guest OS是不能运行敏感指令的,不能让虚拟机的内核运行在ring0上,只能运行在ring3上,否则它会将硬件资源视为可全量使用,会清空其它进程的内存、重启系统等操作)又不能运行这显然不合适,每一个kernel都认为自己在ring0上,通过模拟让guest OS认为自己在ring0上,保留一些关键的特权指令(如重启系统等),否则无法保证整个OS的安全性,实际上guest OS并不真正运行特权指令,每次guest OS的进程-->guest OS的内核-->host OS的内核,ring0就是一堆特权指令集来保证各guest OS间是隔离的,当host OS要关机就能控制整个系统关机,不管guest允不允许,host OS的内核才是真正意义的特权阶层,host OS要能监控每一个guest OS执行的指令并判定它能否运行)

 

X86平台要实现CPU的虚拟化面临的挑战(特权级压缩ring compressionVMM,virtual machine monitor必须要运行在ring0上,为避免guest OS控制系统资源,guestOS不得不降低自身的运行级别在ring3上(特权级不够使用),VMM使用分页或段限制的方式保护物理内存的访问,但64bit模式下段限制不起作用,而分页又不区分ring{0,1,2},为统一和简化VMM的设计,guest OS只能和用户进程一样运行在ring3上,VMM必须监控guest OSGDTIDTCPU寄存器)等特权资源的位置,防止guest OS运行在ring0,同时又要保护降级后的guest OS不受guest进程的主动攻击或无意破坏;特权级别名ring alias,搞一些假的特权指令集告诉guest OS这就是ring0;地址空间压缩address space compression;非特权敏感指令;静默特权失败silentprivilege failure;中断虚拟化interrupt virtualization

 

classical virtualization的基本需求(1974PopekGoldberg,真正意义的VMM至少需要三个方面的标准:等价执行equivalient execution,除资源可用性及时间上的不同之外,程序在虚拟化环境中及真正环境中的执行是完全相同的;性能performance,指令集中的大部分指令要能直接运行在CPU上;安全safetyVMM要能完全控制系统资源,某个guest OS运行不能影响到其它的guest OS,各guest OS间要实现隔离,且任何一个guest OS要执行特权指令,host OS要能提前捕获对其处理,任何一个guest OS都不能越过host OS对整个物理硬件发出任何特权控制指令)

 

注:IntelAMDCPUX86)上有模糊地带(普通指令与特权指令间)

CPU硬件虚拟化(IntelVT-xAMDAMD-V;特权级别加入ring-1guest OSring0上,事实上ring0是空出来的一环没有指令,当guestOS试图要在ring0上运行时会触发ring-1,由ring-1决定执行指令、转换并翻译这个指令运行)

  

内存虚拟化IntelEPTextended page table)和AMDRVIrapid virtualization indexingNPTnested pagetables)分别通过EPTRVI技术为虚拟化应用提升shadow MMU(完成VA-->HA一步到位)的性能,降低CPU的占用率,提供良好的吞吐量;并通过标记tagged TLB来避免虚拟机切换时频繁清写flush TLB以提高TLB缓存的命中率(用TLB保存MMU的转换结果)

KVM 还借助于KSMKernelSame-pageMerging)这个内核特性实现了内存页面共享。KSM 通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,KSM 会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同 GuestOS 的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此,KSM 技术可以降低内存占用进而提高整体性能。

注:将离散的内存地址空间在hypervisor上再整合在一起分给guest OSguest OSVA-->guest OSPA-->host OSPAHA);MMUmemory management unit

wKioL1fObgaRg97ZAAB5yDyv89U078.jpg

  

IO设备虚拟化(网卡、硬盘等大多数的IO设备是通过软件(如vmware)模拟(假网卡、假硬盘),guestOS的网卡往外发报文(IP报文本身是独立的),来的报文哪个主机收(guest OS还是host OS),是根据MAC接收报文的,假硬盘上存的数据最终都要到物理硬盘上,在物理硬盘上建立本地回环镜像文件(如用dd命令创建的文件,格式化后能充当swap分区用)与模拟的磁盘建立关联关系,guest OS就把假硬盘当硬盘用,但真正在物理机上表现的是个文件,虚拟的磁盘没物理硬盘性能好,IO要转换两次,若要让guest OSIO disk性能好点,使用共享存储(iSCSI),guest OS作为client直接使用共享存储;网卡也是这样,模拟一个假网卡与本地的文件建立关联关系,guest OS Aguest OS B之间经网卡通信(或guest OShost OS通信)借助于OS通过IPC解决(vmware中有虚拟通道),无论使用什么MAC都无所谓,若与外部网络通信,通过bridgeNATNAT这种方式是将物理机网卡上的MAC当作网关,源地址转换,类似各guest OS组成网络,要与外部网络通信时将报文发至网关,物理机通过地址转换送到外部网络,外部网络是看不到guest OS的,bridge这种方式将guest OS的虚拟网卡绑定在物理网卡上且让物理网卡运行在混杂模式下(无论目标MAC是不是它都要接收,接收下来转给guest OS,二层代理机制,在二层就转了),bridge这种方式可将物理网卡理解为是switchhost OS的网卡可理解为也是虚拟网卡,guest OS上的网卡也是虚拟网卡,物理网卡接收到报文目标MAC是哪个虚拟网卡就转发到对应的虚拟网卡上(桥接就是网桥,模拟的是switch))

IO虚拟化(IntelAMD在主板上创建芯片组时,这个芯片组可完成IO虚拟化(在硬件级别上),如IntelIOMMUIO设备要映射到当前OS上,为IO分配缓冲区,在passthrough技术上要借助IOMMU

wKioL1fObjXCzqZDAACC4iG2gK8401.jpg

 

 半虚拟化PVpara virtualizationIO设备虚拟化,guest OSkernel-->vmware-->host OSkernel-->物理网卡,性能不好,若直接与host OS的内核打交道则性能会好很多,将中间那步绕过去,模拟的文件该存在让它存在直接绕过它,将host OS网卡的驱动程序做成system call直接输出给虚拟机使用(guest OS-->host OSsystem call),这违反虚拟化原则,guest OS就知道它在虚拟化环境中,这种技术叫半虚拟化para virtualization,性能好,直接与硬件打交道速度要快)

完全虚拟化FVfull virtualizationguest OS不认为它在虚拟化环境中;CPU不支持硬件虚拟化技术,要模拟特权指令)

硬件辅助的虚拟化HVMhardware-assistant VMCPU支持硬件虚拟化技术,VMM运行在ring-1guest OS运行在ring0 HVM,hardware-assistant VM,硬件辅助的虚拟化)

 

PVHVM整合guest OS知道自己在虚拟化环境中,只要与硬件打交道,host OS都向guest OS输出system call(将特权指令集也输出为system call)或叫hypercallhypervisor call),这样性能会好很多,要求在PV下的OS必须要改内核才能使用hypercallwin不能改内核))

PV on HVM(基于HVMPV技术,把PV中的CPU不用了而用HVM,用IOPV,这样既利用了CPUHVM,又利用IOPV技术,性能会很好)

注:cpumemoryio都可用PV,有了HVMcpuPV将用不着,ioPV能用得上,硬件再辅助,某一种IO设备就那一个,有资源争用

IO穿透技术passthrough I/Oguest OS直接使用独立的网卡)

  

常见的虚拟化模型:

有宿主机的VMMVMM要借助于内核才能完成虚拟化(hosted VMM

硬件之上直接是VMM,这种模型下的VMM称为hypervisorVMM具备OS的管理机制(VMM自带对CPUmemory等的管理),可理解为是精简的OS只提供虚拟化服务,VMM具备驱动底层硬件的能力(安装前要查看VMM所支持的硬件类型)

注:vmware workstationvmware servervmware ESX商业(hypervisor),vmware ESXi(免费,简易版)

 

Xen提供对CPUmemoryinterrupt这三个关键性硬件管理外,其它功能如驱动等都不提供,Xen它自己驱动不了任何硬件设备,要在Xen之上立即安装一个虚拟机(Linux,这个特权Linux提供驱动,提供管理界面,可直接操作底层硬件,Xen中的虚拟机称为Dom{0,1,2,3……}domain),Dom0为特权虚拟机,通过Dom0来管理其它的Dom{1,2,3}(称为DomU),Dom0要使用CPUmemoryinterrupt这三个关键性硬件要通过Xen,而其它的IO设备可直接使用,在Dom0上创建一模拟设备,要通过Xen关联至Dom1上(Dom0将半虚拟化的硬件驱动程序通过Xenhypercall送给Dom1),Dom1要使用网卡向外发数据要先发至Dom0Dom0访问硬件网卡,Xen不管理IO等硬件设备,Dom1要使用CPU(或memoryinterrupt)则直接由Xen管理,这样一部分要交由Xen管理,一部分交由Dom0管理,Xen是一种半虚拟化的解决方案,就算cpumemory不支持HVMXen照样可高性能运行,若cpumemory支持HVMXen也可使用full virtualization,各硬件是模拟的性能较差,完全虚拟化FVPV的最大区别,FV中的guest OSkernel不用修改了,Xen之上的虚拟机可使用win了(FV的好处),若Dom1Linux可使用PV on HVMCPU不虚拟化了使用HVM,而对于其它的IO硬件使用PV))

 

Qemuquickemulator,是独立虚拟软件,能独立运行虚拟机,kqemu是该软件的加速软件;常用于模拟器,1M,虚拟化软件,跨平台虚拟,如将硬件CPUx86的模拟成苹果的armIBMpower pc,可帮助程序员提供测试环境,好处如底层是X86CPU,可在guest OS上也使用X86CPU并进行优化,让其接近硬件CPU的性能运行)

 

通常XenQemu结合使用,Qemu主要实现为其它guest OS基于软件方式模拟硬件(虚拟网卡、虚拟硬盘等)、本地回环文件(用文件充当虚拟硬盘用),qemu-img支持众多的格式,包括vmware的格式

 

Xend/xm(在Xen上创建虚拟机,安装OS并引导,Xen提供了专门的管理工具Xend/xmXend是管理服务,xm是命令(可startpausesuspend某个虚拟机,完全在CLI下),Xen将其对硬件的管理功能通过API输出给xm这个管理工具,创建好硬件不用重启直接附加在虚拟机上并能让虚拟机识别出来,Xen可虚拟CPU,用xm通过XenAPI创建多个CPU,虚拟机可直接使用,比vmware workstation要强大灵活,通过XenAPI可开发出图形管理工具,有数十种管理工具(CLI下和GUI下),如openstackcloudstack,这些云平台就是利用虚拟机(Xen)的API提供了能够管理虚拟机进程的管理程序

 

注:如redhatXen提供的管理工具virshxm更强大且易用,virsh支持众多虚拟化技术且更通用

wKioL1fObmWgJN7kAACaUtZJye0074.jpg

  

KVMkernel-based VM,基于内核的虚拟机,KVM是内核模块,没有这个模块OS还是本来的OS,这个模块一旦被kernel装载了,OS就摇身变成了hypervisorKVM可让OS成为hypervisorKVM取巧利用内核提供的各种驱动,在OS kernel的基础上成为hypervisor,在hypervisor之上跑的是虚拟机(实际上是进程),用ps也能看到,内核自身管理硬件,在内核之上还要提供OS用来管理虚拟机,在硬件之上的 host OS可启动额外的进程(虚拟机),所有的虚拟机都表现为进程,在guest mode(来宾模式)下有user spacekernel space

kvm(结构简单,分两部分(设备驱动/dev/kvm;针对模拟pc硬件的用户空间组件);

 

注:百科上的kvmKVM kernel-based Virtual Machine 的简称,是一个开源的系统虚拟化模块,自Linux2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM已成为学术界的主流VMM之一。KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己到进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列也是基于软件模拟的Para-Virtualization

KVM (全称是 Kernel-based Virtual Machine) Linux x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块 kvm.ko 提供和虚拟化核心架构和处理器规范模块。

使用 KVM ,可允许运行多个虚拟机,包括 Linux Windows操作系统。每个虚拟机有私有的硬件,包括网卡、磁盘以及图形适配卡等。

 

KVM如何使用硬件(kernelCPU时间片分给虚拟机;memorykernel虚拟化一部分即可;iodevice,管理的OS模拟硬件,虚拟机用网卡时,虚拟机的kernel-->管理的OS模拟的硬件-->真正的kernel-->硬件(类似Xen);模拟硬件借助Qemu,它可虚拟化任何硬件,乍看KVM是多余的,没有KVMQemu照样可虚拟化,KVMQemu没有的优势,QemuCPU的虚拟是在user space通过软件模拟加速实现的,性能再好也无法与kernel性能相比,而KVM是内核模块比Qemu模拟出的硬件性能要好,更能接近硬件性能)

 

通常使用KVM+QemuKVM要求只能装在支持硬件虚拟化的CPU上,而且只能在X86_64平台(Xen若硬件不支持虚拟化可半虚拟化);KVM2.6.20后直接整合进kernel上,Xen没有;2.6.37以后Xen也加入kernel(注意是运行在Xen上的DomU而非Dom0);3.0以后的kernel运行在Dom0上的Xen也收入内核(也就是3.0以后的kernel可直接使用Xen3.0之前的kernel要使用Xen得打补丁);redhat2008年收购了KVM(以色列公司的KVM),redhat6.0之后只支持KVMXenKVM强大、稳定,Xen(英国剑桥大学)被Citrix思杰(仅次于vmware第二大虚拟化提供商)收购

 

redhatKVM)、citrixXen)、vmwarevmware)、microsofthyper-V

KVMredhat引入virtio(将IO实现PV),支持passthroughI/O

 

container(在kernel之上提供了userspace(有对网卡、硬盘的配置程序,可理解为是VM),kernel是公共的,性能比FVPV要好,对于FVPV要运行两个kernel,若任何一个VM管理不慎将kernel搞崩溃了,其它VM将不能正常运行,VM间隔离效果没FVPV好)

openVZLinux上的container技术,很多IDC提供VPSvirtualprivate server)时使用openVZXen

 

wine(虚拟出win的库,这样win的所有程序都能运行,cywinwin下虚拟linux的库运行linux程序)

 

注:只要底层有真正硬件,所有硬件都能模拟,Qemu还可跨平台模拟

常见的虚拟化技术(virtualization products at a glance):

wKiom1fObojzE1avAAEiZnBI758633.jpg

  

X86平台虚拟化技术(IntelVT-xEPTIOMMU

 

虚拟化中的网络模型(如vmware下的NAThost-onlybridgevmnet{1,2,3}NAT模型下可自动分配IP):

可理解为VMM用软件模拟了一个switch,创建的虚拟机VM1只要关联到虚拟网络上,就意味着关联到虚拟的switch上,这个虚拟的switch是连到host OS的虚拟网卡上的(网上邻居可看到vmnet1);host-onlyVM1通过虚拟网卡可与物理机通信,不能同外部网络通信,若在物理机上有一dhcp服务指定在物理网卡上,switch不隔离广播报文,那VM{1,2,3}均可获取到地址;虚拟通道是专用网络,如vmnet2是仅模拟了一个switch,物理机上没有对应的虚拟网卡,仅能让在此虚拟通道上的VM{1,2,3}通信;NAT模型下VM{1,2,3}可访问外网,而外网主机不能主动访问VM{1,2,3}除非做DNAT规则要定义在物理主机上(win下的vmware会自动生成规则,而linux下要自己写规则);bridge模型下可理解为物理网卡成为了模拟的switch,所有的报文都通过switch出去,对于发来的报文switch会全部接收下来,再根据MAC判断是哪个网卡上的,是物理网卡还是VM{1,2,3}的网卡,桥接时是不提供dhcp服务的

虚拟机多时,彼此间通信要统一管理会比较麻烦,openstackcloudstack提供了一种平台,能让物理机随时能加进来,如当前的物理机不够用再加几台进来,正在运行的虚拟机流动的在不同的物理机上运行(实时迁移),某一物理机出问题,其上的虚拟机会迁移到其它物理机上运行,不影响虚拟机的使用,云还能管理网络,虚拟机加进来后要给这个虚拟机分配IP,如何与其它公司的虚拟机隔离,云还要提供存储,云为虚拟机更方便的使用提供了统一管理的接口(IaaS基础架构即服务)

  

raw格式(优点:寻址简单,访问效率较高,可通过格式转换工具方便的转换为其它格式,可方便的被宿主机挂载,可在不启动VM的情况下和宿主机进行数据传输;缺点:实现简单,不支持压缩、快照、加密、cow等特性,raw格式文件在创建时指定大小之后就占用了宿主机指定大小的空间,而qcow2等稀疏模式的镜像格式可从很小的文件按需增长);

qcow2格式(是qcow的改进,建议使用,是qemu实现的一种VM镜像格式,qcow2文件存储数据的基本单元是cluster,每一个cluster由若干个数据扇区组成,每个数据扇区的大小是512byte,在qcow2中,要定位镜像文件的cluster,需要经过两次地址查询操作,类似于主存二级页表转换机制;更小的存储空间,即使不支持holes FS也可,使用du -hll看到的一模一样;copy on write support,where the image only represents changes madeto an underlying disk image,此特性在SUN ZFS表现的淋漓尽致;支持多个snapshot;支持zlib磁盘压缩;支持AES加密

 

wKiom1fOd1ziR6HNAAAyz7ZwU6Q945.jpg

 [root@master ~]# egrep --color "vmx|svm" /proc/cpuinfo   #intel-vt关键字用vmxamd-v关键字svm

[root@master ~]# lsmod | grep kvm

[root@master ~]# modprobe kvm   #(启用kvm模块)

[root@master ~]# modprobe kvm-intel   #(是intel加载kvm-intel,是amd加载kvm-amd

[root@master ~]# lsmod | grep kvm

[root@master ~]# yum -y install libvirt qemu-kvm virt-manager   #KVM 虚拟机的创建依赖qemu-kvm :虽然 kvm 的技术已经相当成熟而且可以对很多东西进行隔离,但是在某些方面还是无法虚拟出真实的机器,比如对网卡的虚拟,那这个时候就需要另外的技术来做补充,而qemu-kvm则是这样一种技术,它补充了 kvm 技术的不足,而且在性能上对 kvm 进行了优化。还可用 virt-managervirt-viewer 来管理虚拟机;在创建和管理 KVM 虚拟机时还需要 libvirt 这个重要的组件:它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术, kvm xen lxc 等,都可以调用 libvirt 提供的 api 对虚拟机进行管理。有这么多的虚拟机技术,它为何能提供这么多的管理功能那。是因为它的设计理念,它是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。这样不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且 libvirt 提供了多种语言的编程接口,可以直接通过编程,调用 libvirt 提供的对外接口实现对虚拟机的操作。如今流行的云计算中的 IaaS 是与该库联系相当密切的)

 

wKioL1fObyzTXiCwAAA9bfy7QUI477.jpg

注:libvirt的架构设计思想,在 libvirtapi 之上会有很多个 driver ,对于每一种虚拟机技术都会有一种 driver ,用来充当该虚拟机技术与 libvirt 之间的包装接口。如此设计就可以避免 libvirt 需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用 libvirt 提供的接口来完成自己所需要的功能。

[root@master ~]# yum-y install device-mapper

[root@master ~]# service libvirtd start

[root@master ~]# ifconfig   #libvirtd启动后,会自动创建一个桥设备,相当于vmwarehost-only网络设备)

[root@master ~]# rpm -ql qemu-kvm

//usr/libexec/qemu-kvm

[root@master ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm

[root@master ~]# virsh iface-bridge eth0 br0   #(使用virsh创建桥设备,关联网卡到桥设备上,类似vmware中创建的物理桥接设备

[root@master ~]# yum -y install tigervnc tigervnc-server  #(安装vncviewer

[root@master ~]# vncpasswd   

[root@master ~]# vncserver   #(启动vncserver

 [root@master ~]# vncserver -list

方式一(使用qemu-kvm):

[root@master ~]# mkdir -pv /kvm/images

[root@master ~]# qemu-img create -f raw /kvm/images/test.raw 5G

[root@master ~]# dd if=/dev/cdrom1 of=/kvm/images/rhel6.iso  #(制作安装guest os的光盘镜像)

[root@master ~]# qemu-kvm -cpu host -smp 1 -m 512 -drive file=/kvm/images/test.raw,if=ide,media=disk,format=raw -drive file=/kvm/images/rhel6.iso,media=cdrom -boot dc -usbdevice tablet   #(此命令是在前台运行,占据当前终端,默认位置在/usr/libexec/qemu-kvm已将其链接至/usr/bin/qemu-kvm

VNC server running on `::1:5900'

 [root@master ~]# vncviewer :5900   #(开启另一窗口进入guestos,在前台运行占据当前终端窗口)

wKiom1fOb36w-qnRAACbyKBbFcc446.jpg

wKioL1fOb4rwmsXDAAB1AEKmrGg316.jpg

 [root@master ~]# qemu-img info /kvm/images/test.raw

方式二(使用virt-install):

[root@master ~]# qemu-img create -f qcow2 /kvm/images/test2.qcow2 5G

[root@master ~]# qemu-img info /kvm/images/test2.qcow2

[root@master ~]# qemu-img check /kvm/images/test2.qcow2

[root@master ~]# virt-install --name=test2 --ram=512 --vcpus=1 --os-variant=rhel6 --disk path=/kvm/images/test2.qcow2,format=qcow2,size=5,bus=virtio --accelerate --cdrom=/kvm/images/rhel6.iso --graphics vnc,listen=0.0.0.0,port=5911 --network bridge=br0,model=virtio --noautoconsole   #(使用qcow2镜像格式,创建guestos时必须要在此处指定其格式和使用virtio驱动,否则系统无法正常安装,会提示virtio block device0M

[root@master ~]# ps aux | grep kvm

qemu      9804  0.5 32.0 1370892 321788?      Sl   21:20  0:24 /usr/libexec/qemu-kvm -name test2 -S -M rhel6.6.0 -enable-kvm -m512 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid5b4b8e46-3036-31a6-5670-77370675a550 -nodefconfig -nodefaults -chardevsocket,id=charmonitor,path=/var/lib/libvirt/qemu/test2.monitor,server,nowait-mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 -deviceich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2-drive file=/kvm/images/test2.qcow2,if=none,id=drive-virtio-disk0,format=qcow2,cache=none-devicevirtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1-drive if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -deviceide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdevtap,fd=22,id=hostnet0,vhost=on,vhostfd=23 -devicevirtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:7f:03:2f,bus=pci.0,addr=0x3-chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0-device usb-tablet,id=input0 -vnc 0.0.0.0:11 -vga cirrus -devicevirtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6 -msg timestamp=on

win上使用TigerVNC连接

wKioL1fOb86SyasEAABBedDB0Sc237.jpg

wKiom1fOb9uj5PFNAABrWHgq4ow007.jpg

wKioL1fOb-nz5fa4AABzo_lrTVY148.jpg

装完系统后会要求重启,此窗口会关闭

 [root@master ~]# virsh start test2

 [root@master ~]# virsh list   ##virsh list--all可查看所有domain包括关机的)

[root@master ~]# ll /etc/libvirt/qemu/   #(自动生成test2.xml,此文件很关键记录着VM的所有配置)

更改guest os配置:

注:使用#virsh reboot test2,不能加载新配置,要先用destroystart

方式一(通过virsh edit DOMAIN直接编辑):

[root@master ~]# head -13 /etc/libvirt/qemu/test2.xml

  <memoryunit='KiB'>524288</memory>

  <currentMemoryunit='KiB'>524288</currentMemory>

[root@master ~]# virsh edit test2

 <memory unit='KiB'>824288</memory>

 <currentMemory unit='KiB'>824288</currentMemory>

[root@master~]# virsh destroy test2

[root@master ~]# virsh start test2

 wKiom1fOcD3RW-DfAABfEAvbq98197.jpg

 方式二(用dumpxml导出-->通过vim编辑-->define重新定义domainxml配置文件):

[root@master ~]# virsh dumpxml test2 > test_tmp.xml

[root@master ~]# vim test_tmp.xml

 <memory unit='KiB'>424320</memory>

 <currentMemory unit='KiB'>424288</currentMemory>

[root@master ~]# cp test_tmp.xml /etc/libvirt/qemu/test2.xml

[root@master ~]# virsh define /etc/libvirt/qemu/test2.xml

[root@master ~]# virsh destroy test2

[root@master ~]# virsh start test2

wKiom1fOcGCBoQMdAABfgSt_Las011.jpg

#qemu-img convert -c -f raw -O qcow2 test.rawtest.qcow2   镜像转换

 ##########################################################################################

说明:

kvm为linux内核的一个模块,模块不需要安装,只需要加载

virt-manageer 为kvm的管理包

libvirt 为创建虚拟机的工具包

qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的) 
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的

#virsh -c qemu:///system list         检查KVM是否成功安装

#virt-install --help

通用选项:

   -n NAME, --name=NAME                                            客户端事件名称

   -r MEMORY, --ram=MEMORY                                    以 MB 为单位为客户端事件分配的内存

   --vcpus=VCPUS                                                         配置来宾账户的虚拟 CPU(vcpu) 数量,如:

                        --vcpus 5

                        --vcpus 5, maxcpus=10

                        --vcpussocket=2,cores=4,threads=2

   --cpuset=CPUSET     Set which physical CPUs domain can use.

   --cpu=CPU              CPU型号及功能,如:--cpu coreduo,+x2apic

   --description=DESCRIPTION                                   在生成的 XML 中保存的可读 VM 描述。

   --security=SECURITY                                               设定域安全驱动器配置。

   --numatune=NUMATUNE                                         为域进程调整 NUMA 策略。

安装方法选项:

   -c CDROM, --cdrom=CDROM                                  光驱安装介质

   -l LOCATION, --location=LOCATION                        安装源(例如:nfs:host:/path、http://host/path                        ://host/path)

                            --pxe                                                使用 PXE 协议从网络引导

                            --import                                             在磁盘映像中构建客体

                            --init=INIT                                        为容器虚拟机启动二进制的路基该您。例

                                           如:

                                                  --init /path/to/app(包含应用程序)

                                                   --init /sbin/init(用于所有 OS 容器)

   --livecd                                                                    将光驱介质视为 Live CD

   -x EXTRA, --extra-args=EXTRA                             附加到使用 --location 引导的内核的参数

   --initrd-inject=INITRD_INJECTIONS                       使用 --location 为 initrd 的 root      添加给定文件

   --os-type=DISTRO_TYPE                                       要安装的操作系统类型,例如:'linux'、'unix'、'windows'

   --os-variant=DISTRO_VARIANT                            The OS variant beinginstalled guests,  'rhel5', 'solaris10', 'win2k'

   --boot=BOOTOPTS                                                自选配置后安装引导顺序、菜单、永久kernel 引导,等等。

 存储配置:

   --disk=DISKOPTS     Specifystorage with various options. Ex.

                        --diskpath=/my/existing/disk

                        --disk path=/my/new/disk,size=5(in gigabytes)

                        --diskvol=poolname:volname,device=cdrom,bus=scsi,...

   --nodisks                                                               不要为该客户端设置任何磁盘。

   --filesystem=FILESYSTEMS                                将主机目录传递给虚拟机。例如:

                        --filesystem/my/source/dir,/dir/in/guest

                        --filesystemtemplate_name,/,type=template

 联网配置:

   -w NETWORK, --network=NETWORK

                        Configure a guestnetwork interface. Ex:

                        --network bridge=mybr0

                        --networknetwork=my_libvirt_virtual_net

                        --networknetwork=mynet,model=virtio,mac=00:11...

   --nonetworks                                                        不要为该客体创建网络接口。

 图形配置:

   --graphics=GRAPHICS

                        配置虚拟机显示设置。例如:

                        --graphics vnc

                        --graphicsspice,port=5901,tlsport=5902

                        --graphics none

                        --graphicsvnc,password=foobar,port=5910,keymap=ja

   --noautoconsole                                                 不要自动尝试连接到客户端控制台

 设备选项:

   --serial=SERIALS                                              配置虚拟机串口设备

   --parallel=PARALLELS                                     配置虚拟机并口设备

   --channel=CHANNELS                                     配置虚拟机沟通频道

   --console=CONSOLES                                    配置虚拟机与主机之间的文本控制台连接

   --host-device=HOSTDEVS                              Configure physical hostdevices attached to the guest

   --soundhw=SOUNDHW                                  Configureguest sound device emulation

   --watchdog=WATCHDOG                               配置虚拟机 watchdog 设备

   --video=VIDEO                                               配置虚拟机视频硬件。

   --smartcard=SMARTCARD                            配置虚拟机智能卡设备。例如:

                        --smartcardmode=passthrough

   --redirdev=REDIRDEV                               Configure a guestredirection device. Ex:

                        --redirdevusb,type=tcp,server=192.168.1.1:4000

   --panic=PANIC                                            Configure a guest panic device. Ex:

                        --panic default

 虚拟化平台选项:

   -v, --hvm                                                       客户端应该是一个全虚拟客户端

   -p, --paravirt                                                 这个客户端一个是一个半虚拟客户端

   --container                                                   This guestshould be a container guest

   --virt-type=HV_TYPE                                  要使用的管理程序名称(kvm、qemu、xen等等)

   --arch=ARCH                                              模拟的 CPU 构架

   --machine=MACHINE   The machinetype to emulate

   --noapic                                                     为全虚拟客户端禁用 APIC(在 os-type/os-

                        variant db 中覆盖数值)

   --noacpi                                                      为全虚拟客户端禁用 ACPI(在 os-type/os-

                        variant db 中覆盖数值)

   -u UUID, --uuid=UUID                            客户端 UUID。

 其它选项:

   --autostart                                               引导主机时自动启动域。

   --print-xml                                               输出所生成域的

                        XML,而不是定义虚拟机。

   --print-step=XMLSTEP                           输出具体安装步骤(1,2,3,all)的

                        XML。

   --noreboot                                              完成安装后不要引导虚拟机。

   --wait=WAIT                                           要等待的时间(以分钟为单位)

   --dry-run                                                 完成安装步骤,但不要创建设备或者定义虚拟机。

   --force                                                     对任意应用程序提示强制回答‘yes’,终止左右其它提示

   -q, --quiet                                               禁止无错误输出

   --prompt                                                 要求用户为模糊情况或者需要的选项输入。

   -d, --debug                                             输入故障排除信息

# virt-install --connectqemu:///system --name kvm4 --ram 500 --disk path=/dev/sdb5 --network bridge=br0--arch x86_64 --graphics sdl --location=/tmp/CentOS-7-x86_64-Minimal-1511.iso

使用命令创建一台虚拟机    

    -n(Name):            指定虚拟机的名称 

    –memory(–raw):  指定内存大小 
    –cpu:                        指定cpu的核数(默认为1) 
    –cdrom:                    指定镜像 
    –disk:                       指定磁盘路径(即上文创建的虚拟磁盘) 
    –virt-type:                 指定虚拟机类型(kvm,qemu,xen) 
    –network:                 指定网络类型

使用kvm命令管理虚拟机---virsh

1.查看命令帮助

wKioL1jtbrHgCUV4AAAHTosdB4k933.png-wh_50 

2.查看kvm的配置文件存放目录

wKiom1jtbsWjfKYRAAATl4S_CzQ238.png-wh_50 

3.查看虚拟机状态

wKioL1jtbuGhmimuAAAPuxDFS-c376.png-wh_50 

4.虚拟机开关机

首先查看acpid服务是否运行

wKiom1jtbvrQOjrSAAARAlkBEp8842.png-wh_50 

wKiom1jtbxHgwsmmAAAJuxZILIA088.png-wh_50 

wKioL1jtbyWCDm-7AAAH9AEPslI545.png-wh_50 

5.通过配置文件启动虚拟机系统实例

wKioL1jtb0CRBdZbAAAQrzvB3WU805.png-wh_50 

wKioL1jtb1SwWbOqAAAP4D8t3X8826.png-wh_50 

6.强制关闭虚拟机电源

wKiom1jtb2vjDB-0AAAMiJ1MNTE200.png-wh_50 

7.挂起虚拟机

wKiom1jtb4HilDVNAAAMn8QdgvA348.png-wh_50 

8.恢复虚拟机

wKioL1jtb5iCVNZRAAAMZWCG9FQ038.png-wh_50 

9.配置虚拟机伴随宿主机自动启动

wKiom1jtb7LRGp3hAAAMwDAi3Tc194.png-wh_50 

wKioL1jtb8ehEh8dAAAPy_c6h3U345.png-wh_50 

10.导出虚拟机配置

wKiom1jtb9yRFuP0AAANeK7uuyo323.png-wh_50 

11.虚拟机的删除与添加

wKiom1jtcDjAzv0rAAAMek_86G4606.png-wh_50 

wKioL1jtcE2BCqYOAAANOAor0XY793.png-wh_50 

wKioL1jtcGLDMx89AAAXNskKrN4053.png-wh_50 

 

四、kvm文件管理

概述:kvm虚拟机磁盘文件有raw和qcow2两种格式,默认使用raw格式

l raw格式:性能好,速度快,但不支持一些新功能,如镜像、zlib磁盘压缩、AES加密等

l 安装libguestfs-tools包

wKiom1jtcHvRi4C7AAAL5hilklk945.png-wh_50 

1.转换raw格式磁盘到qcow2格式

wKioL1jtcJvTvggeAAAbYZ2N39A685.png-wh_50 

关闭虚拟机

wKioL1jtcMij4tILAAAKOG2og8M269.png-wh_50 

转换磁盘文件

wKiom1jtcO_jrbd3AAARf4i7uIo823.png-wh_50 

2.修改centos的xml配置文件(第23和24行)

wKioL1jtcQbgJxKkAAASaZg-hVI087.png-wh_50 

3.virt-cat命令,类似与cat命令。格式为

virt-cat  磁盘文件  虚拟机本地的文件

wKiom1jtcSOhHVJrAAASAGSosZE692.png-wh_50 

4.virt-edit。用于编辑文件,与vim类似

wKioL1jtcTzhTaGlAAASEKWzcTs864.png-wh_50 

5.virt-df命令,用于查看虚拟机磁盘信息

wKiom1jtcVHykwrLAAAgO4BIkWo005.png-wh_50 

五、虚拟机克隆--处于关机状态克隆

1.查看虚拟机状态

wKiom1jtcWvSVnEVAAAQ5257Xc0678.png-wh_50 

2.从centos6.5克隆到test01

wKioL1jtcYHALh8iAAALxwu_ZTM577.png-wh_50 

3.查看虚拟机状态

wKioL1jtcZiBNqGVAAAPsL1vo2g844.png-wh_50