一、KVM简介
KVM(Kernel-basedVirtual Machine)即基于内核的虚拟机,是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。
KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。
关于KVM:
KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。
在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。
KVM 内存管理
KVM 继承了 Linux 系统管理内存的诸多特性,比如,分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对 NUMA 的支持能够让虚拟机高效访问更大的内存空间等。
KVM 基于 Intel 的 EPT ( ExtendedPage Table )或 AMD 的 RVI ( Rapid
Virtualization Indexing )技术可以支持更新的内存虚拟功能,这可以降低 CPU 的占用率,并提供较好的吞吐量。
此外, KVM 还借助于 KSM ( Kernel Same-pageMerging )这个内核特性实现了内存页面共享 。 KSM
通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,
KSM 会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同 GuestOS
的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此, KSM
技术可以降低内存占用进而提高整体性能。
KVM组件
KVM主要两类组件组成:
◇/dev/kvm:管理虚拟机的设备节点,用户空间的程序可通过其ioctl()系统调用集来完成虚拟机的创建启动等管理工作;它是一个字符设备;其主要完成的操作包括:
1 2 3 4 5 | 创建虚拟机; 为虚拟机分配内存; 读、写VCPU的寄存器; 向VCPU注入中断; 运行VCPU; |
◇qemu进程:工作于用户空间的组件,用于仿真PC机的I/O类硬件设备;
qemu全称Quick Emulator。是独立虚拟软件,能独立运行虚拟机(根本不需要kvm)。kqemu是该软件的加速软件。kvm并不需要qemu进行虚拟处理,只是需要它的上层管理界面进行虚拟机控制。虚拟机依旧是由kvm驱动。
半虚拟化virtio组件
virtio半虚拟化驱动的方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即:非虚拟化环境中的原生系统)差不多的I/O性能。所以,在使用KVM之时,如果宿主机内核和客户机都支持virtio的情况下,一般推荐使用virtio达到更好的性能。当然,virtio的也是有缺点的,它必须要客户机安装特定的Virtio驱动使其知道是运行在虚拟化环境中,且按照Virtio的规定格式进行数据传输,不过客户机中可能有一些老的Linux系统不支持virtio和主流的Windows系统需要安装特定的驱动才支持Virtio。不过,较新的一些Linux发行版(如RHEL 6.3、Fedora 17等)默认都将virtio相关驱动编译为模块,可直接作为客户机使用virtio,而且对于主流Windows系统都有对应的virtio驱动程序可供下载使用。
virtio是对半虚拟化hypervisor中的一组通用模拟设备的抽象.该设置还允许hypervisor导出一组通用的模拟设备,并通过一个通用的应用程序接口(API)让它们变得可用.有了半虚拟化hypervisor之后,来宾操作系统能够实现一组通用的接口,在一组后端驱动程序之后采用特定的设备模拟.后端驱动程序不需要是通用的,因为它们只实现前端所需的行为。
KVM工具栈
二、KVM虚拟化平台构建
1、安装准备
查看你的硬件是否支持虚拟化。命令:
1 | egrep '(vmx|svm)' /proc/cpuinfo |
注意:
要有vmx或svm的标识才行。总的说来,AMD在虚拟化方面作得更好一些。
我用的是VMware Workstation 10 ,并在虚拟机的设置中打开了CPU设置中的虚拟化引擎,选择了 Intel VT-x/EPT 或 AMD-V/RVI(V) 这个选项;具体设置如下图:
2、安装KVM
由于Linux内核已经将KVM收录了,在安装系统时已经加入了KVM,我们只需要在命令行模式下启用 KVM 即可,其实这里不操作也没有问题,我们在安装qemu-kvm的时候就会自动加载。
1 2 3 4 | [root@node1 ~] # modprobe kvm_intel [root@node1 ~] # lsmod |grep kvm kvm_intel 54285 0 kvm 333172 1 kvm_intel |
3、KVM虚拟机创建和管理所依赖的组件介绍
KVM 虚拟机的创建依赖qemu-kvm :
虽然 kvm
的技术已经相当成熟而且可以对很多东西进行隔离,但是在某些方面还是无法虚拟出真实的机器。比如对网卡的虚拟,那这个时候就需要另外的技术来做补充,而
qemu-kvm 则是这样一种技术。它补充了 kvm 技术的不足,而且在性能上对 kvm 进行了优化。
我们还可以使用 virt-manager , virt-viewer 来管理虚拟机;
我们在创建和管理 KVM 虚拟机时还需要 libvirt 这个重要的组件:
它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术, kvm 、 xen 与 lxc 等,都可以调用
libvirt 提供的 api
对虚拟机进行管理。有这么多的虚拟机技术,它为何能提供这么多的管理功能那。是因为它的设计理念,它是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。这样不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且
libvirt 提供了多种语言的编程接口,可以直接通过编程,调用 libvirt 提供的对外接口实现对虚拟机的操作。如今流行的云计算中的
IaaS 是与该库联系相当密切的。通过下图可以看出它的架构设计思想。
从该图可以看出,在 libvirtapi 之上会有很多个 driver ,对于每一种虚拟机技术都会有一种 driver
,用来充当该虚拟机技术与 libvirt 之间的包装接口。如此设计就可以避免 libvirt
需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用 libvirt
提供的接口来完成自己所需要的功能。
4、安装KVM所需组件
1 | yum install -y qemu-kvm libvirt virt-manager |
安装完成后启动 libvirtd 服务:
1 | service libvirtd start |
会自动启动一个桥设备,这相当于VMware Workstation中的host-only仅主机的网络设备;
使用网桥管理命令查看:
1 2 3 | # brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254006d26bb yes virbr0-nic |
像 VMware Workstation 中我们需要创建物理桥接设备,可以使用 virsh 创建桥设备关联网卡到桥接设备上:
需要将 NetworkManager 服务关闭,开机启动也关闭,然后在创建桥接设备及关联网卡到桥接设备上:
1 | virsh iface-bridge eth0 br0 |
查看桥接设备及其他网络设备运行情况:
至此,我们的虚拟化平台就构建完毕,下面就开始在 KVM 虚拟化平台上创建和管理虚拟机,我们先使用 qemu-kvm 来创建和管理虚拟机。
三、使用qemu-kvm管理KVM虚拟机
1、Qemu-kvm介绍
Qemu 是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可以在一种架构(如 PC 机)下运行另一种架构(如
ARM)下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率。当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够获得接近于物理机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,
qemu可以虚拟x86、服务器和嵌入式 powerpc ,以及s390的系统。
QEMU当运行与主机架构相同的目标架构时可以使用KVM。例如,当在一个 x86 兼容处理器上运行 qemu-system-x86时,可以利用KVM加速――为宿主机和客户机提供更好的性能。
Qemu 有如下几个部分组成:
处理器模拟器(x86、PowerPC和Sparc);
仿真设备(显卡、网卡、硬盘、鼠标等);
用于将仿真设备连接至主机设备(真实设备)的通用设备;
模拟机的描述信息;
调试器;
与模拟器交互的用户接口;
基于libvirt的工具如virt-manager和virt-install提供了非常便捷的虚拟机管理接口,但它们事实上上经二次开发后又封装了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能够完成此前的任务。
2、Qemu-kvm的使用帮助
在RHEL6/CentOS6
上,qemu-kvm位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,这样也阻止了可以直接使用qemu作为创建并管理虚拟机。如若想使用qemu虚拟机,可以通过将/usr/libexec/qemu-kvm链接为/usr/bin/qemu-kvm实现。
1 | ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm |
qemu-kvm命令使用格式为“qemu-kvm [options] [disk_p_w_picpath]”,其选项非常多,不过,大致可分为如下几类。
1 2 3 4 5 6 7 8 9 10 11 | 标准选项; USB选项; 显示选项; i386平台专用选项; 网络选项; 字符设备选项; 蓝牙相关选项; Linux系统引导专用选项; 调试/专家模式选项; PowerPC专用选项; Sparc32专用选项; |
qemu-kvm的标准选项
qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | -name name:设定虚拟机名称; -M machine:指定要模拟的主机类型,如Standard PC、ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型; -m megs:设定虚拟机的RAM大小; -cpu model:设定CPU模型,如coreduo、qemu64等,可以使用“qemu-kvm -cpu ?”获取所支持的所有模型; -smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:设定模拟的SMP架构中CPU的个数等、每个CPU的核心数及CPU的socket数目等;PC机上最多可以模拟255颗CPU;maxcpus用于指定热插入的CPU个数上限; -numa opts:指定模拟多节点的numa设备; -fda file -fdb file :使用指定文件( file )作为软盘镜像, file 为 /dev/fd0 表示使用物理软驱; -hda file -hdb file -hdc file -hdd file :使用指定 file 作为硬盘镜像; -cdrom file :使用指定 file 作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用;将 file 指定为 /dev/cdrom 可以直接使用物理光驱; -drive option[,option[,option[,...]]]:定义一个硬盘设备;可用子选项有很多。 file = /path/to/somefile :硬件映像文件路径; if =interface:指定硬盘设备所连接的接口类型,即控制器类型,如ide、scsi、sd、mtd、floppy、pflash及virtio等; index=index:设定同一种控制器类型中不同设备的索引号,即标识号; media=media:定义介质类型为硬盘(disk)还是光盘(cdrom); snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off; cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个; format = format :指定映像文件的格式,具体格式可参见qemu-img命令; -boot [order=drives][,once=drives][,menu=on|off]:定义启动设备的引导次序,每种设备使用一个字符表示;不同的架构所支持的设备及其表示字符不尽相同,在x86 PC架构上,a、b表示软驱、c表示第一块硬盘,d表示第一个光驱设备,n-p表示网络适配器;默认为硬盘设备; -boot order= dc ,once=d |
qemu-kvm的显示选项
显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
1 2 3 4 5 6 7 8 9 10 11 12 13 | -nographic:默认情况下,qemu使用SDL来显示VGA输出;而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台; -curses:禁止图形接口,并使用curses /ncurses 作为交互接口; -alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标; -ctrl-grab:使用右Ctrl键释放鼠标; -sdl:启用SDL; -spice option[,option[,...]]:启用spice远程桌面协议;其有许多子选项,具体请参照qemu-kvm的手册; -vga type :指定要仿真的VGA接口类型,常见类型有: cirrus:Cirrus Logic GD5446显示卡; std:带有Bochs VBI扩展的标准VGA显示卡; vmware:VMWare SVGA-II兼容的显示适配器; qxl:QXL半虚拟化显示卡;与VGA兼容;在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型; none:禁用VGA卡; -vnc display[,option[,option[,...]]]:默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在VNC上,并将VGA输出重定向至VNC会话;使用此选项时,必须使用-k选项指定键盘布局类型;其有许多子选项,具体请参照qemu-kvm的手册; |
i386平台专用选项
1 2 3 | -no-acpi:禁用ACPI功能,GuestOS与ACPI出现兼容问题时使用此选项; -balloon none:禁用balloon设备; -balloon virtio[,addr=addr]:启用virtio balloon设备; |
网络属性相关选项
网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic、tap和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。
1 2 3 4 5 6 7 8 9 10 11 | -net nic[,vlan=n][,macaddr=mac][,model= type ][,name=name][,addr=addr][,vectors= v ]:创建一个新的网卡设备并连接至vlan n中;PC架构上默认的NIC为e1000,macaddr用于为其指定MAC地址,name用于指定一个在监控时显示的网上设备名称;emu可以模拟多个类型的网卡设备,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型; -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script= file ][,downscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script= file 指定的脚本(默认为 /etc/qemu-ifup )来配置当前网络接口,并使用downscript= file 指定的脚本(默认为 /etc/qemu-ifdown )来撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本; -net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有: vlan=n:连接至vlan n,默认n=0; name=name:指定接口的显示名称,常用于监控模式中; net=addr[ /mask ]:设定GuestOS可见的IP网络,掩码可选,默认为10.0.2.0 /8 ; host=addr:指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2; dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31; dns=addr:指定GuestOS可见的dns服务器地址;默认为GuestOS网络中的第三个地址,即x.x.x.3; tftp= dir :激活内置的tftp服务器,并使用指定的 dir 作为tftp服务器的默认根目录; bootfile= file :BOOTP文件名称,用于实现网络引导GuestOS;如:qemu -hda linux.img -boot n -net user,tftp= /tftpserver/pub ,bootfile= /pxelinux .0 |
四、使用qemu-kvm安装虚拟机Guest OS
测试安装centos6
1、创建虚拟机的磁盘文件
1 | qemu-img create -f qcow2 -o preallocation=metadata /p_w_picpaths/centos6 .qcow2 20G |
2、安装vnc和图形界面库
1 | yum install xorg-x11-xauth tigervnc -y |
3、安装虚拟机
创建一个名为centos6的虚拟机,其RAM大小为1024MB ,有一颗CPU的SMP架构,默认引导设备是硬盘,有一个光驱设备和硬盘设备,首先创建一个网卡启动桥接的脚本,以便于虚拟机通过物理网卡联网。
1 | cat /etc/qemu-ifup |
1 2 3 4 5 6 7 8 9 10 11 12 | #!/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 interfacespecified." exit 1 fi |
1 | chmod +x /etc/qemu-ifup |
通过qemu-kvm创建虚拟机
1 2 3 4 5 6 | qemu-kvm -name centos6 -smp 1 -m 512 \ -drive file = /p_w_picpaths/centos6 .qcow2, if =virtio,media=disk,index=0, format =qcow2 \ -drive file = /tmp/CentOS-6 .5-x86_64-minimal.iso,index=1,media=cdrom \ -net nic,model=virtio \ -net tap,ifname=vnet0,script= /etc/qemu-ifup ,downscript=no \ -vga cirrus -balloon virtio |
可以看到VNC监听在了5900端口上面,我们用Xshell再打开一个窗口,输入“vncviewer :5900”即可看到打开的终端界面,如果内存给大点就可以直接图形化界面安装了。
可以看到宿主机上面多了一个vnet0,虚拟机正常启动已经可以连接外网了。
4、Qemu监视器的使用
我们可以通过 Qemu 监视器来监测虚拟机的运行情况;
1)、Qemu 监视器打开的方式:
图形窗口模式的打开方式:
CTRL+ALT+2 :通过输入快捷键就能打开 Qemu 的监视器;
CTRL+ALT+1 :输入快捷键即可返回虚拟化机界面;
文本窗口模式的打开方式:
CTRL+a c :这组快捷键可以实现虚拟机界面和 Qemu 监视器之间的切换;
注意:如果需要让虚拟机运行在文本窗口模式,我们需要在创建和启动虚拟机时键入“-nographic”选项。
2)、打开虚拟机的Qemu监视器
按 CRTL+ALT+2 组合键即可打开Qemu监视器;
如图所示:
3)、Qemu监视器下的常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | help:显示帮助 info:显示一些虚拟机系统信息的 如:infocpus,infotlb savevm,loadvm,delvm:保存、装载、删除虚拟机快照 commit:提交虚拟机修改部分 change:改变虚拟机配置 如:changevncpassword device_add&device_del:实现动态添加和移除设备 usb_add&usb_del:添加和移除usb设备 migrate,migrate_cancel:迁移和取消迁移指令 cpu:设定默认CPU log&logfile:记录日志和将日志记录到日志文件中 sendkey:向虚拟机发送指令 system_powerdown:向客户端发送关闭电源通知 system_reset:重启虚拟机 system_wakeup:唤醒虚拟机 q or quit:退出qemu监视器,qemu进程会终止; |
关于命令的详细演示我这里不做过多介绍。
五、使用virt-install创建虚拟机并安装GuestOS
1、virt-install使用帮助
virt-install是一个命令行工具,它能够为KVM、Xen或其它支持libvrit API的hypervisor创建虚拟机并完成GuestOS安装;此外,它能够基于串行控制台、VNC或SDL支持文本或图形安装界面。安装过程可以使用本地的安装介质如CDROM,也可以通过网络方式如NFS、HTTP或FTP服务实现。对于通过网络安装的方式,virt-install可以自动加载必要的文件以启动安装过程而无须额外提供引导工具。当然,virt-install也支持PXE方式的安装过程,也能够直接使用现有的磁盘映像直接启动安装过程。
virt-install命令有许多选项,这些选项大体可分为下面几大类,同时对每类中的常用选项也做出简单说明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | ◇一般选项:指定虚拟机的名称、内存大小、VCPU个数及特性等; -n NAME, --name=NAME:虚拟机名称,需全局惟一; -r MEMORY, -- ram =MEMORY:虚拟机内在大小,单位为MB; --vcpus=VCPUS[,maxvcpus=MAX][,sockets= #][,cores=#][,threads=#]:VCPU个数及相关配置; --cpu=CPU:CPU模式及特性,如coreduo等;可以使用qemu-kvm -cpu ?来获取支持的CPU模式; ◇安装方法:指定安装方法、GuestOS类型等; -c CDROM, --cdrom=CDROM:光盘安装介质; -l LOCATION, --location=LOCATION:安装源URL,支持FTP、HTTP及NFS等,如 ftp : //172 .16.0.1 /pub ; --pxe:基于PXE完成安装; --livecd: 把光盘当作LiveCD; --os- type =DISTRO_TYPE:操作系统类型,如linux、unix或windows等; --os-variant=DISTRO_VARIANT:某类型操作系统的变体,如rhel5、fedora8等; -x EXTRA, --extra-args=EXTRA:根据--location指定的方式安装GuestOS时,用于传递给内核的额外选项,例如指定kickstart文件的位置,--extra-args "ks=http://172.16.0.1/class.cfg" --boot=BOOTOPTS:指定安装过程完成后的配置选项,如指定引导设备次序、使用指定的而非安装的kernel /initrd 来引导系统启动等 ;例如: --boot cdrom,hd,network:指定引导次序; --boot kernel=KERNEL,initrd=INITRD,kernel_args=”console= /dev/ttyS0 ”:指定启动系统的内核及initrd文件; ◇存储配置:指定存储类型、位置及属性等; --disk=DISKOPTS:指定存储设备及其属性;格式为--disk /some/storage/path ,opt1=val1,opt2=val2等;常用的选项有: device:设备类型,如cdrom、disk或floppy等,默认为disk; bus:磁盘总结类型,其值可以为ide、scsi、usb、virtio或xen; perms:访问权限,如rw、ro或sh(共享的可读写),默认为rw; size:新建磁盘映像的大小,单位为GB; cache:缓存模型,其值有none、writethrouth(缓存读)及writeback(缓存读写); format :磁盘映像格式,如raw、qcow2、vmdk等; sparse:磁盘映像使用稀疏格式,即不立即分配指定大小的空间; --nodisks:不使用本地磁盘,在LiveCD模式中常用; ◇网络配置:指定网络接口的网络类型及接口属性如MAC地址、驱动模式等; -w NETWORK, --network=NETWORK,opt1=val1,opt2=val2:将虚拟机连入宿主机的网络中,其中NETWORK可以为: bridge=BRIDGE:连接至名为“BRIDEG”的桥设备; network=NAME:连接至名为“NAME”的网络; 其它常用的选项还有: model:GuestOS中看到的网络设备型号,如e1000、rtl8139或virtio等; mac:固定的MAC地址;省略此选项时将使用随机地址,但无论何种方式,对于KVM来说,其前三段必须为52:54:00; --nonetworks:虚拟机不使用网络功能; ◇图形配置:定义虚拟机显示功能相关的配置,如VNC相关配置; --graphics TYPE,opt1=val1,opt2=val2:指定图形显示相关的配置,此选项不会配置任何显示硬件(如显卡),而是仅指定虚拟机启动后对其进行访问的接口; TYPE:指定显示类型,可以为vnc、sdl、spice或none等,默认为vnc; port:TYPE为vnc或spice时其监听的端口; listen:TYPE为vnc或spice时所监听的IP地址,默认为127.0.0.1,可以通过修改 /etc/libvirt/qemu .conf定义新的默认值; password:TYPE为vnc或spice时,为远程访问监听的服务进指定认证密码; --noautoconsole:禁止自动连接至虚拟机的控制台; ◇设备选项:指定文本控制台、声音设备、串行接口、并行接口、显示接口等; --serial=CHAROPTS:附加一个串行设备至当前虚拟机,根据设备类型的不同,可以使用不同的选项,格式为“--serial type ,opt1=val1,opt2=val2,...”,例如: --serial pty:创建伪终端; --serial dev,path=HOSTPATH:附加主机设备至此虚拟机; --video=VIDEO:指定显卡设备模型,可用取值为cirrus、vga、qxl或vmvga; ◇虚拟化平台:虚拟化模型(hvm或paravirt)、模拟的CPU平台类型、模拟的主机类型、hypervisor类型(如kvm、xen或qemu等)以及当前虚拟机的UUID等; - v , --hvm:当物理机同时支持完全虚拟化和半虚拟化时,指定使用完全虚拟化; -p, --paravirt:指定使用半虚拟化; --virt- type :使用的hypervisor,如kvm、qemu、xen等;所有可用值可以使用’virsh capabilities’命令获取; ◇其它: --autostart:指定虚拟机是否在物理启动后自动启动; --print-xml:如果虚拟机不需要安装过程(-- import 、--boot),则显示生成的XML而不是创建此虚拟机;默认情况下,此选项仍会创建磁盘映像; --force:禁止命令进入交互式模式,如果有需要回答 yes 或no选项,则自动回答为 yes ; --dry-run:执行创建虚拟机的整个过程,但不真正创建虚拟机、改变主机上的设备配置信息及将其创建的需求通知给libvirt; -d, --debug:显示debug信息; |
尽管virt-install命令有着类似上述的众多选项,但实际使用中,其必须提供的选项仅包括--name、--ram、--disk(也可是--nodisks)及安装过程相关的选项。此外,有时还需要使用括--connect=CONNCT选项来指定连接至一个非默认的hypervisor。
2、virt-install创建虚拟机
下面的示例将创建一个名为centos6的虚拟机,磁盘映像文件为稀疏模式的格式为qcow2且总线类型为virtio,安装过程不启动图形界面(--nographics),但会启动一个串行终端将安装过程以字符形式显示在当前文本模式下,虚拟机显卡类型为cirrus,这里的centos6.qcow2镜像文件会自动创建,不需要收动进行创建,每个虚拟机创建后,其配置信息保存在/etc/libvirt/qemu目录中,文件名与虚拟机相同,格式为XML。
1 2 3 4 5 6 7 8 9 10 11 12 | virt- install \ --connect qemu: ///system \ --virt- type kvm \ --name centos6 \ --vcpus 2,maxvcpus=4 \ -- ram 1024 \ --disk path= /p_w_picpaths/centos6 .qcow2,size=20,bus=virtio,sparse \ --cdrom /tmp/CentOS-6 .5-x86_64-minimal.iso \ --network bridge=br0,model=virtio \ --nographics \ --force \ --video=cirrus |
我这里使用的“--nographics”字符界面安装,可是走到一个地方一直卡着,后面我还是去掉这个参数使用图形化界面安装,需要安装“yum install virt-viewer”图形控制界面。
下面是真正的图形界面,如果提示已经存在,我们可以先停掉虚拟机“virsh destroy centos6”,然后删掉虚拟机配置文件/etc/libvirt/qemu/centos6.xml或者“virsh undefine centos6”。
六、使用virt-manager创建虚拟机
这个是图形化的安装,非常简单,这里不再过多介绍,按理请查看我的Xen虚拟机创建过程的文档。
七、virsh命令简介
1、virsh的使用方法
基本语法
virsh的基本用法如下: virsh [COMMAND] [ARGS...]
另外需要注意的是,virsh提供两种执行模式:”直接模式(Direct Mode)”与”互动模式(Interactive Mode)”。在直接模式里,你必须在Shell中以参数、自变量的方式来执行virsh,如果在互动模式中,则virsh会提供一个提示字符串,你可以在该提示字符串后,输入要执行的命令。如果执行virsh没有指定任何参数或自变量则默认就是进入互动模式。 与xm一样,COMMAND也是 virsh提供的命令,常用的命令如下表所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 命令 说明 help 显示该命令的说明 quit 结束 virsh,回到 Shell connect 连接到指定的虚拟机服务器 create 启动一个新的虚拟机 destroy 删除一个虚拟机 start 开启(已定义的)非启动的虚拟机 define 从 XML 定义一个虚拟机 undefine 取消定义的虚拟机 dumpxml 转储虚拟机的设置值 list 列出虚拟机 reboot 重新启动虚拟机 save 存储虚拟机的状态 restore 回复虚拟机的状态 suspend 暂停虚拟机的执行 resume 继续执行该虚拟机 dump 将虚拟机的内核转储到指定的文件,以便进行分析与排错 shutdown 关闭虚拟机 setmem 修改内存的大小 setmaxmem 设置内存的最大值 setvcpus 修改虚拟处理器的数量 |
而virsh命令语法的ARGS则是COMMAND搭配的参数。不同的COMMAND可能需搭配不同的参数,至于什么COMMAND可以搭配哪些参数,我将会在对各功能的介绍中提到。总地来说,如果ARGS需指定虚拟机,你可以使用下列的格式指定是哪一个虚拟机器,虚拟机的名称,虚拟机启动后的标识符,虚拟机的 UUID。 以下就是使用 virsh 的示范。
1 2 3 4 5 6 7 | [root@linux ~] # virsh ? ① [help]以取得命令的求助画面 [quit]离开 virsh # list Id Name State ---------------------------------------------------- 14 centos6 running |
1 | virsh # quit ② |
1 2 3 4 | [root@linux ~] # virsh list ③ Id Name State ---------------------------------------------------- 14 centos6 running |
由于virsh与xm的部分功能相同,因此,本节仅介绍virsh与xm的不同之处。查看Domain信息virsh 可以查看虚拟机的相关信息,你只需在执行virsh时配合如表中的命令。
查看Domain信息执行的命令
1 2 3 4 5 6 | 命令 说明 domid 查看虚拟机的标识符 domname 查看虚拟机的名称 domuuid 查看虚拟机的 UUID domstate 查看虚拟机目前的状态 dominfo 查看虚拟机的信息 |
执行上述的每一个命令时,你都必须指定虚拟机的名称、标识符和UUID。以下是我使用virsh查看虚拟机信息的示范。
2、转储区域配置
除了上述的功能外,virsh也允许把某一个虚拟机目前的设置值存储下来。virsh把设置值存储下来的动作,称为”转储(Dump)”。
转储虚拟机设置值有什么好处?
好处很多,我至少想到两个。首先,转储虚拟机的设置值可以让你把某一个虚拟机的设置备份下来,以供日后恢复该设置配置。其次,如果要用 virsh 来启动一个虚拟机,你必须指定该虚拟机的配置文件。因此,如果你希望用virsh 来管理所有的虚拟机,
那么请务必把每一个虚拟机的设置值转储下来后妥善保存。
如果要转储虚拟机的设置值,你可以执行:
1 | virsh dumpxml DOMAIN |
其中的DOMAIN就是要转储的虚拟机。你可以使用虚拟机的名称、标识符或是UUID来指定要转储到哪一个虚拟机。