KVM虛擬化基礎

什麼是KVM?

KVM是開源軟件,全稱是Kernel-Based Virtual Machine(基於內核級虛擬機)技術; 
是一種用於Linux內核中的虛擬化基礎設施,可以將Linux內核轉化爲一個hypervisor;
KVM在07年2月被導入Linux 2.6.20核心中,以可加載核心模塊的方式被移植到FreeBSD及illumos上; 
KVM在具備Intel VT或AMD-V功能的x86平臺上運行。它也被移植到S/390,PowerPC與IA-64平臺上。在Linux內核3.9版中,加入ARM架構的支持; 
KVM目前由Red Hat等廠商開發,對CentOS/Fedora/RHEL等Red Hat系發行版支持極佳; (摘自wikipedia)

什麼又是”虛擬化”?

在計算機技術中,虛擬化(技術)或虛擬技術(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源(CPU、內存、磁盤空間、網絡適配器等),予以抽象、轉換後呈現出來並可供分區、組合爲一個或多個電腦配置環境。由此打破實體結構間的不可切割的障礙,使用戶可以比原本的配置更好的方式來應用這些電腦硬件資源(其實就是虛擬整個PC硬件)。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理配置所限制。一般所指的虛擬化資源包括計算能力和數據存儲。(摘自wikipedia)

“Hypervisor”和主機虛擬化

Hypervisor: 
Hypervisor又稱虛擬機器監視器(英語:virtual machine monitor,縮寫爲 VMM)是用來建立與執行虛擬機器的部分電腦軟件,固件或是硬件。被Hypervisor用來執行一個或多個虛擬機器的電腦被稱爲主體機器(host machine),這些虛擬機器,則稱爲客體機器(guest machine)。hypervisor可以用一個客體操作系統(guest operating systems)的外貌出現,提供虛擬的作業平臺,負責管理其他客體操作系統的運作。在它之上運作的多個操作系統,共同分享了虛擬化之後的硬件資源。(摘自wikipedia) 
可以簡單理解Hypervisor爲超級管理員:這種超級管理分別運行在不同虛擬機上其功能是不一樣的; 
Hypervisor功能是創建,管理,加載,分配,虛擬出物理機器的有效硬件資源給虛擬客戶機使用; 

主機虛擬化: 
常用的兩類虛擬化技術 
1型虛擬化:在硬件上跑的不是宿主機(直接跑的是虛擬化軟件,需驅動底層硬件)所創建每個主機都是虛擬機; 
特點: 
    需要硬件支持 
    虛擬機監視器作爲主操作系統 
    運行效率高 
2型虛擬化:在硬件安裝操作系統(操作系統安裝虛擬軟件vmware,virtualbox); 
特點: 
    虛擬機監視器作爲應用程序運行在主操作系統環境內 
    運行效率一般較類型I低

完全虛擬化與半虛擬化

完全虛擬化:用軟件輔助並運行在物理機上,由軟件發起指令,內核捕獲;

半虛擬化:Guest_OS明確知道自己運行在虛擬機上,向物理機發起特權指令調用;

CPU虛擬化一般分兩種:(模擬,虛擬)

模擬與虛擬在於,虛擬(性能)比模擬(需靠軟件轉換)好;

CPU虛擬化

CPU虛擬化需要本身對硬件所支持,需修改內核; 
x86 操作系統是直接運行於裸硬件設備,因此它自認爲完全佔有計算機硬件,而處理及訪問應用程序和硬件設備是x86處理器底層四個特權級別來實現(環0,1,2,3); 
環0:運行特權指令,只有操作系統纔能有權限(內核); 
環1-2:由於歷史原因未使用; 
環3:放的是一些非特權指令,可進程使用(一但調用就會觸發CPU異常,CPU軟中斷指令); 
現有基於x86處理器的操作系統,多數UNIX、Linux以及Windows系列大都只用了環0和環3兩個特權級別;

沒有對比就沒有差異—>(Xen、KVM)

Xen:
hypervisor(超級管理員),直接運行在硬件上,只驅動CPU內存,各種IO不驅動;
裝完後趕緊提供一個虛擬機(與xen一體),改內核重啓立即創建虛擬機把原宿主機改成了虛擬機,以後就不啓動宿主機直接啓動Xen;
虛擬機命名:dom(原宿主機叫dom0管理其它虛擬機,I/O由它來驅動);
kvm:
悄悄並腐蝕了寄生在內核宿主機之上的hypervisor,kvm是模塊如果要使用直接裝載就可以;
如果裝載了kvm模塊內核立即變爲殭屍並變成了hypervisor,用戶空間變爲了其中一臺虛擬機的管理控制檯,完全寄生不驅動任何驅動管理程序;
可虛擬CPU,內存,不能虛擬出來I/O設備,模擬I/O 需藉助外部組件qemu;
qemu:存軟件實現的模擬器,性能不好。可虛擬CPU,內存,I/O,大小1M左右;
qemu的加速器:qemu-accelerator(從模擬器變成虛擬機,需與架構一致);
組織方式:
	qemu去模擬I/O,需安裝在控制檯處dom0;
	kvm去虛擬化CPU,內存;

KVM的安裝和有關知識

安裝前提: 
1、實現環境:CentOS7.2_x86_64 
2、KVM依賴於HVM機制(interl是VT-X,AMD是amd-v); 
3、查看系統是否支持虛擬化,確保內核編譯提供了kvm模塊; 
~]# egrep 'vmx|svm' /proc/cpuinfo 
4、KVM主要運行在x86機器上(核心模塊:kvm) 
5、驗證檢測kvm模塊被正確裝載 
~]# modprobe kvm 
~]# lsmod |grep kvm 
~]# ls -l /dev | grep kvm 

