一、引言

       1.1 什么是虚拟化

              虚拟化是一个描述运行软件的广义计算机术语,通常体现为在单一系统上运行多个操作系统,这些操作系统同时运行,而每个操作系统又是相互独立的。大多数现行的虚拟化实现使用一个“虚拟机管理程序”(hypervisor),即一个软件层或子系统,该子系统控制硬件并向“客户机操作系统”提供访问底层硬件的途径。通过向客户操作系统提供虚拟化的硬件虚拟机管理程序允许多种操作系统在形同的物理系统中运行,该虚拟机管理系统成为“客机”guest,虚拟化操作系统有多种方式:

             

       1.2 虚拟化方式

              全虚拟化:全虚拟化利用处理器的硬件特性,向客机提供底层实现系统的总抽象。这创建了新的虚拟系统,被称为虚拟机(virtual machine),它允许客机操作系统在五需修改的情况下运行。客机操作系统和任何在客机虚拟机器中的应用并不会察觉出虚拟化环境并正常运行。硬件支持虚拟化这项技术,用于实现在Linux的KVM的全面虚拟化。

              半虚拟化:半虚拟化应用一系列呈现给虚拟机的软件和数据结构,需要客机中的软件修改以使用半虚拟环境。半虚拟包括整个内核,就像Xen准虚拟机,或者虚拟化I/O设备的驱动程序一样。

              软件虚拟化:软件虚拟化利用更慢的二进制转换和其他仿真技术运行未更改的操作系统

      

