KVMhtml
Kernel-based Virtual Machine,基於內核的虛擬機;linux
KVM是做爲內核模塊嵌入進Linux內核的,它不會像Xen那樣剝奪Kernel的CPU以及內存的管理權,因此Kernel尤爲鍾愛KVM;編程
KVM被做爲模塊加載進內核之後,內核儼然就搖身一變成爲了Hypervisor,其管理方式是將運來的用戶空間做爲控制檯,用其對KVM進行管理。包括建立、銷燬、保存、遷移、配置虛擬機;每一個新建立的額虛擬機做爲一個進程運行在用戶空間,其所擁有的虛擬CPU或虛擬內存則被抽象成爲線程,若是咱們想關閉一個虛擬機,則直接kill其對應的進行便可;當建立的虛擬機要執行某些特定(能夠理解成普通的主機中,在陷入內核模式時所執行的命令,好比執行寫操做的時候)的操做時,要經過內核中的KVM模塊才能被調度執行(虛擬機會調用本身的內核空間,而後這個虛擬機內核空間在向宿主機內核中的KVM模塊發起調用)。若是執行的另一些命令(好比作一個簡單的加法操做)不須要上面的特權指令的話,其所在的用戶空間就能夠將其直接交給CPU運行,不須要通過內核中的KVM模塊調度;centos
KVM極其依賴HVM(硬件輔助的虛擬化),也便是說:若是你電腦的CPU不支持VT(Intel-VT-x,AMD-V)技術的話,是沒法使用建立KVM虛擬機的,固然,如今的絕大多數CPU都已經支持VT功能了;緩存
KVM使用一個設備文件/dev/kvm做爲整個KVM的調用接口。/dev/kvm是一個字符設備,工做於Hypervisor(內核空間),在用戶空間可經過ioctl()系統調用來完成虛擬機的建立、啓動等管理功能(好比建立VM、爲VM分配內存、讀寫VCPU的寄存器、向VCPU注入中斷、運行VCPU等);也就是說,若是你編程能力好的話,徹底能夠經過調用這個文件來自行管理KVM,直接與內核中KVM交互;網絡
KVM虛擬化是創建在操做系統之上的,不像Xen是直接將Hypervisor創建在硬件上;當咱們建立一個KVM虛擬機以後,會在原來的操做系統之上又創建一個操做系統,這樣就會致使在運來的用戶空間有創建一個內核空間和用戶空間。爲了區分它們,咱們將給他們事先定義一下:架構
宿主機:直接運行在物理機器上的操做系統,也就是加載KVM模塊的操做系統;框架
Guest主機:經過KVM建立出來的虛擬機;其包含本身的Guest用戶空間和Guest內核空間;dom
內核模式:宿主機的內核空間; ssh
用戶模式:宿主機的用戶空間;通常用於表明Guest OS請求IO類操做;
KVM虛擬化的IO使用方式:
由於KVM只是一個模塊,因此它根本就沒有提供有關IO調用的方法,所以KVM藉助了QEMU,經過它來使用IO設備。
當KVM虛擬機的用戶空間要進行IO操做時,首先會將請求發送給本身的內核,而後Guest內核再向宿主機的用戶空間的QEMU程序發送請求,讓其爲本身進行進一步的操做,最後宿主機用戶空間的QEMU再對真正的內核進行請求,進而執行IO操做;
KVM的兩類組件:
/dev/kvm:上面已經提到了
qemu:工做於用戶空間主要用於實現模擬PC機的IO設備;
KVM的特性:
內存管理:
支持將分配給VM的內存交換至SWAP;
支持使用Huge Page(大內存頁)機制;
支持使用Intel EPT或AMD RVI技術完成內存地址映射;
支持KSM(Kernel Same-Page Merging);
將多個MV加載的相同的內存頁(好比相同的庫文件)合併成一個,從而減小內存的佔用;相似於共享內存功能;當某虛擬機要修改本身的內存頁時,會經過寫時複製爲其建立一個副本,供其修改;
硬件管理:
取決於該Linux內核;
存儲:
支持本地存儲
支持網絡附加存儲
支持存儲區域網絡
支持分佈式存儲:GlustFS
遷移:
跨物理主機遷移,可分爲熱遷移和冷遷移;
冷遷移:線下遷移,關機遷移,服務中斷;
熱遷移:線上遷移,服務不中斷,在虛擬機運行過程當中,將其內存中的數據複製(複製時虛擬機會暫停)一份到另外一臺物理主機上,且掛載其位於共享存儲中的磁盤映像文件,從而實現實時遷移,而後原先的虛擬機就能夠關掉了;
設備驅動:
支持IO設備的徹底虛擬化:模擬硬件
支持IO設備的半虛擬化:在Guest OS中安裝驅動,相似於front-end(Guest OS提供)|backed-end(Kernel提供)機制;
經常使用組件爲virtio,其支持塊設備(virtio-blk)的半虛擬化、網絡設備(virtio-net)的半虛擬化、PCI設備(virtio-pci)的半虛擬化、控制檯設備(virtio-console)的半虛擬化、內存空間動態擴展機制(virtio-ballon)的半虛擬化;
KVM的侷限性:
過載使用CPU時會致使性能降低,因此通常不建議虛擬CPU的數量(物理機上的全部VCPU數量)大於物理CPU的數量(此處的數量指的是核心數);
時鐘不精確,這幾乎時全部虛擬機的弊病,其依賴於時間同步機制(好比NTP);
MAC地址可能衝突(虛擬機數量特別多的時候才能遇到的問題);
KVM的工具棧:
QEMU組件:
主要提供了一下功能:
處理器模擬器,用於完成異構;
仿真IO設備;
管理模擬的設備至真實設備;
調試器
與模擬器交互的用戶接口;
工具:
qemu-io
qemu-img
qemu-kvm:專門用於管理KVM的工具;
libvirt工具棧:支持遠程管理,須要在被管理主機上運行libvirtd服務;
virsh、virt-install:字符命令行管理工具
virt-manager、virt-viewer:圖形化的管理工具
建立第一個KVM虛擬機:
開啓VMware的虛擬化引擎,讓VMware中的虛擬機支持HVM:
~]# grep -E "(vmx|svm)" /proc/cpuinfo 查看主機是否支持虛擬化
裝載KVM模塊:
~]# modprobe kvm
~]# modprobe kvm-intel 這兩個模塊通常都是自動裝載完畢的,只要加載了這兩個模塊,此時的Kernel儼然就成爲一個Hypervisor了;能夠查看一下在/dev目錄下是否有kvm文件;
安裝qemu-kvm工具:
~]# yum install qemu-kvm 默認安裝之後qemu-kvm命令是不在PATH路徑中的;
~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/ 爲qemu-kvm建立一個連接
格式:qemu-kvm [options] [disk_image]
Standard options:
-name:設置虛擬機的名稱;
-machine:指定要模擬的主機的類型;
-m:指定虛擬機的RAM大小;
-cpu:指定CPU類型;
能夠經過 ~]# qemu-kvm -cpu ? 查看支持的CPU類型;
-smp:設定虛擬的SMP架構中的CPU個數;
-numa:指定模擬多節點的numa設備;
這種模型會給每一個CPU分配器一段其專用的內存,而且它們還具備一塊共有內存;這樣能夠防止多CPU之間的內存佔用問題,而且能夠經過將某個進程綁定到某一CPU上,提升緩存命中率;
-boot options:用於定義設備的引導次序;
options:
order=:指定引導設備的介質類型,可用取值爲:floppy (a), hard disk (c), CD-ROM (d), network (n);默認爲c;
once=:指定某引導設備只是用一次,通常是安裝系統時只須要指定一次的介質;
例子:-boot order=dc,once=d 表示使用光驅和硬盤引導系統,第一次優先使用光驅引導;
Block device options:
-hda/-hdb file:use 'file' as IDE hard disk 0/1 image
-hdc/-hdd file:use 'file' as IDE hard disk 2/3 image
-cdrom file:use 'file' as IDE cdrom image
Note:-cdrom與-hdc不可同時使用;
-drive options:use 'file' as a drive image,用於取代上面的-hd#;
options:選項之間使用逗號隔開;
file=:指定磁盤映像文件的路徑;
if=:指定磁盤設備所鏈接的接口類型,即控制器類型;好比IDE、SCSI、SD、MTD、virtio等;
index=:設定同一種控制器類型中不一樣設備的索引號,即標識號;好比sda一、sda2;
media=:定義介質類型爲硬盤(disk)仍是光盤(cdrom);
snapshot=:指定當前硬盤設備是夠支持快照功能;
cache=:指定如何使用物理機硬盤緩存來訪問數據;可用取值:writethrough(通寫)|writeback(回寫)|none(不啓用)|directsync|unsafe;
format=:指定映像文件的格式,具體可參見qemu-img命令;
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug
Network options:
用於定義網絡設備接口類型以及其相關的各類屬性等信息;
-net nic[,options]:爲虛擬機配置網卡信息;
options:
vlan=:指定網卡屬於哪一個vlan中;
macaddr=:指定網卡的MAC地址;
model=:指定網卡類型;能夠經過~]# qemu-kvm -net nic,model=?來查看支持的類型;
name=:指定網卡名稱,通常用於monitor中;
addr=:指定網卡的IP地址,通常經過DHCP分配:
-net tap[options]:在宿主機內核上配置與虛擬機相對應的網卡(二層設備)信息;
options:
vlan=:指定網卡屬於哪一個vlan中;
ifname=:指定網卡名稱;
script=:使用指定的腳原本配置當前的網絡接口,默認爲:/etc/qemu-ifup,可是這個腳本默認是沒有的,須要本身寫,若是是測試的話能夠指定script=no;
downscript=:使用指定的腳本撤銷當前的網絡接口,默認爲:/etc/qemu-ifdown;
-net user[,options]:用於配置用戶空間的網絡功能的;
例子:~]# qemu-kvm -m 128 -cpu host -smp 2 -name "test" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic, macaddr=52:54:00:11:22:33 -net tap,ifname=vif0.0
Display options:
-sdl:跨平臺且開源的多媒體程序庫文件;
-spice:啓用spice遠程桌面協議;
-vnc display options:啓用vnc功能,指定qemu監聽在VNC的某一接口上;
display格式:
1.host:Num
這裏的Num是以5900爲基礎,一次遞增的;
例子:192.168.80.134:0,192.168.80.137:1,其中冒號後面的0|1表示桌面號;
2.unix:/path/to/socket_file 僅用於本機
3.none
options:
password:鏈接是須要驗證的密碼,在monitor接口上使用change設定密碼;
reverse:反向鏈接至某處於監聽狀態的vncview上;
-vga [std|cirrus|vmware|qxl|xenfb|none]:指定要仿真的VGA接口類型;
Debug/Expert options:
-monitor dev:表示在標準輸入輸出上顯示monitor界面;
例子:~]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-no_cloud-0.3.0-x86_64-disk.img -vnc 192.168.80.134:0 -monitor stdio
-nographic:直接在控制檯上啓動命令接口;
使用Ctrl + a --> c能夠在console和monitor之間切換;
下載共有映像文件:
這個映像文件就是一個裝好的操做系統,直接加載使用便可;我使用的是cirros-no_cloud-0.3.0-x86_64-disk.img;
安裝VNC組件:須要安裝桌面環境(yum groups install "GNOME Desktop"-->reboot)
~]# yum install tigervnc.x86_64
啓動虛擬機:
~]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-no_cloud-0.3.0-x86_64-disk.img
~]# vncviewer :5900 使用VNC連接虛擬機,此處的5900接口是虛擬機test所監聽的接口,若是有第二個虛擬機,則端口號會一次遞增爲5901;
Note:使用Ctrl + Alt + num能夠切換到其餘窗口
Note:上圖中-drive的順序尤其重要,若是有-boot選項的話,關於iso的drive要放在其後;
KVM-Virtio及管理工具
基礎框架:
Note:使用Virtio之後虛擬機中的驅動會顯示爲相應的Virtio設備(好比virtio_net、virtio_pci等);
virsh、virt-manager、virt-install、libvirtd、libvirt
其中libvirt是一個庫文件,能夠爲虛擬化管理提供各類接口;libvirtd是一個運行在各個支持虛擬化主機上的服務,支持遠程管理虛擬機,相似客戶端代理,能夠執行管理端發來的命令;virsh是基於libvirt的虛擬機命令行管理工具,virt-manager是基於libvirt的虛擬機圖形管理工具,virt-install是用於建立虛擬機的工具;通常virt-install會與virsh配合使用;
安裝及啓動服務:
~]# yum install libvirt-client virt-manager libvirt-daemon virt-install qemu-kvm
~]# systemctl start libvirtd.service
~]# virt-manager
圖形化界面,相似Vmware!
默認建立的虛擬機鏡像文件存儲位置:/var/lib/libvirt/images/
相關命令:
virsh:選項特別多;
~]# virsh help
~]# virsh help interface
~]# virsh help iface-bridge
根據XML文件建立:
create:建立並啓動虛擬機;
define:建立但不啓動虛擬機;
關閉domain:
destory:強制關閉虛擬機
shutdown:將虛擬機關機
reboot:重啓虛擬機
刪除虛擬機:
undefine:刪除虛擬機
鏈接至console:
console:鏈接虛擬機控制檯;
附加或拆除磁盤:
attach-disk:爲虛擬機附加一個磁盤;
detach-disk:拆除虛擬機上的磁盤;
附加或查出網卡接口:
attach-interface:爲虛擬機添加一個網卡接口;
detach-interface:拆除虛擬機上的網卡接口;
保存及恢復虛擬機狀態至磁盤文件:
save:保存虛擬機狀態至磁盤文件;
restore:恢復虛擬機狀態至磁盤文件;
virt-install:
格式:virt-install [options]
options:
General Options:
-n NAME:指定虛擬機名稱,全局惟一;
-r MEMORY:指定虛擬機的內存大小,默認單位爲MB;
--vcpus [maxcpus=n][,cpuset=][,sockets=n][,cores=n][,threads=n]:指定虛擬機中vcpu的數量;
經過~]# virt-install --vcpus help獲取更多參數信息
--cpu CPU Module:指定CPU的模式及特性
Installation Method Options:
-c CDROM,--cdrom=CDROM:使用光盤安裝;
-l LOCATION,--location=LOCATION:指定安裝源的URL,支持FTP、HTTP等;
--pxe:基於PXE安裝;
--livecd:把光盤當作LiveCD;
--os-type=DISTRO_TYPE:指定安裝的系統類型;好比linux、Windows等;
--os-variant=DISTRO_VARIANT:指定要安裝的操做系統的distribution;好比centos六、redhat7等;
-x EXTRA,--extra-args=EXTRA:根據--location指定的方式安裝Guest OS時,用於傳遞給內核額外選項;例如指定kickstart文件的位置,--extra-args "ks=http://192.168.80.128/Centos6_install.cfg"
--boot =BOOTOPTS:指定安裝過程完成後的配置選項,好比指定引導設備次序、使用指定的而非安裝的kernel/initrd來引導系統啓動;
例子:--boot cdrom,hd,network
--boot kernel=KERNEL,initrd=INITRD,kernel_args="console=/dev/ttyS0"
Device Options:
--disk=DISKOPTS:指定存儲設備及其屬性;
格式爲:--disk /some/storage/path,opt1=val1,opt2=val2;
經常使用選項:
device:設備類型,如cdrom、disk等,默認爲disk;
bus:磁盤總線類型,其值能夠爲ide、scsi、bus、virtio等;
perms:訪問權限,如rw、ro或sh(共享的可讀寫),默認爲rw;
size:新建磁盤映像的大小,單位爲GB;
cache:緩存模型,其值有none、writeback、writethrough;
format:磁盤映像格式,如raw、qcow二、vmdk等;
sparse:指定磁盤映像使用稀疏格式,即不當即分配指定大小的空間;
--nodisks:不使用本地磁盤,在LiveCD模式中經常使用;
-w NETWORK,--network=NETWORK:將虛擬機連入宿主機的網絡中;
格式:--network=NETWORK,opt1=val1,opt2=val2
options:
bridge=BRIDGE:鏈接至名爲"BRIDGE"的橋設備;
network=NAME:鏈接至名爲"NAME"的網絡;
model:指定Guest OS中看到的網絡設備型號,如e1000、virtio等;
mac:指定固定的MAC地址;不指定則使用隨機地址,可是對KVM來講前三段固定爲52:54:00;
--nonetworks:虛擬機不使用網絡模型;
--graphics TYPE,opt1=val1,opt2=val2:指定圖形顯示相關的配置,此選項不會配置任何顯示硬件,而是指虛擬機啓動後對其進行訪問的接口;
TYPE:指定顯示類型,好比VNC、sdl、spice或nooe等,默認爲VNC;
port:當TYPE爲VNC或spice時,爲其指定的監聽端口;
listen:當TYPE爲VNC或spice時,爲其指定的監聽地址;默認爲127.0.0.1,能夠通過/etc/libvirt/qemu.conf進行修改;
--serial=CHAROPTS:附加一個串行設備到當前虛擬機;
--serial pty:建立僞終端;
--serial dev,path=HOSTPATH:附加主機設備至此虛擬機;
Virtualization Platform Options:
-v,--hvm:當虛擬機同時支持使用半虛擬化和徹底虛擬化時,指定使用徹底虛擬化;
-p,--paravirt:指定使用半虛擬化;
--virt-type:指定使用的Hypervisor類型,好比kvm、xen、qemu等;
Miscellaneous Options:
--print-xml:不建立虛擬機,僅打印XML配置文件的內容;
--force:禁止進入交互模式,須要回答yes或no的默認回答爲yes
--dry-run:dry-run模式;
例子:~]# virt-install --name centos6.1 --virt-type kvm --ram 512 --graphics vnc --cdrom /root/CentOS-6.10-x86_64-bin-DVD1.iso --disk path=/images/kvm/centos6.img,size=20
關於Virtio的不錯的文章:http://www.javashuo.com/article/p-rybncnll-eb.html
根據馬哥視頻作的學習筆記,若有錯誤歡迎指正;侵刪