一、引言
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