kvm模塊載入後系統的運行模式:
 
內核模式:形象描述爲,GuestOS執行I/O類操作或其它特殊指令操作,稱爲‘來賓-內核-模式’; 
用戶模式:形象描述爲,代表GuestOS請求I/O類操作; 
來賓模式:形象描述爲,GuestOS的非I/O模式,即‘來賓-用戶-模式’; 
        內核形象描述爲,kvm hypervisor 


kvm的組件:
 
/dev/kvm: 
工作於hypervisor在用戶空間可通過loctl()系統調用來完成vm的管理工作,且是一個字符設備; 
功能:創建vm,爲vm分配內存,讀寫vcpu的寄存器向vcpu注入中斷運行vcpu等; 
qemu進程:工作於用戶空間,主要用於實現模擬vm的I/O設備; 


kvm的特性:

內存管理、存儲、等……

內存管理:
	將分配給vm的內存交換至swap;
	支持使用huge page;
	支持使用intel_EPT或amd_RVI技術完成內在地址映射;
	GVA-->GPA-->HPA,GVA--HPA
	支持KSM(kernel same-page merging)
硬件支持:
	取決於Linux內核
存儲支持:
	本地存儲
	網絡附加存儲
	存儲區域網絡
	分佈式存儲(GlusterFS)
支持實時遷移:
	live migration(需使用共享存儲)
支持的GuestOS:
	Linux,Windows,OpenBSD,FreeBSD,OpenSolaris
設備驅動:
	IO設備的完全虛擬化,實現模擬硬件
	IO設備的半虛擬化,實現virtio
virtio-blk,net,pci,console,balion(氣球膨脹擴展內存)

kvm的管理工具: 
qemu: 
    quem-kvm 
    qemu-img 
libvirt: 
kvm hypervsior:libvirtd 
管理接口: 
    GUI:virt-manager,virt-viewer 
    CLI:virt-install,virsh
 

安裝管理工具:
 
