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

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.查看虚拟机状态

学习Kvm(三)的更多相关文章

  1. kvm虚拟化学习笔记(三)之windows kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  2. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  3. 从零开始学习jQuery (三) 管理jQuery包装集

    本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...

  4. 前端学习 第三弹: JavaScript语言的特性与发展

    前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...

  5. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  6. 三、Android学习第三天——Activity的布局初步介绍(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...

  7. JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB

    JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命 ...

  8. MyEclipse Spring 学习总结三 SpringMVC

    MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...

  9. Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar

    web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...

  10. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

随机推荐

  1. 数据平滑处理-均值|中值|Savitzky-Golay滤波器

    均值滤波器 均值滤波器是一种使用频次较高的线性滤波器.它的实现原理很简单,就是指定一个长度大小为奇数的窗口,使用窗口中所有数据的平均值来替换中间位置的值,然后平移该窗口,平移步长为 1,继续重复上述操 ...

  2. Android系统编程入门系列之硬件交互——无线通信WLAN

    Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不 ...

  3. Qt:QWebChannel

    0.说明 QWebChannel的作用是将QObject展示给的HTML客户. QWebChannel是连接C++应用和HTML/JS应用的桥梁.通过把一个QObject传入QWebChannel并在 ...

  4. CentOS 8: yum仓库配置

    在CentOS 8中,使用yum时出现错误,镜像列表中没有url,类似如下: Error: Failed to download metadata for repo 'appstream': Cann ...

  5. JS-购物车

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Kubernetes:Ingress总结(一)

    Blog:博客园 个人 参考:Ingress | Kubernetes.<Kubernetes进阶实战>.<Kubernetes网络权威指南 > 何谓Ingress?从字面意思 ...

  7. 《Unity shader入门精要》复习<第13章 关于NDC坐标和深度/法线纹理>

    分为三个地方讲解. NDC(Normalize Device Coordinates)归一化的设备坐标 NDC坐标是世界空间坐标通过MVP变换之后再进行归一化得到的坐标.只需要再一步变换就能得到屏幕空 ...

  8. 除非Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。

    解决办法: 打开WINDOWS服务管理方法: 进入服务有二种方法: 1.开始-控制面板-管理工具单击,找到"服务"双击打开 在WINDOWS服务管理里 启动 World Wide ...

  9. 七天接手react项目 系列 —— react 脚手架创建项目

    其他章节请看: 七天接手react项目 系列 react 脚手架创建项目 前面我们一直通过 script 的方式学习 react 基础知识,而真实项目通常是基于脚手架进行开发. 本篇首先通过 reac ...

  10. 报错 ——Error evaluating expression 'id != null id > 0'.

    Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error qu ...