KVM 實踐教程
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
KVM 實踐教程