~]# yum install -y libvirt (大量依賴程序包,安裝前配置好yum環境) 
~]# systemctl start libvirtd.service (啓動libvirt守護進程) 
~]# ifconfig (查看虛擬的virbr0-橋設備,提供nat類型網絡) 
wKiom1iywvmS7Sj1AABNEyrybJM318.jpg
安裝啓動虛擬機: 
~]# yum install virt-manager virt-viewer virt-install 
virt工具包的安裝 
~]# yum install qemu-kvm 
圖形測試連接 
~]# virt-manager
如果系統是最小化安裝的,記得安裝此包(xorg-x11-xauth ,不然在使用ssh連接主機時圖形無法支持;

wKiom1iywOWSvOzlAAA-k5TW3hQ848.jpg           圖形化安裝 

查看守護進程文件類型: 
~]# rpm -ql libvirtd-daemon 
配置文件 
/etc/libvirt/libvirtd.conf 
Unite file 
/usr/lib/systemd/system/libvirtd.service 
相關術語: 
    node:物理服務器 
    hypervisor:支持虛擬機運行的環境 
    domain:虛擬機 
    dom0:prilileged,特權域 
    domU:非特權域 
hypervisor的訪問路徑:

本地及遠程URL

本地URL:
driver[+transport]:///[PATH][?extra-param]
	driver:驅動名稱,例如qemu,xen,lxc;
	transport:傳輸方式
	kvm使用qemu驅動,格式qemu:///system
遠程URL:
driver[+transport]:///[user@][host][:port]/[PATH][?extra-param]
示例:
	qemu:///172.16.5.40/system
	qemu+ssh://[email protected]/system

創建網橋: 
與物理網絡連接直接通信,需創建網橋把物理網卡當’橋’來使用 
手動配置方法 
~]# cd /etc/sysconfig/network-scripts/ 
~]# vim ifcfg-eno16777736 (當’橋’用) 
    刪除IP地址 
    增加BRIDGE=’br0’ 
~]# cp ifcfg-eno16777736 if-br0 
~]# vim if-br0 
    DEVICE=br0 
    TYPE=Bridge 
name去掉,重啓就ok 
使用virsh命令配置方法 
注意:如果使用橋接接口,不能啓用NetworkManager服務 
~]# virsh help iface-bridge 
~]# virsh iface-list 
~]# virsh iface-bridge eno16777736 br0 –no-stp 

創建虛擬機: 
此安裝方法略過…特別容易,記得選擇橋接接口就可以,安裝方式pxe等;

wKioL1iywojCkLI-AABsx7h747U057.jpg

virsh的常用命令

virsh help:獲取幫助

virsh keyword
	list:列出域
示例:
	~]# virsh vcpuinfo rhel6.6 (列出虛擬CPU信息)
	~]# virsh dumpxml rhel6.6 >/tmp/mytemplate.xml
	(基於已有虛擬機導出配置文件實現批量虛擬機實例)
	crate:創建並啓動域;
	define:創建域;
	domid:獲取域ID;
	domuuid:獲取域的uuid;
	dominfo:域信息;
	reboot:重啓域;
	destory:關閉域;
	shutdown:關閉域;
	undfine:刪除域;
	save:保存狀態至文件中;
	restore:從保存文件中恢復域狀態;
	pause:暫停域;
	resume:恢復暫停的域;

管理’域’資源的命令:

virsh help setmem: 
setmem:更改域的內存大小(不可超出最大值) 
    ~]# virsh setmem rhel6.6 768m –current 
setmaxmem:設定內存最大值; 
setvcpus:修改CPU數量; 
    ~]# virsh setvcpus rhel6.6 1 –current 
    ~]# virsh help vcpupin 可以綁定在哪些CPU上 
vcpuinfo:獲取域的vcpu信息; 
    ~]# virsh vcpuinfo rhel6.6 
domblkstart:顯示域塊設備相關信息; 
    ~]# virsh domblkstart rhel6.6 
