kvm简介
Linux Kernel-based Virtual Machine (KVM) 是一款开源的虚拟化软件,是完全虚拟化的一种实现,KVM的虚拟化需要有硬件的支持,且其只能运行于64位系统上。其实KVM仅是内核的一个模块,宿主机的内核加载了kvm的模块后就可以使用工具创建虚拟机,该模块在Linux2.6.20之后就集成在Linux的的各个主要发行版中。
kvm的相关模块:
[root@node1 ~]# lsmod | grep kvm kvm_intel 54285 0 kvm 333172 1 kvm_intel
kvm的架构图:
其实kvm模块仅负责CPU与内存的虚拟化管理,其自身不会虚拟I/O设备,需要借助于qemu来实现管理用户空间和模拟I/O等相关功能。只是qemu是通过完全模拟的形式来创建I/O设备,性能低下,为了提高性能,I/O设备尽量使用半虚拟化设备virtio,virtio驱动在2.6.25之后直接整合进了Linux内核,部署的虚拟机能够直接驱动对应设备。
在部署虚拟机之前首先需要检查当前的服务器硬件是否支持硬件虚拟化技术,查看输出的cpu信息中flags这一项里是否有vmx(Intel的cpu),amd的cpu为svm。如果没有这一项,就表示cpu不支持硬件虚拟化,kvm则不能使用。
[root@node1 ~]# grep --color=auto -Ei "vmx|svm" /proc/cpuinfo
使用qemu-kvm部署虚拟机
安装对应的软件包。
[root@node1 ~]# yum install -y qemu-kvm qemu-kvm-tools
在RHEL6上,qemu-kvm命令位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,通过创建一个/usr/bin/目录下的链接来解决该问题。
[root@node1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm `/usr/bin/qemu-kvm' -> `/usr/libexec/qemu-kvm'
配置网桥
桥设备不支持使用NetworkManager来管理,使用network来管理。简单起见,可以安装桥设备管理程序包brctl-utils,通过命令来完成创建。正真桥功能的实现是内核中的某一模块,所以不使用brctl-utils的功能,手动配置的方式也可以实现。
[root@node1 ~]# service NetworkManager stop [root@node1 ~]# chkconfig NetworkManager off
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none IPADDR=192.168.1.106 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 STP=on DNS1=61.153.81.74 DNS1=202.96.104.27 USERCTL=no #防止网络环路
eth0设备当做交换机使用:
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none BRIDGE=br0 USERCTL=no
配置完成后,重启网卡。
[root@node1 ~]# service network restart [root@node1 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c293331f2 yes eth0
在启动虚拟机时,使用script=file指定脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)在虚拟机关闭时撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本。
编辑/etc/qemu-ifup:
vim /etc/qemu-ifup #!/bin/bash # switch=br0 if [ -n "$1" ]; then ip link set $1 up sleep 0.5s brctl addif $switch $1 exit 0 else echo "Error:no specifed Interface." exit 1 fi
该脚本中的$1(第一个参数)为ifname指定的tap设备,配置完成后为脚本添加执行权限:
[root@node1 ~]# chmod u+x /etc/qemu-ifup
创建磁盘镜像文件
[root@node1 ~]# qemu-img create -f qcow2 -o size=30G /vm/img/centOS_1.qcow2 Formatting '/vm/img/centOS_1.qcow2', fmt=qcow2 size=32212254720 encryption=off cluster_size=65536
安装系统
这里使用pxe的方式安装操作系统,最常见的方式是在虚拟机启动时直接导入镜像文件。
[root@node1 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2 -boot order=nc -net nic,m odel=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no VNC server running on `::1:5900'
-boot order=nc #指定引导次序,先通过网络方式引导,然后是磁盘。
这里使用的磁盘接口是virtio(通过半虚拟化的方式实现),virtio的磁盘设备在虚拟机中体现的文件为“vda”,需要将ks文件中的sda设备改为vda。以上命令的各个选项可以通过man文档查看。
虚拟机启动之后,图形信息默认输出至VNC会话,该服务监听在本地的5900端口,也可以通过-vnc选项动态指定。
使用vncviewer查看:
[root@node1 ~]# vncviewer :5900
启动安装过程,
在使用vncviewer查看之前,需要使宿主机支持显示图形界面:
[root@node1 ~]# yum groupinstall "X Window System" [root@node1 ~]# yum groupinstall Desktop [root@node1 ~]# yum install tigervnc-server [root@node1 ~]# yum install tigervnc
图形界面的显示比较占用带宽,可以在启动虚拟机时指定-nographic选项,在当前命令行中直接输出虚拟机的字符界面。这需要在虚拟机上的/etc/grub.conf文件中添加内核参数“console=ttyS0“,貌似在创建虚拟机时无法直接向内核注入参数,使用virt-install创建时就可以。
使用qemu进行实时迁移
实验环境:
192.168.1.106 -->192.168.1.127
在192.168.1.127上配置好环境(例如网桥,磁盘镜像...),迁移过程只是迁移内存中的数据,如果迁移过程中,虚拟机实例内存的改变量超出了网络带宽的传输能力,这个迁移将无法完成。
将192.168.1.106上将磁盘镜像文件同步至192.168.1.127,当然最好是使用共享存储:
[root@node1 ~]# scp /vm/img/centOS_1.qcow2 192.168.1.127:/vm/img/
同步虚拟机启动时创建网络设备的脚本文件:
[root@node1 ~]# scp /etc/qemu-ifup 192.168.1.127:/etc/
在192.168.1.106上启动虚拟机,并为虚拟机配置好网络。
[root@node1 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback -boot ord er=cn -net nic,model=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no -nographic
在192.168.1.127上使用同样的镜像文件启动虚拟机,启动时使用-incoming选项,实例不会启动而是等待来自其他主机的迁移请求。
[root@node3 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback -boot ord er=cn -net nic,model=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no -incoming tcp:0:5678 VNC server running on `::1:5900'
进入monitor端查看虚拟机状态(用vnc打开图形界面后,使用Ctrl+Alt+2进入monitor端,Ctrl+Alt+1切换回文本行界面):
在192.168.1.106上开始迁移过程:
(qemu) info status VM status: running (qemu) migrate tcp:192.168.1.127:5678 (qemu) info status VM status: paused (post-migrate)
在192.168.1.127上查看虚拟机状态,可以看到虚拟机相对于迁移之前已经处于运行状态。
在迁移过程中,对被迁移的虚拟机发起ping请求,仅其中一个响应时间较长。
使用libvirt部署虚拟机
libvirt这套工具是对qemu工具的二次封装,具有更好的用户体验,且适用于管理不同架构上的虚拟化技术,也支持远程连接,libvirt具有更强大的功能且更通用。
使用libvirt需要安装的包,并需要启动libvirtd服务。
[root@node1 ~]# yum install -y libvirt virt-manager virt-viewer python-virtinst [root@node1 ~]# service libvirtd start Starting libvirtd daemon: [ OK ]
创建桥设备:
[root@node1 ~]# virsh iface-bridge eth0 br0 Created bridge br0 with attached device eth0 Bridge interface br0 started [root@node1 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c293331f2 yes eth0 virbr0 8000.52540046a8b2 yes virbr0-nic
创建磁盘镜像文件:
[root@node1 ~]# qemu-img create -f qcow2 -o size=30G /vm/img/centOS_1.qcow2 Formatting '/vm/img/centOS_1.qcow2', fmt=qcow2 size=32212254720 encryption=off cluster_size=65536
使用virt-install启动虚拟机,并安装操作系统。
[root@node1 ~]# virt-install --connect qemu:///system --virt-type kvm --name centOS6.5_1 --vcpus 1 --ram 1024 --disk path=/vm/img/centOS_1.qcow2,size=30,bus=virtio,sparse,forma t=qcow2 --network bridge=br0,model=virtio --location r/centos-6.5-x86_64/ --extra-args "ks=http://192.168.3.10/cobbler/ks.cfg console=ttyS0 seri al" --force --noautoconsole --nographics
--location #指定安装源
--extra-args #指定额外的参数,ks指定安装过程所用的ks文件,console=ttyS0为注入的内核参数。
这个与qemu-kvm创建的虚拟机类似,默认虚拟机的显示类型为vnc,且监听在本地的5900端口,若在创建虚拟机时,指定--nographics,虚拟机的显示通过文本界面输出。这时需要为虚拟机的内核添加参数console=ttyS0,最好是在创建虚拟机时指定(--extra-args "kconsole=ttyS0")。然后在宿主机上可以通过“virsh console domainName”进入虚拟机的终端。使用”Ctrl+]“退出虚拟机的终端。如下图:
若已经存在镜像文件,创建虚拟机时直接导入:
[root@node1 ~]# virt-install --connect qemu:///system --virt-type kvm --name centOS6.5_1 --vcpus 1 --ram 1024 --disk path=/vm/img/centOS_1.qcow2,size=30,bus=virtio,sparse,forma t=qcow2 --network bridge=br0,model=virtio --import --force --noautoconsole
虚拟机创建完成后,其配置信息保存在/etc/libvirt/qemu目录中,文件名与虚拟机相同,格式为XML。所以虚拟机在创建时指定的名称(--name)必须唯一。
对于已经创建好的虚拟机可通过virsh命令来管理,简单介绍几个常用的子命令:
查看本机上的所有已启动的虚拟机:
[root@node1 ~]# virsh list Id Name State ---------------------------------------------------- 2 centOS6.5_1 running
启动关闭某个虚拟机:
[root@node1 ~]# virsh start centOS6.5_1 [root@node1 ~]# virsh shutdown centOS6.5_1
删除一个虚拟机:
[root@node1 ~]# virsh undefine centOS6.5_1
导出虚拟机的配置信息;根据定义好的配置信息创建虚拟机(不启动)
[root@node1 ~]# virsh dumpxml centOS6.5_1 > /tmp/centOS6.5_2.xml [root@node1 ~]# virsh define /tmp/centOS6.5_2.xml
关于更具体说明查看“virsh help”.................^_^