前言
KVM即Kernel Virtual Machine,最初是由以色列公司Qumranet开发。2007年2月被导入Linux 2.6.20核心中,成为内核源代码的一部分。2008年9月4日,Redhat收购了Qumranet,至此Redhat拥有了自己的虚拟化解决方案,之后便舍弃Xen开始全面扶持KVM,从RHEL6开始KVM便被默认内置于内核中。本文介绍KVM虚拟化平台部署及管理。
KVM简介
KVM特点
KVM必须在具备Intel VT或AMD-V功能的x86平台上运行。KVM包含一个为处理器提供底层虚拟化,可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。使用一个经过修改的QEMU(qemu-kvm),作为虚拟机上层控制和界面。
由于KVM仅是一个简单的虚拟化模块,所以它的内存管理没有自我实现,需借助于Linux内核实现内存管理。KVM能够使用Linux所支持的任何存储,在驱动程序的实现上,直接借助于Linux内核来驱动任何硬件。在性能上KVM继承了Linux很好的性能和伸缩性,在虚拟化性能方面,已经达到非虚拟化原生环境95%左右的性能(官方数据)。KVM拓展性也非常好,客户机和宿主机都可以支持非常多的CPU数量和非常大的内存,可以过载使用CPU和内存,还可借助KSM技术实现对内存的过量使用,且保证性能依旧非常不错。
KVM架构
KVM的架构非常简单,就是内核的一个模块,用户空间通过qemu模拟硬件提供给虚拟机使用,一个虚拟机就是一个普通的Linux进程,通过对这个进程的管理,就可以完成对虚拟机的管理。
KVM平台部署
检测硬件
检测是否支持虚拟化:
# egrep --color ‘(vmx|svm)‘ /proc/cpuinfo #如果含有vmx或者svm字样,则表示硬件支持虚拟化,vmx代表Intel,svm代表AMD #装载模块 # modprobe kvm # modprobe kvm_intel # lsmod | grep kvm kvm_intel 54285 0 kvm 333172 1 kvm_intel
安装管理软件
KVM的原生管理软件qemu-kvm
# yum -y install qemu-kvm qemu-kvm-tools # ln -s /usr/libexec/qemu-kvm /usr/sbin/
qemu-kvm命令详解
qemu-kvm的标准选项:
qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等 -name name:设定虚拟机名称; -M machine:指定要模拟的主机类型,如Standard PC、ISA-only PC或Intel-Mac等 -m megs:设定虚拟机的RAM大小; -cpu model:设定CPU模型,如coreduo、qemu64等 -smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:设定模拟的SMP 架构中CPU的个数等、每个CPU的核心数及CPU的socket数目等;PC机上最多可以模拟255颗CPU;maxcpu s用于指定热插入的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和w ritethrough四个; 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
网络选项:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:创建一 个新的网卡设备并连接至vlan n中;macaddr用于为其指定MAC地址,name用于指定一个在监控时显示 的网上设备名称;emu可以模拟多个类型的网卡设备 -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.1 6-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-img管理磁盘映像:
qemu-img是qemu用来实现磁盘映像管理的工具组件,其有许多子命令,分别用于实现不同的管理功能,而每一个子命令也都有一系列不同的选项。其使用语法格式为“qemu-img subcommand [options]”,支持的子命令如下。 create:创建一个新的磁盘映像文件; check:检查磁盘映像文件中的错误; convert:转换磁盘映像的格式; info:显示指定磁盘映像的信息; snapshot:管理磁盘映像的快照; commit:提交磁盘映像的所有改变; rbase:基于某磁盘映像创建新的映像文件; resize:增大或缩减磁盘映像文件的大小;
案例(1):使用create子命令创建磁盘映像的命令格式为“create [-f fmt] [-o options] filename [size]”;
例如下面的命令创建了一个格式为qcow2的50G的磁盘映像文件。
# mkdir -pv /kvm/images/centos/ # qemu-img create -f qcow2 /kvm/images/centos/demos.img -o size=50G,preallocation="metadata" # ll -h /kvm/images/centos/demos.img -rw-r--r--. 1 root root 51G Dec 19 16:33 /kvm/images/centos/demos.img #-f:指定虚拟磁盘文件格式 -o:指定选项
案例(2):配置桥设备,方便客户端虚拟主机与外界通信准备--安装网桥工具,创建桥接网卡:
# yum -y install bridge-utils # brctl addbr br0 # cd /etc/sysconfig/network-scripts # cp ifcfg-eth0 ifcfg-br0 # cat ifcfg-br0 ifcfg-eth0 DEVICE=br0 BOOTPROTO=none IPV6INIT=no ONBOOT=yes TYPE=Bridge IPADDR=172.16.100.104 NETMASK=255.255.0.0 DNS2=8.8.4.4 GATEWAY=172.16.0.2 DNS1=8.8.8.8 USERCTL=no DEVICE=eth0 BOOTPROTO=none BRIDGE=br0 IPV6INIT=no ONBOOT=yes TYPE=Ethernet USERCTL=no
重启网络设备生效配置:
# service network restart
案例(3):如果我们加入网卡设备,则需要使系统启动后桥接网络到br0上,我们通过脚本实现启动和停止系统时桥接网络和删除桥接的自动执行操作:
# cat /kvm/script/{qemu-ifdown,qemu-ifup} #!/bin/bash switch=br0 if [ -n "$1" ];then brctl delif $switch $1 ip link set $1 down exit 0 else echo "Error: No Interface." exit 1 fi #!/bin/bash switch=br0 if [ -n "$1" ]; then ip link set $1 up sleep 1 brctl addif $switch $1 exit 0 else echo "Error: No Interface." exit 1 fi # chmod +x /kvm/script/{qemu-ifdown,qemu-ifup}
案例(4):创建虚拟主机及虚拟主机系统安装
# yum -y install tigervnc tigervnc-server --使用VNC显示虚拟主机运行状态 # qemu-kvm -name "centos6.5" > -m 512 -smp 2 > -drive file=/kvm/images/centos/demos.img,media=disk,format=qcow2,if=virtio,index=0 > -net nic,model=virtio > -net tap,ifname=vnet0,script=/kvm/script/qemu-ifup,downscript=/kvm/script/qemu-ifdown > -boot order=dc,once=d VNC server running on `::1:5900‘ # vncviewer :5900 --如下图所示:
案例(5):验证网络设置脚本是否生效:
# ifconfig vnet0 vnet0 Link encap:Ethernet HWaddr AA:B6:2E:11:B5:53 inet6 addr: fe80::a8b6:2eff:fe11:b553/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
基于Libvirt实现虚拟机管理
因为对进程的管理非常麻烦,Redhat发布了一个开源项目Libvirt,Libvirt有API,也有一套命令行工具,可以完成对虚拟机的管理,大多数的管理平台都是通过Libvirt来完成对KVM虚拟机管理的,下面我们就来介绍一下基于Libvirt实现虚拟机管理
安装所需管理组件:
# yum -y install libvirt virt-manager virt-viewer python-virtinst # yum -y upgrade device-mapper-libs --升级依赖包处理无法启动
启动服务:
# service libvirtd start Starting libvirtd daemon: [ OK ] #使用libvirt创建网桥无需再手动修改配置文件,一条命令即可解决 # virsh iface-bridge eth0 br0
virt-instal-tools工具应用:
virt-install是一个命令行工具,它能够为KVM、Xen或其它支持libvrit API的hypervisor创建虚拟机并完成GuestOS安装;此外,它能够基于串行控制台、VNC或SDL支持文本或图形安装界面。 #一般选项:指定虚拟机的名称、内存大小、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:指定安装过程完成后的配置选项,如指定引导设备次序、使用指定的而非安装的ke rnel/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地址;省略此选项时将使用随机地址 --nonetworks:虚拟机不使用网络功能; #其它: --autostart:指定虚拟机是否在物理启动后自动启动; --print-xml:如果虚拟机不需要安装过程(--import、--boot),则显示生成的XML而不是创建此虚拟 机;默认情况下,此选项仍会创建磁盘映像; --force:禁止命令进入交互式模式,如果有需要回答yes或no选项,则自动回答为yes; --dry-run:执行创建虚拟机的整个过程,但不真正创建虚拟机、改变主机上的设备配置信息及将其创 建的需求通知给libvirt; -d, --debug:显示debug信息;
使用virt-install安装虚拟机:
# qemu-img create -f qcow2 /kvm/images/centos/centos.img -o size=120G,preallocation="metadata" # virt-install -n "centos6" --vcpus=2 -r 512 --disk path=/kvm/images/centos/centos.img,bus=virtio,size=50,sparse --network bridge=br0,model=virtio --force --pxe
virt-manager
virt-manager是一套用 python编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机,virt-manager就是利用libvirt的API实现的。
使用virt-manager安装虚拟机:
# virt-manager &
配置过程如下所示:
以上为虚拟化技术之KVM平台部署及简单应用所有内容。