domiflist:顯示域的接口列表 
    ~]# virsh domiflist rhel6.6 
    ~]# virsh domifstat rhel6.6 vnet0 
ifacelist:獲取物理設備網絡信息 
    ~]# virsh iface-list 

動態增刪disk: 
    qemu-img create 
    virsh attach-disk 
    virsh detach-disk 
動態增刪interface 
    virsh attach-interface 
    type:bridge 
    source:某橋的名稱 
    virsh detach-interface –mac MAC

附加磁盤設備,必須常見磁盤設備 
包管理工具:yum install -y qemu-img 
示例:qem-img create -f qcow2 -o ? /tmp/test.qcow2 
    ~]# qem-img create -f qcow2 -o preallocation=metadata /tmp/test.qcow2 250G 支持稀疏格式 
    ~]# ls lh /tmp/test.qcow2(顯示原始大小) 
    ~]# qem-img resize /tmp/test.qcow2 調整空間大小 
把映像文件附加到虛擬機上 
    ~]# virsh help attach-disk 幫助 
    ~]# virsh attach-disk rhel6.6 /tmp/test.img vdb 附加 
    ~]# virsh domblklist rhel6.6 查看附加的 
    ~]# fdisk -l 查看磁盤 
拆出磁盤 
    ~]# virsh help detach-disk 
    ~]# virsh detach-disk rhel6.6 vdb 

附加網絡接口,必須創建網絡接口 
ip link add無用功,不需要手動添加會幫我們自動添加 
    ~]# ip link help 
    ~]# ip link add name veth1.0 type veth peer veth1.1 創建一對網卡,一半1.0一半1.1 
    ~]# ip link show 

向虛擬機動態添加網卡 
    ~]# brctl show (橋控制命令) 
    ~]# ip link add veth1.0 type veth peer name veth1.1 
    ~]# ip link show 

向橋添加接口 
    ~]# brctl addif virbr0 veth1.0 
    ~]# brctl show 

把另一個接口添加到虛擬機上 
    ~]# virsh help attach-interface 
    ~]# virsh dumpxml rhel6.6 
    ~]# virsh attach-interface rhel6.6 bridge virbr0 
    ~]# virsh domiflist rhel6.6 
    ~]# ifconfig -a 

拆出網絡接口 
    ~]# virsh help detach-interface 
    ~]# virsh detach-interface rhel6.6 bridge –mac 52:54:00:4e:ca:4e 
    ~]# virsh domiflist rhel6.6 
    ~]# brctl show

使用qemu-kvm手動創建虛擬機

注意:qemu跟virsh沒有關係,不是virsh家族的,所以用virsh看不到運行中的虛擬機; 

包管理工具 

~]# yum install -y qemu-kvm
~]# rpm -ql qemu-kvm
~]# ln -sv /usr/libexec/qemu-kvm /usr/bin
~]# qemu-kvm -h 幫助
~]# qemu-kvm -machine help 指定要模擬的主機類型
~]# qemu-kvm -cpu ? 支持的CPU類型

創建虛擬機

~]# mkdir /vms/images/test -pv
~]# cp cirros-0.3.0-x86_64-disk.img /vms/images/test/test-0.qcow2 
~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/images/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net none,-nographic
~]# sudo su - 切換管理員賬號
~]# help 獲取命令幫助
~]# Ctrl+a+c 切換監控界面			

啓用vnc功能在本機連接並支持圖形窗口界面接口

~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/images/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net none,-vnc:1
~]# yum install -y tigervnc
~]# vncviewer:1

使用添加-net支持網絡功能以便加入到某個橋上,並快速激活此接口

    激活接口可使用腳本,僅適用於物理橋;

~]# vim /etc/qemu-ifup
bridge=br0
if [-n "$1"];then
    ip link set $1 up
    sleep 1
brctl addif $bridge $1
    else
    echo "error.no interface specified."
    exit 1
