学习Kvm(三)
虚拟化(将一个物理硬件平台虚拟成多个)
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,这时进程要退出,内核在cpu的ring0上运行;guest OS的kernel中同样有普通指令、特权指令,当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 compression,VMM,virtual machine monitor必须要运行在ring0上,为避免guest OS控制系统资源,guestOS不得不降低自身的运行级别在ring3上(特权级不够使用),VMM使用分页或段限制的方式保护物理内存的访问,但64bit模式下段限制不起作用,而分页又不区分ring{0,1,2},为统一和简化VMM的设计,guest OS只能和用户进程一样运行在ring3上,VMM必须监控guest OS对GDT、IDT(CPU寄存器)等特权资源的位置,防止guest OS运行在ring0,同时又要保护降级后的guest OS不受guest进程的主动攻击或无意破坏;特权级别名ring alias,搞一些假的特权指令集告诉guest OS这就是ring0;地址空间压缩address space compression;非特权敏感指令;静默特权失败silentprivilege failure;中断虚拟化interrupt virtualization)
classical virtualization的基本需求(1974,Popek、Goldberg,真正意义的VMM至少需要三个方面的标准:等价执行equivalient execution,除资源可用性及时间上的不同之外,程序在虚拟化环境中及真正环境中的执行是完全相同的;性能performance,指令集中的大部分指令要能直接运行在CPU上;安全safety,VMM要能完全控制系统资源,某个guest OS运行不能影响到其它的guest OS,各guest OS间要实现隔离,且任何一个guest OS要执行特权指令,host OS要能提前捕获对其处理,任何一个guest OS都不能越过host OS对整个物理硬件发出任何特权控制指令)
注:Intel和AMD的CPU(X86)上有模糊地带(普通指令与特权指令间)
CPU硬件虚拟化(Intel:VT-x;AMD:AMD-V;特权级别加入ring-1,guest OS在ring0上,事实上ring0是空出来的一环没有指令,当guestOS试图要在ring0上运行时会触发ring-1,由ring-1决定执行指令、转换并翻译这个指令运行)
内存虚拟化(Intel(EPT,extended page table)和AMD(RVI,rapid virtualization indexing;NPT,nested pagetables)分别通过EPT、RVI技术为虚拟化应用提升shadow MMU(完成VA-->HA一步到位)的性能,降低CPU的占用率,提供良好的吞吐量;并通过标记tagged TLB来避免虚拟机切换时频繁清写flush TLB以提高TLB缓存的命中率(用TLB保存MMU的转换结果)
KVM 还借助于KSM(KernelSame-pageMerging)这个内核特性实现了内存页面共享。KSM 通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,KSM 会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同 GuestOS 的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此,KSM 技术可以降低内存占用进而提高整体性能。
注:将离散的内存地址空间在hypervisor上再整合在一起分给guest OS,guest OS的VA-->guest OS的PA-->host OS的PA(HA);MMU,memory management unit
IO设备虚拟化(网卡、硬盘等大多数的IO设备是通过软件(如vmware)模拟(假网卡、假硬盘),guestOS的网卡往外发报文(IP报文本身是独立的),来的报文哪个主机收(guest OS还是host OS),是根据MAC接收报文的,假硬盘上存的数据最终都要到物理硬盘上,在物理硬盘上建立本地回环镜像文件(如用dd命令创建的文件,格式化后能充当swap分区用)与模拟的磁盘建立关联关系,guest OS就把假硬盘当硬盘用,但真正在物理机上表现的是个文件,虚拟的磁盘没物理硬盘性能好,IO要转换两次,若要让guest OS的IO disk性能好点,使用共享存储(iSCSI),guest OS作为client直接使用共享存储;网卡也是这样,模拟一个假网卡与本地的文件建立关联关系,guest OS A同guest OS B之间经网卡通信(或guest OS同host OS通信)借助于OS通过IPC解决(vmware中有虚拟通道),无论使用什么MAC都无所谓,若与外部网络通信,通过bridge、NAT,NAT这种方式是将物理机网卡上的MAC当作网关,源地址转换,类似各guest OS组成网络,要与外部网络通信时将报文发至网关,物理机通过地址转换送到外部网络,外部网络是看不到guest OS的,bridge这种方式将guest OS的虚拟网卡绑定在物理网卡上且让物理网卡运行在混杂模式下(无论目标MAC是不是它都要接收,接收下来转给guest OS,二层代理机制,在二层就转了),bridge这种方式可将物理网卡理解为是switch,host OS的网卡可理解为也是虚拟网卡,guest OS上的网卡也是虚拟网卡,物理网卡接收到报文目标MAC是哪个虚拟网卡就转发到对应的虚拟网卡上(桥接就是网桥,模拟的是switch))
IO虚拟化(Intel和AMD在主板上创建芯片组时,这个芯片组可完成IO虚拟化(在硬件级别上),如Intel:IOMMU,IO设备要映射到当前OS上,为IO分配缓冲区,在passthrough技术上要借助IOMMU)
半虚拟化PV(para virtualization,IO设备虚拟化,guest OS的kernel-->vmware-->host OS的kernel-->物理网卡,性能不好,若直接与host OS的内核打交道则性能会好很多,将中间那步绕过去,模拟的文件该存在让它存在直接绕过它,将host OS网卡的驱动程序做成system call直接输出给虚拟机使用(guest OS-->host OS的system call),这违反虚拟化原则,guest OS就知道它在虚拟化环境中,这种技术叫半虚拟化para virtualization,性能好,直接与硬件打交道速度要快)
完全虚拟化FV(full virtualization,guest OS不认为它在虚拟化环境中;CPU不支持硬件虚拟化技术,要模拟特权指令)
硬件辅助的虚拟化HVM(hardware-assistant VM,CPU支持硬件虚拟化技术,VMM运行在ring-1,guest OS运行在ring0, HVM,hardware-assistant VM,硬件辅助的虚拟化)
PV和HVM整合(guest OS知道自己在虚拟化环境中,只要与硬件打交道,host OS都向guest OS输出system call(将特权指令集也输出为system call)或叫hypercall(hypervisor call),这样性能会好很多,要求在PV下的OS必须要改内核才能使用hypercall(win不能改内核))
PV on HVM(基于HVM的PV技术,把PV中的CPU不用了而用HVM,用IO的PV,这样既利用了CPU的HVM,又利用IO的PV技术,性能会很好)
注:cpu、memory、io都可用PV,有了HVM,cpu的PV将用不着,io的PV能用得上,硬件再辅助,某一种IO设备就那一个,有资源争用
IO穿透技术passthrough I/O(guest OS直接使用独立的网卡)
常见的虚拟化模型:
有宿主机的VMM,VMM要借助于内核才能完成虚拟化(hosted VMM)
硬件之上直接是VMM,这种模型下的VMM称为hypervisor,VMM具备OS的管理机制(VMM自带对CPU、memory等的管理),可理解为是精简的OS只提供虚拟化服务,VMM具备驱动底层硬件的能力(安装前要查看VMM所支持的硬件类型)
注:vmware workstation,vmware server,vmware ESX商业(hypervisor),vmware ESXi(免费,简易版)
Xen提供对CPU、memory、interrupt这三个关键性硬件管理外,其它功能如驱动等都不提供,Xen它自己驱动不了任何硬件设备,要在Xen之上立即安装一个虚拟机(Linux),这个特权Linux提供驱动,提供管理界面,可直接操作底层硬件,Xen中的虚拟机称为Dom{0,1,2,3……}(domain),Dom0为特权虚拟机,通过Dom0来管理其它的Dom{1,2,3}(称为DomU),Dom0要使用CPU、memory、interrupt这三个关键性硬件要通过Xen,而其它的IO设备可直接使用,在Dom0上创建一模拟设备,要通过Xen关联至Dom1上(Dom0将半虚拟化的硬件驱动程序通过Xen的hypercall送给Dom1),Dom1要使用网卡向外发数据要先发至Dom0由Dom0访问硬件网卡,Xen不管理IO等硬件设备,Dom1要使用CPU(或memory或interrupt)则直接由Xen管理,这样一部分要交由Xen管理,一部分交由Dom0管理,Xen是一种半虚拟化的解决方案,就算cpu、memory不支持HVM,Xen照样可高性能运行,若cpu、memory支持HVM,Xen也可使用full virtualization,各硬件是模拟的性能较差,完全虚拟化FV和PV的最大区别,FV中的guest OS的kernel不用修改了,那Xen之上的虚拟机可使用win了(FV的好处),若Dom1是Linux可使用PV on HVM(CPU不虚拟化了使用HVM,而对于其它的IO硬件使用PV))
Qemu(quickemulator,是独立虚拟软件,能独立运行虚拟机,kqemu是该软件的加速软件;常用于模拟器,1M,虚拟化软件,跨平台虚拟,如将硬件CPUx86的模拟成苹果的arm或IBM的power pc,可帮助程序员提供测试环境,好处如底层是X86的CPU,可在guest OS上也使用X86的CPU并进行优化,让其接近硬件CPU的性能运行)
通常Xen和Qemu结合使用,Qemu主要实现为其它guest OS基于软件方式模拟硬件(虚拟网卡、虚拟硬盘等)、本地回环文件(用文件充当虚拟硬盘用),qemu-img支持众多的格式,包括vmware的格式
Xend/xm(在Xen上创建虚拟机,安装OS并引导,Xen提供了专门的管理工具Xend/xm,Xend是管理服务,xm是命令(可start、pause、suspend某个虚拟机,完全在CLI下),Xen将其对硬件的管理功能通过API输出给xm这个管理工具,创建好硬件不用重启直接附加在虚拟机上并能让虚拟机识别出来,Xen可虚拟CPU,用xm通过Xen的API创建多个CPU,虚拟机可直接使用,比vmware workstation要强大灵活,通过Xen的API可开发出图形管理工具,有数十种管理工具(CLI下和GUI下),如openstack、cloudstack,这些云平台就是利用虚拟机(Xen)的API提供了能够管理虚拟机进程的管理程序
注:如redhat为Xen提供的管理工具virsh比xm更强大且易用,virsh支持众多虚拟化技术且更通用
KVM(kernel-based VM,基于内核的虚拟机,KVM是内核模块,没有这个模块OS还是本来的OS,这个模块一旦被kernel装载了,OS就摇身变成了hypervisor,KVM可让OS成为hypervisor,KVM取巧利用内核提供的各种驱动,在OS kernel的基础上成为hypervisor,在hypervisor之上跑的是虚拟机(实际上是进程),用ps也能看到,内核自身管理硬件,在内核之上还要提供OS用来管理虚拟机,在硬件之上的 host OS可启动额外的进程(虚拟机),所有的虚拟机都表现为进程,在guest mode(来宾模式)下有user space和kernel space)
kvm(结构简单,分两部分(设备驱动/dev/kvm;针对模拟pc硬件的用户空间组件);
注:百科上的kvm:KVM 是 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如何使用硬件(kernel将CPU时间片分给虚拟机;memory,kernel虚拟化一部分即可;iodevice,管理的OS模拟硬件,虚拟机用网卡时,虚拟机的kernel-->管理的OS模拟的硬件-->真正的kernel-->硬件(类似Xen);模拟硬件借助Qemu,它可虚拟化任何硬件,乍看KVM是多余的,没有KVM,Qemu照样可虚拟化,KVM有Qemu没有的优势,Qemu对CPU的虚拟是在user space通过软件模拟加速实现的,性能再好也无法与kernel性能相比,而KVM是内核模块比Qemu模拟出的硬件性能要好,更能接近硬件性能)
通常使用KVM+Qemu,KVM要求只能装在支持硬件虚拟化的CPU上,而且只能在X86_64平台(Xen若硬件不支持虚拟化可半虚拟化);KVM在2.6.20后直接整合进kernel上,Xen没有;2.6.37以后Xen也加入kernel(注意是运行在Xen上的DomU而非Dom0);3.0以后的kernel运行在Dom0上的Xen也收入内核(也就是3.0以后的kernel可直接使用Xen,3.0之前的kernel要使用Xen得打补丁);redhat2008年收购了KVM(以色列公司的KVM),redhat6.0之后只支持KVM;Xen比KVM强大、稳定,Xen(英国剑桥大学)被Citrix思杰(仅次于vmware第二大虚拟化提供商)收购
redhat(KVM)、citrix(Xen)、vmware(vmware)、microsoft(hyper-V)
KVM(redhat引入virtio(将IO实现PV),支持passthroughI/O)
container(在kernel之上提供了userspace(有对网卡、硬盘的配置程序,可理解为是VM),kernel是公共的,性能比FV和PV要好,对于FV和PV要运行两个kernel,若任何一个VM管理不慎将kernel搞崩溃了,其它VM将不能正常运行,VM间隔离效果没FV和PV好)
openVZ(Linux上的container技术,很多IDC提供VPS(virtualprivate server)时使用openVZ或Xen)
wine(虚拟出win的库,这样win的所有程序都能运行,cywin在win下虚拟linux的库运行linux程序)
注:只要底层有真正硬件,所有硬件都能模拟,Qemu还可跨平台模拟
常见的虚拟化技术(virtualization products at a glance):
X86平台虚拟化技术(Intel:VT-x、EPT、IOMMU)
虚拟化中的网络模型(如vmware下的NAT、host-only、bridge、vmnet{1,2,3},NAT模型下可自动分配IP):
可理解为VMM用软件模拟了一个switch,创建的虚拟机VM1只要关联到虚拟网络上,就意味着关联到虚拟的switch上,这个虚拟的switch是连到host OS的虚拟网卡上的(网上邻居可看到vmnet1);host-only,VM1通过虚拟网卡可与物理机通信,不能同外部网络通信,若在物理机上有一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服务的
虚拟机多时,彼此间通信要统一管理会比较麻烦,openstack和cloudstack提供了一种平台,能让物理机随时能加进来,如当前的物理机不够用再加几台进来,正在运行的虚拟机流动的在不同的物理机上运行(实时迁移),某一物理机出问题,其上的虚拟机会迁移到其它物理机上运行,不影响虚拟机的使用,云还能管理网络,虚拟机加进来后要给这个虚拟机分配IP,如何与其它公司的虚拟机隔离,云还要提供存储,云为虚拟机更方便的使用提供了统一管理的接口(IaaS基础架构即服务)
raw格式(优点:寻址简单,访问效率较高,可通过格式转换工具方便的转换为其它格式,可方便的被宿主机挂载,可在不启动VM的情况下和宿主机进行数据传输;缺点:实现简单,不支持压缩、快照、加密、cow等特性,raw格式文件在创建时指定大小之后就占用了宿主机指定大小的空间,而qcow2等稀疏模式的镜像格式可从很小的文件按需增长);
qcow2格式(是qcow的改进,建议使用,是qemu实现的一种VM镜像格式,qcow2文件存储数据的基本单元是cluster,每一个cluster由若干个数据扇区组成,每个数据扇区的大小是512byte,在qcow2中,要定位镜像文件的cluster,需要经过两次地址查询操作,类似于主存二级页表转换机制;更小的存储空间,即使不支持holes FS也可,使用du -h和ll看到的一模一样;copy on write support,where the image only represents changes madeto an underlying disk image,此特性在SUN ZFS表现的淋漓尽致;支持多个snapshot;支持zlib磁盘压缩;支持AES加密
[root@master ~]# egrep --color "vmx|svm" /proc/cpuinfo #(intel-vt关键字用vmx,amd-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-manager,virt-viewer 来管理虚拟机;在创建和管理 KVM 虚拟机时还需要 libvirt 这个重要的组件:它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术, kvm 、 xen 与 lxc 等,都可以调用 libvirt 提供的 api 对虚拟机进行管理。有这么多的虚拟机技术,它为何能提供这么多的管理功能那。是因为它的设计理念,它是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。这样不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且 libvirt 提供了多种语言的编程接口,可以直接通过编程,调用 libvirt 提供的对外接口实现对虚拟机的操作。如今流行的云计算中的 IaaS 是与该库联系相当密切的)
注:libvirt的架构设计思想,在 libvirtapi 之上会有很多个 driver ,对于每一种虚拟机技术都会有一种 driver ,用来充当该虚拟机技术与 libvirt 之间的包装接口。如此设计就可以避免 libvirt 需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用 libvirt 提供的接口来完成自己所需要的功能。
[root@master ~]# yum-y install device-mapper
[root@master ~]# service libvirtd start
[root@master ~]# ifconfig #(libvirtd启动后,会自动创建一个桥设备,相当于vmware中host-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,在前台运行占据当前终端窗口)
[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 device为0M)
[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连接
装完系统后会要求重启,此窗口会关闭
[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,不能加载新配置,要先用destroy再start
方式一(通过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
方式二(用dumpxml导出-->通过vim编辑-->用define重新定义domain的xml配置文件):
[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
#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.查看命令帮助
2.查看kvm的配置文件存放目录
3.查看虚拟机状态
4.虚拟机开关机
首先查看acpid服务是否运行
5.通过配置文件启动虚拟机系统实例
6.强制关闭虚拟机电源
7.挂起虚拟机
8.恢复虚拟机
9.配置虚拟机伴随宿主机自动启动
10.导出虚拟机配置
11.虚拟机的删除与添加
四、kvm文件管理
概述:kvm虚拟机磁盘文件有raw和qcow2两种格式,默认使用raw格式
l raw格式:性能好,速度快,但不支持一些新功能,如镜像、zlib磁盘压缩、AES加密等
l 安装libguestfs-tools包
1.转换raw格式磁盘到qcow2格式
关闭虚拟机
转换磁盘文件
2.修改centos的xml配置文件(第23和24行)
3.virt-cat命令,类似与cat命令。格式为
virt-cat 磁盘文件 虚拟机本地的文件
4.virt-edit。用于编辑文件,与vim类似
5.virt-df命令,用于查看虚拟机磁盘信息
五、虚拟机克隆--处于关机状态克隆
1.查看虚拟机状态
2.从centos6.5克隆到test01
3.查看虚拟机状态