虚拟化四、KVM虚拟化技术
一、KVM概述
1、KVM
Kernel-based Virtual Machine 基于内核的虚拟机
以色列Qumranet公司研发,是内核的一个模块
2006年研发,2008被RedHat收购了
依赖于HVM技术:Intel VT-X,AMD AMD-V
2、KVM模块载入后的系统运行模式
内核模式:GuestOS执行I/O类操作,或其它的特殊指令的操作
用户模式:代表GuestOS代为请求I/O类操作,
来宾(guest)模式:GuestOS的非I/O类操作,事实上,它被称作虚拟机的用户模式
3、KVM的组件
两类组件:
/dev/kvm:工作于hypervisor,在用户空间可通过ioctl()系统调用来完成VM创建,启动等管理功能,它是一个字符设备,
功能:创建VM,为VM分配内存,读写VCPU的寄存器,向CPU注入中断,运行VCPU等
qemu进程:工作于用户空间,主要用于实现模拟PC机的I/O设备
4、KVM特性
1)内存管理
将分配给VM的内存交换至SWAP
支持使用Huge Page(大内存页);
支持使用Intel EPT或AMD RVI技术完成内存地址映射:GVA-->GPA-->HPA简化为GVA-->HPA
支持KSM (Kernel Same-page Merging)
这个内核特性实现了内存页面共享。KSM通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,KSM会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同GuestOS的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此,KSM技术可以降低内存占用进而提高整体性能。
2)硬件支持
取决于Linux内核;
3)存储:
本地存储:
网络附加存储:
存储区域网络:
分布式存储:例如GlustFS
4)实时迁移:
支持的GuestOS:
Linux, Windows, OpenBSD, FreeBSD, OpenSolaris;
5)设备驱动:
IO设备的完全虚拟化:模拟硬件
IO设备的半虚拟化:在GuestOS中安装驱动;virtio
virtio-blk, virtio-net, virtio-pci, virtio-console, virtio-ballon
5、KVM局限性
一般局限性:
CPU overcommit
时间记录难以精确,依赖于时间同步机制
MAC地址:
VM量特别大时,存在冲突的可能性;
实时迁移:
性能局限性:
6、KVM的工具栈介绍
分为2大类:
qemu:
qemu-kvm
qemu-img
libvirt
GUI: virt-manager, virt-viewer
CLI: virt-install, virsh
QEMU主要提供了以下几个部分:
处理器模拟器
仿真IO设备
关联模拟的设备至真实设备;
调试器
与模拟器交互的用户接口
补充资料:
VMM:对IO的驱动有三种模式:
自主VMM:VMM自行提供驱动和控制台;
混合VMM:借助于OS提供驱动;
依赖于外部OS实现特权域
自我提供特权域
寄宿式VMM:
二、KVM安装
1、安装kvm
1) 确保CPU支持HVM
# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo
2) 装载模块
[root@BAIYU_180 ~]# lsmodModule Size Used byppdev 8537 0 vmware_balloon 7199 0 parport_pc 22690 0 parport 36209 2 ppdev,parport_pcmicrocode 112685 0 snd_ens1371 21587 0 snd_rawmidi 23017 1 snd_ens1371
# modprobe kvm
# modprobe kvm-intel
[root@BAIYU_173 kvm]# lsmodModule Size Used bynls_utf8 1455 1 ipv6 335589 142 vhost_net 29185 0 macvtap 10551 1 vhost_netmacvlan 10324 1 macvtaptun 16934 1 vhost_netkvm_intel 55624 0 kvm 341551 1 kvm_intelppdev 8217 0 parport_pc 22658 0 parport 36209 2 ppdev,parport_pc
3) 验正:
/dev/kvm
三、kvm管理工具栈使用
# yum grouplist | grep -i "virtualization" #查看和虚拟化相关的所有包组 Virtualization: qemu-kvm Virtualization Client: python-virtinst, virt-manager, virt-viewer Virtualization Platform: libvirt, libvirt-client Virtualization Tools #可以不用 libguestfs
1、使用qemu-kvm管理工具
基于libvirt的工具如virt-manager和virt-install提供了非常便捷的虚拟机管理接口,但它们事实上上经二次开发后又封装了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能够完成此前的任务。
在RHEL6上,qemu-kvm位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,这样也阻止了可以直接使用qemu作为创建并管理虚拟机。如若想使用qemu虚拟机,可以通过将/usr/libexec/qemu-kvm链接为/usr/bin/qemu实现。
1) 安装 qemu-kvm
#yum install qemu-kvm
# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
[root@BAIYU_173 ~]# yum install qemu-kvmDependencies Resolved======================================================================================================== Package Arch Version Repository Size========================================================================================================Installing: qemu-kvm x86_64 2:0.12.1.2-2.491.el6_8.1 updates 1.6 MInstalling for dependencies: celt051 x86_64 0.5.1.3-0.el6 base 50 k glusterfs x86_64 3.7.5-19.el6 base 392 k glusterfs-api x86_64 3.7.5-19.el6 base 56 k glusterfs-client-xlators x86_64 3.7.5-19.el6 base 942 k glusterfs-libs x86_64 3.7.5-19.el6 base 303 k gpxe-roms-qemu noarch 0.9.7-6.15.el6 base 220 k qemu-img x86_64 2:0.12.1.2-2.491.el6_8.1 updates 837 k seabios x86_64 0.6.1.2-30.el6 base 93 k sgabios-bin noarch 0-0.3.20110621svn.el6 base 6.6 k spice-server x86_64 0.12.4-13.el6.1 updates 346 k usbredir x86_64 0.5.1-3.el6 base 41 k vgabios noarch 0.6b-3.7.el6 base 42 kTransaction Summary========================================================================================================Install 13 Package(s)[root@BAIYU_173 ~]# rpm -ql qemu-kvm/etc/ksmtuned.conf/etc/modprobe.d/blacklist-kvm.conf/etc/rc.d/init.d/ksm/etc/rc.d/init.d/ksmtuned/etc/sasl2/qemu-kvm.conf/etc/sysconfig/ksm/etc/sysconfig/modules/kvm.modules/etc/udev/rules.d/80-kvm.rules/usr/libexec/qemu-kvm/usr/sbin/ksmtuned/usr/share/doc/qemu-kvm-0.12.1.2/COPYING
2)qemu-kvm的使用
qemu-kvm命令使用格式为:
"qemu-kvm [options] [disk_p_w_picpath]"
其选项非常多,不过,大致可分为如下几类。
命令选项:
标准选项:
显示选项:
i386平台专用选项
字符设备选项
蓝牙设备选项
Linux启动专用选项
调试/专家模式选项
cirros project:为cloud环境测试vm提供的微缩版Linux的磁盘映像文件
官网下载地址:http://download.cirros-cloud.net/
创建并启动虚拟机:
qemu-kvm -m 128 -smp 2 -name test -hda /p_w_picpaths/kvm/cirros-0.3.4-i386.disk.img
用-drive指定磁盘映像文件:
qemu-kvm -m 128 -name test -smp 2 -drive file=/p_w_picpaths/kvm/cirros-0.3.4-i386-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2
[root@BAIYU_173 ~]# cd /p_w_picpaths/kvm/[root@BAIYU_173 kvm]# lscirros-0.3.4-x86_64-disk.img[root@BAIYU_173 kvm]# qemu-kvm -m 128 -smp 2 -name test -hda /p_w_picpaths/kvm/cirros-0.3.4-x86_64-disk.img VNC server running on `::1:5900' #这里启动了VNC server可以查看到:[root@BAIYU_173 ~]# netstat -nlptu|grep 5900tcp 0 0 ::1:5900 :::* LISTEN 3191/qemu-kvm [root@BAIYU_173 ~]# ps aux|grep qemu-kvmroot 3191 15.0 8.1 492796 82944 pts/3 Sl+ 22:39 0:14 qemu-kvm -m 128 -smp 2 -name test -hda /p_w_picpaths/kvm/cirros-0.3.4-x86_64-disk.imgroot 3242 0.0 0.0 103324 860 pts/0 S+ 22:41 0:00 grep qemu-kvm[root@BAIYU_73 ~]# yum install tigervnc #安装vnc客户端[root@BAIYU_173 ~]# rpm -ql tigervnc/usr/bin/vncviewer/usr/share/applications/vncviewer.desktop/usr/share/doc/tigervnc-1.1.0[root@BAIYU_173 ~]# vncviewer localhost #连上看看
按ctrl+alt+2可以跳转到控制页面,可以查看虚拟机的信息,再按ctrl+alt+1可以跳转回来
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等;
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
我们用-drive选项来重新创建虚拟机:
[root@BAIYU_173 kvm]# qemu-img info cirros-0.3.4-x86_64-disk.img #查看磁盘映像文件的格式p_w_picpath: cirros-0.3.4-x86_64-disk.imgfile format: qcow2virtual size: 39M (41126400 bytes)disk size: 14Mcluster_size: 65536
通过cdrom启动win7的安装
qemu-kvm -name winxp -smp 4,sockets=1,cores=2,threads=2 -m 512 -drive file=/p_w_picpaths/kvm/winxp.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom
(1)准备磁盘映像文件
[root@BAIYU_173 ~]# qemu-img create -f qcow2 -o size=60G /p_w_picpaths/kvm/win7.imgFormatting '/p_w_picpaths/kvm/win7.img', fmt=qcow2 size=64424509440 encryption=off cluster_size=65536
(2)上传win7的安装文件
(3)创建并启动win7
[root@BAIYU_173 kvm]# qemu-kvm -name win7 -smp 2 -m 1024 -drive file=/p_w_picpaths/kvm/win7.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso,media=cdrom -boot order=dc,once=d
qemu-kvm的显示选项:
显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
◇ -nographic:默认情况下,qemu使用SDL来显示VGA输出;而此选项用于禁止图形接口,此时,
qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台
此时可以使用的命令:
C-a h print this helpC-a x exit emulatorC-a s save disk data back to file (if -snapshot)C-a t toggle console timestampsC-a b send break (magic sysrq)C-a c switch between console and monitorC-a C-a sends C-a
SDL: Simple DirectMedia Layer:简单直接介质层 C语言开发,跨平台且开源多媒体程序库文件;
在qemu中使用"-sdl"即可; #centos默认不支持
VNC: Virtual Network Computing:虚拟网络计算 使用RFB(Remote FrameBuffer远程帧缓冲)协议远程控制另外的主机;
CentOS 6.6启用vnc
(1) yum install tigervnc-server
(2) vncpasswd
(3) vncserver :N #启动某一桌面
qemu-kvm
-vnc display(地址+某个桌面),option,option
示例:-vnc :N[,password]
启动qemu-kvm时,额外使用-monitor stdio选项,并使用
QEMU模式下使用change vnc password命令设置密码;
qemu-kvm的 网络属性相关选项
网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。
这里只介绍nic、tap和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。
◇ -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)来配置当前网络接口,ifname用于指定网卡名称,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本;
如果创建虚拟机时没有指定-net选项也会默认创建一个-net user类型的网卡
◇ -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-ifup和qemu-ifdown脚本:
# cat /etc/qemu-ifup #!/bin/bash#bridge=br0 #bro要事先创建好if [ -n "$1" ]; thenip link set $1 upsleep 1brctl addif $bridge $1[ $? -eq 0 ] && exit 0 || exit 1elseecho "Error: no interface specified." #执行时后面接网卡接口exit 1fi
# cat /etc/qemu-ifdown #!/bin/bash#bridge=br0if [ -n "$1" ];thenbrctl delif $bridge $1ip link set $1 downexit 0else echo "Error: no interface specified." #执行时后面接网卡接口exit 1fi
指定使用桥接网络接口:
qemu-kvm -m 128 -name test -smp 2 -drive file=/p_w_picpaths/kvm/cirros-0.3.4-i386-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic -net tap,script=/etc/if-up,downscript=no -nographic
四、总结一下这篇博文的内容
1、kvm组成部分:
/dev/kvm
qemu
2、安装KVM需要装载的模块:
modprobe kvm
modprobe kvm-intel|kvm-amd
3、KVM工具栈:
qemu-kvm, /usr/libexec
libvirt:
GUI: virt-manager
CLI: virt-install, virsh
qemu-kvm
-name 'NAME'
-m megs
-cpu ?
-smp n[,sockets=N][,cores=N][,threads=N][,maxcpus=N]
-hda|-hdb|-hdc|-hdd
-cdrom
-drive
file=, media=, if=, cache=, format=, index=, readonly #只读方式打开,后面不用接参数
-boot [order=drives][,once=drives][,menu=on|off]
-sdl
-vnc :0,password
-nographic
-monitor stdio # 不打开窗口, 在本地显示监视器的画面,
-usbdevice tablet #解决虚拟机中鼠标不同步问题