kvm的管理工具栈:
qemu-kvm
libvirt
管理kvm虚拟方案:
qemu:/usr/libexec/
libvirt:
安装工具:
virt-install
virt-manager
管理工具:
vish
virt-manager
virt-viewer
使用qemu-kvm管理工具:
qemu [options] [disk_image]
命令选项:
标准选项;
显示选项;
块设备选项;
网络选项;
i386平台专用选项;
字符设备选项;
蓝牙设备选项;
Linux启动专用选项;
调试/专家模式选项;
cirros project:为cloud环境测试vm提供的微缩版Linux;
启动第 一个虚拟机:
~]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-0.3.6-x86_64-disk.img
Ctrl+Alter+2 # 切换至qumu的monitor接口,包含众多管理虚拟机的命令
用-drive指定磁盘映像文件:
~]# qemu-kvm -m 128 -cpu host -smp 2 -name "test1" -drive file=cirros-0.3.6-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback
通过cdrom启动winxp的安装:
~]# qemu-kvm -name winxp -smp 4,socket=1,cores=2,threads=2 -m 512 -drive file=/images/kvm/winxp.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom
指定使用桥接网络接口:
qemu-kvm -m 128 -name test -smp 2 -drive file=/images/kvm/cirros-0.3.0.4-i386-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic -net tap,script=/etc/if-up,downscript=no -nographic
指定以网络接口启动vm:
~]# qemu-kvm -m 512 -smp 2 -name centos -drive file=/images/centos/centos6.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:55:32:19 -net tap,ifname=centos6.0,script=/etc/qemu-ifup -boot order=nc,once=n
显示选项:
SDL:Simple DirectMedia Layer(简单直接介质层);C语言开发,跨平台且开源多媒体程序库文件;
在qemu中使用“-sdl”即可;
VNC:Virtual Network Computing,使用RFB(Remote FrameBuffer)协议远程控制另外的主机;
CentOS 6.6
(1) yum install tigervnc-server
(2) vncpasswd
(3) vncserver :N
qemu-kvm
-vnc display,option,option
示例:-vnc :N,password
启动qemu-kvm时,额外使用-monitor stdio选项,并使用change vnc password命令设置密码;
补充资料:qemu-kvm使用文档
2.5.6 使用qemu-kvm管理KVM虚拟机
Qemu是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可以在一种架构(如PC机)下运行另一种架构(如ARM)下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率。当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够获得接近于物理机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,qemu可以虚拟x86、服务器和嵌入式powerpc,以及s390的系统。
QEMU 当运行与主机架构相同的目标架构时可以使用 KVM。例如,当在一个x86兼容处理器上运行 qemu-system-x86 时,可以利用 KVM 加速——为宿主机和客户机提供更好的性能。
Qemu有如下几个部分组成:
◇ 处理器模拟器(x86、PowerPC和Sparc);
◇ 仿真设备(显卡、网卡、硬盘、鼠标等);
◇ 用于将仿真设备连接至主机设备(真实设备)的通用设备;
◇ 模拟机的描述信息;
◇ 调试器;
◇ 与模拟器交互的用户接口;
2.5.6.1 使用qemu-kvm安装Guest
如2.5.5中所述,基于libvirt的工具如virt-manager和virt-install提供了非常便捷的虚拟机管理接口,但它们事实上上经二次开发后又封装了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能够完成此前的任务。
2.5.6.1.1 qemu-kvm命令
在RHEL6上,qemu-kvm位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,这样也阻止了可以直接使用qemu作为创建并管理虚拟机。如若想使用qemu虚拟机,可以通过将/usr/libexec/qemu-kvm链接为/usr/bin/qemu实现。
# ln -sv /usr/lib/exec/qemu-kvm /usr/bin/qemu-kvm
qemu-kvm命令使用格式为“qemu-kvm [options] [disk_image]”,其选项非常多,不过,大致可分为如下几类。
◇ 标准选项;
◇ USB选项;
◇ 显示选项;
◇ i386平台专用选项;
◇ 网络选项;
◇ 字符设备选项;
◇ 蓝牙相关选项;
◇ Linux系统引导专用选项;
◇ 调试/专家模式选项;
◇ PowerPC专用选项;
◇ Sparc32专用选项;
考虑到篇幅及使用需要,这里介绍的选项主要涉及到标准选项、显示选项、i386平台专用选项及Linux系统引导专用选项等相关的选项。
2.5.6.1.2 qemu-kvm的标准选项
qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。
◇ -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等; # 查看用ls /sys/bus/virtio/devices/
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
2.5.6.1.3 qemu-kvm的显示选项
显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
◇ -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的手册;
display可用下面几种形式替换:
(1) host:N
172.16.100.7:1, 监听于172.16.100.7主的5900+N的端口上
(2) unix:/path/to/socket_file
(3) none
options:
password: 连接时需要验正密码;设定密码通过monitor接口使用change; # change vnc password,回车
reverse: “反向”连接至某处于监听状态的vncview上;
-monitor stdio:表示在标准输出上显示monitor界面
-nographic
Ctrl-a, c: 在console和monitor之间切换 # 如要使用此快捷键,在创建虚机时不能加-monitor stdio选项。
Ctrl-a, h: 显示帮助信息
2.5.6.1.5 网络属性相关选项
网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic(前半段)、tap(后半段)和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。
kvm的4种网络模型:NAT模型、路由模型、隔离模型、桥接模型
◇ -net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:创建一个新的网卡设备并连接至vlan n中;PC架构上默认的NIC为e1000,macaddr用于为其指定MAC地址,name用于指定一个在监控时显示的网上设备名称;qemu可以模拟多个类型的网卡设备,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型;
注意:默认mac地址均为:52:54:00:12:34:56,使用中需要手动指定;
◇ -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
总结:
kvm的网络模型:
1、隔离模型:在host创建一个vswitch(bridge device);每个虚拟机的tap设备直接添加至vswitch上;
2、路由模型:给br设置IP地址,将虚拟机的网关配置成此地址,并开启hypervisor核心转发功能;
3、NAT模型:
4、桥接模型:将网卡做成交换机,并关联至br,br配置主机ip,用来处理发往主机的包。
~]# yum list all | grep -i bridge # 查看是否拥有桥设备工具程序
~]# modinfo bridge # 查看是否装载桥模块
~]# yum install bridge-utils.x86_64 # 安装桥设备工具
~]# brctl addbr br0 # 添加名为br0的桥
~]# ifconfig -a
~]# brctl stp br0 off
~]# brctl show # 显示桥
~]# brctl delbr br0
~]# ifconfig br0 up # 激活故而设备
~]# ip link set dev br0 up # 激活桥设备
~]# qemu-kvm -m 128 -cpu host -smp 2 -name "test" -hda cirros-0.3.6-x86_64-disk.img -net nic,model=e1000 -net tap,name=vif0.0 -net nic -net tap,ifname=vif0.1
~]# qemu-kvm -m 128 -cpu host -smp 2 -name "test" -drive file=cirros-0.3.6-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic,model=e1000 -net tap,name=vif0.0,script=no
2.5.6.1.6 一个使用示例
下面的命令创建了一个名为rhel5.8的虚拟机,其RAM大小为512MB,有两颗CPU的SMP架构,默认引导设备为硬盘,有一个硬盘设备和一个光驱设备,网络接口类型为virtio,VGA模式为cirrus,并启用了balloon功能。
# qemu-kvm -name "rhel5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-drive file=/isos/rhel-5.8.iso,index=1,media=cdrom \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio
需要注意的是,上述命令中使用的硬盘映像文件/VM/images/rhel5.8/hda需要事先使用qemu-img命令创建,其具体使用格式请见下节介绍。
在虚拟机创建并安装GuestOS完成之后,可以免去光驱设备直接启动之。命令如下所示。
# qemu-kvm -name "rhel5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio
2.5.6.1.7 使用qemu-img管理磁盘映像
qemu-img是qemu用来实现磁盘映像管理的工具组件,其有许多子命令,分别用于实现不同的管理功能,而每一个子命令也都有一系列不同的选项。其使用语法格式为“qemu-img subcommand [options]”,支持的子命令如下。
◇ create:创建一个新的磁盘映像文件;
◇ check:检查磁盘映像文件中的错误;
◇ convert:转换磁盘映像的格式;
◇ info:显示指定磁盘映像的信息;
◇ snapshot:管理磁盘映像的快照;
◇ commit:提交磁盘映像的所有改变;
◇ rbase:基于某磁盘映像创建新的映像文件;
◇ resize:增大或缩减磁盘映像文件的大小;
使用create子命令创建磁盘映像的命令格式为“create [-f fmt] [-o options] filename [size]”,例如下面的命令创建了一个格式为qcow2的120G的稀疏磁盘映像文件。
# qemu-img create -f qcow2 /VM/images/rhel5.8/hda 120G
Formatting '/VM/images/rhel5.8/hda', fmt=qcow2 size=128849018880 encryption=off cluster_size=65536
更进一步的使用信息请参照手册页。
qemu-kvm的其它的用到的参数:
动态迁移时用到的选项:-incoming tcp:0:PORT
让qemu-kvm进程运行于后台:-daemonize
开启USB总线:-usb
GuestOS为Windows时,-usb -usbdevice tablet 用于实现鼠标定位
打开KVM的支持:qemu-kvm默认就启用了此选项
-enable-kvm
打声音设备:-soundhw
设定iscsi存储设备:
-iscsi [user=USERNAME][,password=PASSWORD][,initiator-name=iqn]
通过URL指定使用的iscsi设备
iscsi://<target_ip>[:port]/<target_iqn>/<lun>
# qemu-kvm -iscsi initiator-name= -drive file=iscsi://tgt.magedu.com/iqn.2014-05.com.magedu.tgt1/1
指定使用的bios文件:
-bios /path/to/some_bios_program
使用外部内核及ramdisk文件:
-kernel
-initrd
-append: 向内核传递的参数列表
virtio半虚拟化:
HVM:虚拟化CPU
I/O半虚拟化分成两段:
前端驱动(virtio前半段):virtio-blk,virtio-net,virtio-pci,virtio-balloon,virtio-console
Linux:CentOS 4.8+,5.3+,6.0+,7.0+
Windows:
virtio:虚拟队列,virt-ring
transport:
后端处理程序(virt backend drivers):在QEMU中实现;
virtio-balloon:
ballooning:让VM中运行的GuestOS动态调整其内存大小;
# qemu-kvm -balloon virtio
手动查看GuestOS的内存用量;
info balloon
balloon N
virtio-net:
其依赖于GuestOS中的驱动,及Qemu中的后端驱动
GuestOS:virtio_net.ko
Qemu:qemu-kvm -net nic,model=?
qemu-kvm -net nic,model-virtio
Host中的GSO,TSO
关掉可能会提升性能:
ethtool -K $IF gso off
ethtool -K $IF tso off
ethtool -k $IF
vhost-net:用于取代工作于用户空间的qemu中为virtio-net实现的后端驱动以实现性能提升的驱动;
-net tap[,vnet_hdr=on|off][,vhost=on|off]
qemu-kvm -net tap,vnet_hdr-on,vhost=on
virtio-blk:
其依赖于GuestOS中的恭外运,及Qemu中的后端驱动
-drive file=/path/to/som_image_file,if=virtio
kvm_clock:半虚拟化的时钟
# grep -i "paravirt" /boot/config-2.6.32-504.e16.x86_64
CONFIG_PARAVIRT_GUEST=y
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_CLOCK=y
VM Migration:
static migration
live migration
整体迁移时间
服务器停机时间
对服务的性能的影响
在待迁入主机使用
# qemu-kvm -vnc :N -incoming tcp:0:7777
# vncviewer :590N
在源主机使用:
monitor接口:
migrate tcp:DEST_IP:DEST:PORT