二、KVM详细介绍

       2.1 Kvm详细介绍

              KVM(Kernel-based Virtual Machine),是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源代码很少。KVM目前已成为学术界的主流VMM之一。KVM的虚拟化需要硬件支持(如inter VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期是基于软件模拟的ParaVirtualization,新版则是基于硬件支持的完全虚拟化。

              它包含一个为处理器提供提供底层虚拟化、可加载的核心模块kvm.ko(kvm-inter.ko 或 kvm-amd.ko),使用QEMU(QEMU-KVM)作为虚拟机上层控制工具。

              KVM技术已经从最初的概念发展为企业IT基础设施管理系统。可以从kvm clinet管理软件这样的单一界面直接访问位于多个远程位置的服务器和设备。

              使用KVM可允许多个包括Linux和Windows每个虚拟机有私有的硬件,包括网卡磁盘以及图形适配卡等。

             

       2.2 KVM架构介绍

              KVM是基于虚拟化扩展(inter VT 或者 AMD-V)的x86硬件的开源的Linux原生的全虚拟化解决方案。KVM中,虚拟机被实现为常规的Linux的进程,由标准Linux调度程序进行调度;虚拟机的每个虚拟CPU被实现为一个常规的Linux进程。这使得KVM能够使用Linux内核的已用功能。

              但是,KVM本身不执行任何硬件模拟,需要客户空间程序通过/dev/kvm接口设置一个客户机虚拟机服务器地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是QEMU。主要有以下特点:

                     使用KVM时,客机作为一个Linux的进程在主机上运行。

                     虚拟CPU(vCPU)作为正常线程执行,由Linux调度器执行

                     客机会继续诸如内核中的NUMA和大页面一类的功能

                     主机中的磁盘和网络I/O设置对性能有显著影响

                     网络流量通常基于软件的桥传送

                    

       2.3 QEMU介绍

              QEMU是什么

                     QEMU是一个开源项目,实际是一台硬件模拟器,可以模拟许多硬件,各种架构的CPU、网卡、显卡、声卡等,还可以存储还原虚拟机的运行状态。还内建了DHCP、DNS、TFTP服务器。QEMU就是一个纯软件模拟器,可以在所支持的平台模拟支持的设备。

       2.4 Livvirt介绍

              为什么需要Libvirt

                     qemu-kvm的命令行虚拟机管理工具参数众多,难于使用。Libvirt提供统一、稳定、开放的源代码应用程序接口(API)、守护进程(libvirtd)和一个默认命令行管理工具(virsh)。

              Libvirt能做什么

                     Libvirt设计的目的通过相同的方式管理不同的虚拟化引擎,如KVM、Xen、HyperV、Vmware ESX等

              Libvirt可以实现对虚拟机的管理:如虚拟机的创建、启动、关闭、暂停、恢复、迁移、销毁,以及虚拟机网卡、硬盘、cpu、内存等多种设备的热添加

              Libvirt还支持远程的宿主机管理:

                     存储资源池管理:支持本地文件系统目录、裸设备、lvm、nfs、iscsi等方式。在虚拟机磁盘格式上qcow2、vmdk、raw等格式。

                     网络资源管理:支持linux桥、VLAN、多网卡绑定管理,新版本还支持Openvswitch。Libvirt还支持nat和路由访问方式的网络,Libvirt可以通过防火墙让虚拟机通过宿主机建立网络通道,和外部网络进行通信。

                    

       2.5 QEMU、KVM、Libvirt关系

              QEMU是一个模拟器,它向客户机模拟CPU等硬件,客户机认为自己和硬件直接打交到,其实是同QEMU模拟出来的硬件打交到,QEMU将这些指令转义给真正的硬件,由于所有指令都要从QEMU里面经过,所以性能比较差。

              KVM是内核的模块,采用Inter-VT/AMD-V硬件辅助虚拟化技术,使用KVM,客户机的CPU指令不用经过QEMU转义直接运行,大大提高了速度。

              Libvirt是一个daemon进程,可以被本地的virsh调用,也可以被远程virsh调用libvirtd调用qemu-kvm对虚拟机进行操作。

             

三、KVM环境的快速安装部署

       3.1 检查依赖

              KVM需要CPU有硬件虚拟化的支持,可以通过下面的命令查询是否支持

                     grep -E '(vmx|svm)' /proc/cpuinfo

                    

       2.2 查看Linux系统KVM模块是否加载到内核中

              lsmod |grep kvm

             

       3.3 环境软件包安装

              通过命令安装qemu和virt-manager等软件包

                     yum -y install libvirt-client libvirt-daemon libvirt-daemon-driver-nodedev libvirt-daemon-driver-interface libvirt-python libvirt daemon-driver-secret libvirt-daemon-driver-nwfilter libvirt-daemon-config-nwfilter libvirt-daemon-driver-storage libvirt-daemon-driver-network libvirt-daemon-driver-qemu libvirt-daemon-kvm libvirt-daemon-config-network libvirt-daemon-driver-lxc libvirt virt-install virt-top virt-v2v virt-what virt-who

              软件包说明:

                     qemu-kvm:qemu模拟器

                     qemu-img:qemu磁盘管理器

                     virt-manager:kvm管理工具

                     virt-install:用来创建虚拟机命令行工具

                     libvirt:提供libvirtd daemon来管理虚拟机和控制hypervisor

                     libvirt-client:提供客户端API用来访问server和提供管理虚拟机命令行工具的virsh实体

                     virt-viewer:图形控制台

                     bridge-utils:网桥管理工具

                    

       3.4 启动libvirt服务并设置开机启动

              systemctl restart libvirtd

              systemctl enable libvirtd

              启动libvirt失败

                     libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference

              yum install upgrade device-mapper-libs

             

四、命令行管理虚拟机

       4.1 磁盘管理

              创建磁盘

                     qemu-img create -f qcow2 /data/img/centos6.7.qcow2 40G

                     qemu-img 主要用来创建guest所需的磁盘

                            create #表示创建

                            -f qcow2 #表示创建格式为qcow2的磁盘

                            centos6.7qcows2  #表示创建磁盘的名称

                            40G  #表示该磁盘可用大小

              查看磁盘信息

                     qemu-img info /data/img/centos6.7.qcow2

              磁盘镜像文件进行检查,查找镜像文件中的错误

                     qemu-img check -f centos6.7.qcow2

                            -f 指定文件格式

                                   qcow2:目前使用最广泛的格式

                                   qed(QEMU enhanced disk):增强磁盘文件格式

                                   vdi(Virtual Disk Image):VirtualBox虚拟机中存储格式

                                   raw:a plain file

                                   dmg:Mac disk image format

                                   iso:CDROM disk image format

                                   qcow:qemu v1 disk image format

                                   qcow2:qemu v2 disk image format

                                   vmdk:vmware disk image format

                                   vpc:virtualPC disk image format

              磁盘转换

                     qemu-img convert -p -f raw -O qcow2 centos6.7.raw centos6.7.qcow2

                     -O  #输出镜像格式

                     -p  #显示转换进度

              QEMU镜像快照

                     Raw格式不支持快照,快照使用qemu-img的参数snapshot管理

                     快照创建使用 -c参数和快照的名字,例如创建名为S1的快照,使用如下命令。

                     qemu-img  snapshot  test.qcow2  -c  s1

                     快照查看,使用 -l参数。

                     qemu-img  snapshot  test.qcow2  -l

                     删除快照,使用 -d参数

                     qemu-img  snapshot test.qcow2  -d  s1

                     还原快照,使用 -a参数

                     qemu-img  snapshot  test1.qcow2  -a s1

                     {快照单独提取镜像,可以使用convert参数进行转换}

                     qemu-img   convert  -f  qcow2  -O qcow2   -s  s1  test.qcow2   test1-s1.qcow2

              ####QEMU镜像大小修改######

              qemu-img命令的resize参数用于修改镜像大小,但是这种方式只能修改镜像大小,不能修改文件系统,如果要修改镜像大小同时修改文件系统,需要使用guestfish套件的virt-resize命令

              修改test1.qcow2镜像的大小,使用命令查看镜像目前的大小。 

              qemu-img  info test.qcow2 

              镜像大小增加5G,使用参数 +5G

              qemu-img   resize   test.qcow2 +5G

              也可以直接指定镜像修改后的大小

              qemu-img resize test1.qcow2  15G

              qcow2镜像不支持缩小,raw镜像支持。使用qemu-img resize 命令缩小镜像

              qemu-img  resize test 10G

      

       4.2 通过命令行创建虚拟机

              使用virt-install 创建虚拟机

                     http://www.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm

                    

                     virt-install --name win2008 --ram 4096 --vcpus 2 --accelerate --hvm --network network=default,model=virtio --os-type windows --os-variant win2k8 --disk path= /home/2008.qcow2,format=qcow2,device=disk,bus=virtio --disk path=/home/2008.iso,device=cdrom --cdrom /home/virtio-win-0.1.118.iso --graphics vnc,listen=0.0.0.0,port=5901 --video cirrus  --boot cdrom  --noautoconsole

                    

                     virt-install --name=centos6.7 --ram=1024 --vcpus 1 --cdrom=/home/centos6.7.iso --os-type=linux --os-variant=rhel6 --network bridge=br-wan --graphics=spice --disk path=/data/centos6.7.qcow2,size=40

      

                     virt-install --name centos6.7-1 --ram 1024 --vcpus=2 --location=/data/Centos-6.7-x86_64-bin-DVD1.iso --disk path=/var/lib/libvirt/images/centos6.7-1.qcow2,size=10,format=qcow2 --network bridge=br0 --os-type=linux --os-variant-rhel6 --extra-args='centos=ttyS0' --froce

                    

                      virt-install -n "wlan-ping"  --description "centos7" --ram "1024"  --memory 1024--vcpus "2",cpuset=2-23  --cpu host-model --accelerate --hvm --network bridge:br-wan,virtualport_type=openvswitch,model=virtio --disk /data/system,bus=virtio,cache=writeback,driver_type=qcow2 --boot hd,cdrom --graphics vnc,listen=0.0.0.0 --noautoconsole --input tablet,bus=usb --cdrom /data/iso/centos6.iso

                    

                     virt-install -n debian --description debian --ram 2048 --vcpus 2 --cpu host-model --accelerate --hvm --disk /data/instance/debian/system,bus=virtio,cache=writeback,driver_type=raw,size=40 --boot hd,cdrom --graphics vnc,listen=0.0.0.0  --noautoconsole --input tablet,bus=usb --serial file,path=/data/instance/debian//console.log

                    

                     virsh uri

                            qemu:///system

                     virsh help connect

                     --connect qemu:///system #连接到一个hypervisor

                     -n --name= 客户端虚拟机名称

                     -r --ram= 客户端虚拟机分配的内存,单位M

                     -u --uuid= 客户端UUID 默认不写时,系统会自动生成

                     --vcpus= 客户端的vcpu个数

                     -v --hvm 全虚拟化

                     -p --paravirt 半虚拟化

                     -l --location=localdir 安装源,有本地、nfs、http、ftp几种,多用于ks网络安装

                     --vnc 使用vnc ,另有--vnclient=监听的IP  --vncport =VNC监听的端口

                     -c --cdrom= 光驱 安装途径

                     --disk= 使用不同选项作为磁盘使用安装介质

                     --disk path=/opt/centos-6.7-1.qcow2,size=10,format=qcow2客户端磁盘位置及格式

                     -w NETWORK, --network=NETWORK 连接客户机到主机网络

                     --network bridge=br0客户端网卡配置,使用桥接方式br0

                     -s --file-size= 使用磁盘映像的大小 单位为GB

                     -f --file= 作为磁盘映像使用的文件

                     --cpuset=设置哪个物理CPU能够被虚拟机使用

                     --os-type=OS_TYPE 针对一类操作系统优化虚拟机配置(例如:‘linux’,‘windows’)

                     --os-variant=OS_VARIANT 针对特定操作系统变体(例如’rhel6’, ’winxp’,'win2k3')进一步优化虚拟机配置

                     --os-type=linux表示系统为linux;os-variant=rhel6表示系统类型为rhel6

                     --host-device=HOSTDEV 附加一个物理主机设备到客户机。HOSTDEV是随着libvirt使用的一个节点设备名(具体设备如’virsh nodedev-list’的显示的结果)

                     --accelerate KVM或KQEMU内核加速,这个选项是推荐最好加上。如果KVM和KQEMU都支持,KVM加速器优先使用。

                     -x EXTRA, --extra-args=EXTRA 当执行从"--location"选项指定位置的客户机安装时,附加内核命令行参数到安装程序

                     --nographics "virt-install" 将默认使用--vnc选项,使用nographics指定没有控制台被分配给客户机

                     --extra-args=‘console=ttyS0’表示使用console ttyS0进行管理guest-force

             

       4.3 常用命令

              virsh list  #查看创建的虚拟机

              virsh list --all  #查看当前主机的所有虚拟机

              virsh start centos6.7  #开启虚拟机

              virsh shutdown centos6.7  #停止虚拟机

              virsh reboot centos6.7  #重新启动虚拟机

              virsh suspend centos6.7  #暂停虚拟机

              virsh resume centos6.7  #恢复虚拟机

              virsh destroy centos6.7  #强制关闭虚拟机

              virsh dominfo centos6.7  #查看虚拟机的运行信息

              virsh dumpxml centos6.7  #查看虚拟机的配置文件

              virsh edit centos6.7  #修改虚拟机的配置文件

              virsh dumpxml centos6.7 >/tmp/centos.xml  #虚拟机配置文件备份

              virsh undefine centos6.7  #取消注册虚拟机(不会删除虚拟机所使用的相关磁盘)

              virsh define /tmp/ceont6.7.xml  #注册虚拟机

              virsh domdisplay centos6.7  #查看虚拟机的VNC端口

              virsh vncdisplay centos6.7  #查看虚拟机的VNC端口

              virsh domiflist centos6.7  #查看虚拟网卡信息

              virsh link | grep vnet10  #查询网卡状态

              ip link show centos6.7  #查看虚拟机网卡状态

              ip link set vnet10 up  #联网

              ip link set vnet10 duwn  #断网

              ip link set br0KrWYFcGGvTMY up

              virsh vcpucount centos6.7  #查看cpu信息

              virsh dumuuid centos6.7  #查看UUID

              virsh dommemstat centos6.7  #查看内存

              virsh domblklist centos6.7  #查看虚拟机的硬盘

              ovs-ofctl dump-flows vr-wan | grep ip  #查看流表

              virsh domiftune instance_name vnet5  #查看带宽限制情况

             

              ovs-dpctl show   #查看vm对应的端口

             

              --config 下次重启生效      --live 在线生效     --current 只在当前生效

 

              删除添加网卡

                     virsh detach-interface instance_name --type bridge --mac 00.00.00.00.00.00 --live --config

                     virsh attach-interface instance_name --type bridge --mac 00.00.00.00.00.00 --source br0instance-name --model virtio --live --config

              网卡限速

                     virsh domiftune centos6.7 mac --inbound 800 --outbons 800 --live --config

              解除网卡限速

                     virsh domiftune centos6.7 mac --inbound 0 --outbons 800 --live --config

              添加光驱

                     virsh attach-disk centos6.7 /data/iso/centos6.7.iso hda --type cdrom --mode readonly --config

              更换镜像

                     virsh change-media win2008 hda /home/virtio-win.iso --update

              弹出光盘

                     virsh change-media win2008 hda  --eject

              删除光驱

                     virsh detach-disk centos6.7 hda --config

              添加硬盘

                     virsh attach-disk instanc_name /data/instance/vdb.qcow2 vdb --driver qemu --subdriver qcow2 --config

              设置iops限制

                     virsh blkdeviotune centos6.7 vda --read-iops-sec 300 --write-iops-sec 500 --live --config

              取消ipos限制

                     virsh blkdeviotune centos6.7 vda --read-iops-sec 0 --write-iops-sec 0 --live --config

              创建快照

                     virsh snapshot-create-as centos6.7 snapshot1 --disk-only --atomic

              查看快照

                     virsh snapshot-list centos6.7

                     virsh snapshot-list centos6.7 --tree

              恢复快照

                     virsh blockpull --domain centos6.7 --path /vms/centos6.7.snapshot1

             

              抓包分析网络问题

                     tcpdump -i 交换机端口

                     指定源地址

                     tcpdump -i eth1 src host 10.10.10.10

                     指定目标地址

                     tcpdump -i eth1 dst host 10.10.10.10

              宿主机重启后需要重启的服务

                     nohup python /opt/CloudKvmApi/index.py &

                     nohup python /opt/script/monitor/guest_client.py &

                     nohup python /opt/scripy/path &

              生成md5值

                     echo -n 10.10.10.10 | md5sum | cut -c 1-12

                    

                    

○ virsh-v2v

qemu-img create -q -f qcow2 -b 'json: { "file.cookie": "vmware_soap_session=\"52a15ed0-4d6f-f420-0578-3c0c6f1fbb23\"", "file.sslverify": "off", "file.driver": "https", "file.url": "https://10.136.1.117/folder/z-%e8%bd%ackmv%e2%80%94%e2%80%94test/z-%e8%bd%ackmv%e2%80%94%e2%80%94test-flat.vmdk?dcPath=ha-datacenter&dsName=DS%5f101361117", "file.timeout": 2000 }' -o 'compat=1.1,backing_fmt=raw' /var/tmp/v2vovl7e3275.qcow2

qemu-img: /var/tmp/v2vovl7e3275.qcow2: CURL: Error opening file: Server does not support 'range' (byte ranges).

virt-v2v: error: qemu-img command failed, see earlier errors