fi
在粘貼到vi編輯器內把刪除以行首開頭的空白行
全文搜索刪除行首空白行:(:%s/*[[:space:]]*//g)

~]# brctl show

~]# vim /etc/qemu-ifdown
bridge=br0
if [-n "$1"];then
    ip link set $1 down
    sleep 1
brctl addif $bridge $1
    else
    echo "error.no interface specified."
    exit 0
fi

啓動虛擬機測試

~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/images/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net nic,model=virtio,macaddr=52:54:00:00:01,-net tap,ifname=veth1 -vnc:1
~]# vncviewer :1
~]# sudo su -
~]# ifconfig -a

創建兩個網橋接口,讓兩臺虛擬機相互通信(僅主機通信)

包工具:

~]# yum install bridge-utils

~]# which brctl

~]# rpm -qf /usr/sbin/brctl

~]# brctl 獲取幫助

~]# brctl addbr mybr0 添加橋後非活動

~]# ip link set mybr0 up

啓動兩臺虛擬機,並橋接到mybr0網卡上

~]# cp /etc/qemu-ifup-mybr0
    bridge=mybr0 
~]# cp /etc/qemu-ifdown-mybr0
    bridge=mybr0 
~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/images/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net nic,model=virtio,macaddr=52:54:00:00:01,-net tap,ifname=veth1,script=/etc/qemu-ifup-mybr0,downscript=/etc/qemu-ifup-mybr0,-vnc:1 -daemonize
~]# mkdir /vms/images/test1/
~]# cp ./cirros-0.3.0-x86_64-disk.img /vms/images/test1/test-1.qcow2
~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/images/test1/test-1.qcow2,media=disk,if=virtio,format=qcow2,-net nic,model=virtio,macaddr=52:54:00:00:02,-net tap,ifname=veth2,script=/etc/qemu-ifup-mybr0,downscript=/etc/qemu-ifup-mybr0,-vnc:1 -daemonize
~]# brctl show (確保兩個都被橋到物理橋上)

啓動兩臺虛擬機並配置網卡地址

~]# vncviewer :1

~]# ifconfig eth0 10.1.0.50/16 up

~]# vncviewer :2

~]# ifconfig eth0 10.1.0.60/16 up

~]# ping兩臺機器

啓動兩臺虛擬機並配置網卡地址後與物理機通信

~]# ifconfig mybr0 10.1.0.254/16 up

~]# 去ping各虛擬機和物理機

讓兩臺虛擬機實現(nat通信)

~]# route add default gw 10.1.0.254 在vnc1上添加路由

~]# cat /proc/sys/net/ipv4/ip_forward 在物理機上開網卡間轉發功能

~]# tcpdump -i eno16777736 -nn -icmp 抓包看下

~]# 這時物理機能ping出去,但是從vncping的包進不來

~]# 此時在物理機器上加入源地址轉發策略

~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -j SNAT --to-source 172.16.5.40

~]# 再次在物理機上發出ping請求,這時包就可以到達物理機上了

讓兩臺虛擬機實現與外部網卡地址通信

在物理機上br0上加入子接口

~]# ifconfig br0:0 172.16.5.70/16

~]# iptables -t nat -vnL --line-numbers

~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -j SNAT --to-source 172.16.5.70

~]# iptables -t nat -A PREROUTING -d 172.16.5.70 -j DNAT --to-destination 10.1.0.50

~]# ping 172.16.5.70 在vnc1上發出ping請求

~]# tcpdump -i mybr0 -nn -icmp 在物理機上抓包

使用網絡名稱地址空間虛擬路由器

~]# ip netns add route1
~]# ip netns list
~]# ip netns exec route1 tcpdump -i eth0 -nn -icmp
~]# ip netns exec route1 bash 打開虛擬路由環境route1的bash窗口 
~]# exit 退出此虛擬環境

done......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章