KVM介紹 虛擬化簡史
KVM介紹
為什麽需要CPU虛擬化
X86 操作系統是設計在直接運行在裸硬件設備上的,因此它們自動認為它們完全占有計算機
硬件。x86 架構提供四個特權級別給操作系統和應用程序來訪問硬件。 Ring 是指 CPU 的
運行級別,Ring 0是高級別,Ring1次之,Ring2更次之…… 就 Linux+x86 來說, 操
作系統(內核)需要直接訪問硬件和內存,因此它的代碼需要運行在高運行級別 Ring0
上,這樣它可以使用特權指令,控制中斷、修改頁表、訪問設備等等。
應用程序的代碼運行在低運行級別上ring3上,不能做受控操作。如果要做,比如要訪問
磁盤,寫文件,那就要通過執行系統調用(函數),執行系統調用的時候,CPU的運行級別
會發生從ring3到ring0的切換,並跳轉到系統調用對應的內核代碼位置執行,這樣內核就為
你完成了設備訪問,完成之後再從ring0返回ring3。這個過程也稱作用戶態和內核態的切
換。
那麽,虛擬化在這裏就遇到了一個難題,因為宿主操作系統是工作在 ring0 的,客戶
操作系統就不能也在 ring0了,但是它不知道這一點,以前執行什麽指令,現在還是執行什
麽指令,但是沒有執行權限是會出錯的。所以這時候虛擬機管理程序(VMM)需要避免這件
事情發生。 虛機怎麽通過VMM實現 Guest CPU 對硬件的訪問,根據其原理不同有三種實現
技術:
1. 全虛擬化
2. 半虛擬化
3. 硬件輔助的虛擬化
基於二進制翻譯的全虛擬化(Full Virtualization with Binary Translation)
客戶操作系統運行在 Ring 1,它在執行特權指令時,會觸發異常(CPU的機制,沒權
限的指令會觸發異常),然後 VMM 捕獲這個異常,在異常裏面做翻譯,模擬,後返回到
客戶操作系統內,客戶操作系統認為自己的特權指令工作正常,繼續運行。但是這個性能損
耗,就非常的大,簡單的一條指令,執行完了事,現在卻要通過復雜的異常處理過程。
異常 “捕獲(trap)-翻譯(handle)-模擬(emulate)” 過程:
超虛擬化 (或者半虛擬化/操作系統輔助虛擬化)
半虛擬化的思想就是,修改操作系統內核,替換掉不能虛擬化的指令,通過超級調
用(hypercall)直接和底層的虛擬化層hypervisor來通訊,hypervisor 同時也提供了超
級調用接口來滿足其他關鍵內核操作,比如內存管理、中斷和時間保持。
這種做法省去了全虛擬化中的捕獲和模擬,大大提高了效率。所以像XEN這種半虛擬
化技術,客戶機操作系統都是有一個專門的定制內核版本,和x86、mips、arm這些內核版本
等價。這樣以來,就不會有捕獲異常、翻譯、模擬的過程了,性能損耗非常低。這就是XEN
這種半虛擬化架構的優勢。這也是為什麽XEN只支持虛擬化Linux,無法虛擬化windows原
因,微軟不改代碼。
硬件輔助的全虛擬化
2005年後,CPU廠商Intel 和 AMD 開始支持虛擬化了。 Intel 引入了 Intel-VT
(Virtualization Technology)技術。 這種 CPU有 VMX root operation 和 VMX non
root operation兩種模式,兩種模式都支持Ring 0 ~ Ring 3 共 4個運行級別。這樣,VMM
可以運行在 VMX root operation模式下,客戶OS運行在VMX non-root operation模式下。
而且兩種操作模式可以互相轉換。運行在 VMX root operation 模式下的 VMM 通過
顯式調用 VMLAUNCH 或 VMRESUME 指令切換到VMX non-root operation模式,硬件自動加載
Guest OS 的上下文,於是Guest OS獲得運行,這種轉換稱為VM entry。Guest OS 運行過程
中遇到需要 VMM 處理的事件,例如外部中斷或缺頁異常,或者主動調用 VMCALL 指令調用
VMM 的服務的時候(與系統調用類似),硬件自動掛起 Guest OS,切換到 VMX root
operation 模式,恢復 VMM 的運行,這種轉換稱為VM exit。VMX root operation 模式下
軟件的行為與在沒有 VT-x 技術的處理器上的行為基本一致;而VMX non-root operation
模式則有很大不同,主要的區別是此時運行某些指令或遇到某些事件時,發生VM exit。
也就說,硬件這層就做了些區分,這樣全虛擬化下,那些靠“捕獲異常-翻譯-模擬”的實現
就不需要了。而且CPU廠商,支持虛擬化的力度越來越大,靠硬件輔助的全虛擬化技術的性
能逐漸逼近半虛擬化,再加上全虛擬化不需要修改客戶操作系統這一優勢,全虛擬化技術應
該是未來的發展趨勢。
KVM 全稱是基於內核的虛擬機(Kernel-based Virtual Machine),它是一個 Linux的
一個內核模塊,該內核模塊使得 Linux變成了一個Hypervisor:它由 Quramnet開發,該公
司於 2008年被 Red Hat 收購。
它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。它從 Linux 2.6.20 起就作為一模
塊被包含在 Linux 內核中。它需要支持虛擬化擴展的CPU。它是完全開源的。官方網站:
http://www.linux-kvm.org/page/Main_Page
1.1 KVM 架構
KVM 是基於虛擬化擴展(Intel VT 或者 AMD-V)的 X86 硬件的開源的 Linux 原生的全
虛擬化解決方案。KVM 中,虛擬機被實現為常規的 Linux 進程,由標準 Linux 調度程序
進行調度;虛機的每個虛擬 CPU 被實現為一個常規的 Linux 進程。這使得 KVM 能夠使用
Linux 內核的已有功能。但是,KVM 本身不執行任何硬件模擬,需要客戶空間程序通過 內
核模塊/dev/kvm 接口設置一個客戶機虛擬服務器的地址空間,向它提供模擬的 I/O,並將
它的視頻顯示映射回宿主的顯示屏。目前這個應用程序是 QEMU。
Linux 上的用戶空間、內核空間和虛機:
Guest:客戶機系統,包括CPU(vCPU)、內存、驅動(Console、網卡、I/O 設備驅動
等),被 KVM 置於一種受限制的 CPU 模式下運行。
KVM:運行在內核空間,提供CPU 和內存的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O
被 KVM 攔截後,交給 QEMU 處理。
QEMU:修改過的為KVM虛機使用的QEMU代碼,運行在用戶空間,提供硬件I/O虛擬化,通過
IOCTL /dev/kvm 設備和 KVM 交互。
KVM 是實現攔截虛機的 I/O 請求的原理:
現代CPU本身實現了對特殊指令的截獲和重定向的硬件支持,甚至新的硬件會提供額外
的資源來幫助軟件實現對關鍵硬件資源的虛擬化從而提高性能。以 X86 平臺為例,支持虛
擬化技術的 CPU 帶有特別優化過的指令集來控制虛擬化過程。通過這些指令集,VMM 很
容易將客戶機置於一種受限制的模式下運行,一旦客戶機視圖訪問物理資源,硬件會暫停客
戶機的運行,將控制權交回給 VMM 處理。VMM 還可以利用硬件的虛級化增強機制,將客戶
機在受限模式下對一些特定資源的訪問,完全由硬件重定向到 VMM 指定的虛擬資源,整個
過程不需要暫停客戶機的運行和 VMM 的參與。由於虛擬化硬件提供全新的架構,支持操作
系統直接在上面運行,無需進行二進制轉換,減少了相關的性能開銷,極大簡化了VMM的設
計,使得VMM性能更加強大。從 2005 年開始,Intel 在其處理器產品線中推廣 Intel
Virtualization Technology 即 IntelVT 技術。
QEMU-KVM:
其實QEMU原本不是KVM的一部分,它自己就是一個純軟件實現的虛擬化系統,所以其性
能低下。但是,QEMU代碼中包含整套的虛擬機實現,包括處理器虛擬化,內存虛擬化,以及
KVM需要使用到的虛擬設備模擬(網卡、顯卡、存儲控制器和硬盤等)。為了簡化代碼,KVM
在 QEMU 的基礎上做了修改。VM 運行期間,QEMU 會通過 KVM 模塊提供的系統調用進入內
核,由 KVM 負責將虛擬機置於處理的特殊模式運行。遇到虛機進行 I/O 操作,KVM 會從上
次的系統調用出口處返回 QEMU,由QEMU來負責解析和模擬這些設備。從QEMU的角度看,也
可以說是QEMU使用了KVM模塊的虛擬化功能,為自己的虛機提供了硬件虛擬化加速。除此以
外,虛機的配置和創建、虛機運行所依賴的虛擬設備、虛機運行時的用戶環境和交互,以及
一些虛機的特定技術比如動態遷移,都是QEMU自己實現的。
KVM
KVM內核模塊在運行時按需加載進入內核空間運行。KVM本身不執行任何設備模擬,需要
QEMU通過 /dev/kvm 接口設置一個GUEST OS的地址空間,向它提供模擬的 I/O設備,並將它
的視頻顯示映射回宿主機的顯示屏。它是KVM虛機的核心部分,其主要功能是初始化CPU硬
件,打開虛擬化模式,然後將虛擬客戶機運行在虛擬機模式下,並對虛機的運行提供一定的
支持。以在Intel上運行為例,KVM模塊被加載的時候,它:
首先初始化內部的數據結構;
做好準備後,KVM 模塊檢測當前的 CPU,然後打開CPU控制及存取CR4的虛擬化模式開
關,並通過執行VMXON指令將宿主操作系統置於虛擬化模式的根模式;
後,KVM模塊創建特殊設備文件/dev/kvm並等待來自用戶空間的指令。
接下來的虛機的創建和運行將是QEMU和KVM相互配合的過程。兩者的通信接口主要是一
系列針對特殊設備文件/dev/kvm的IOCTL調用。其中重要的是創建虛機。它可以理解成KVM
為了某個特定的虛機創建對應的內核數據結構,同時,KVM 返回一個文件句柄來代表所創建
的虛機。
針對該句柄的調用可以對虛機做相應地管理,比如創建用戶空間虛擬地址和客戶機物
理地址、真實物理地址之間的映射關系,再比如創建多個vCPU。KVM為每一個vCPU生成對應
的文件句柄,對其相應地IOCTL 調用,就可以對vCPU進行管理。其中重要的就是“執行虛
擬處理器”。通過它,虛機在KVM的支持下,被置於虛擬化模式的非根模式下,開始執行二
進制指令。在非根模式下,所有敏感的二進制指令都被CPU捕捉到,CPU在保存現場之後自動
切換到根模式,由KVM決定如何處理。
除了CPU的虛擬化,內存虛擬化也由KVM實現。實際上,內存虛擬化往往是一個虛機實
現中復雜的部分。CPU 中的內存管理單元MMU是通過頁表的形式將程序運行的虛擬地址轉
換成實際物理地址。在虛擬機模式下,MMU的頁表則必須在一次查詢的時候完成兩次地址轉
換。因為除了將客戶機程序的虛擬地址轉換了客戶機的物理地址外,還要將客戶機物理地址
轉化成真實物理地址。 KVM 虛機的創建過程
可見:
(1)qemu-kvm 通過對/dev/kvm的一系列 ICOTL 命令控制虛機。
(2)一個 KVM 虛機即一個 Linux qemu-kvm進程,與其他Linux進程一樣被Linux 進程調
度器調度。
(3)KVM虛機包括虛擬內存、虛擬CPU和虛機 I/O設備,其中,內存和 CPU 的虛擬化由 KVM
內核模塊負責實現,I/O 設備的虛擬化由QEMU負責實現。
(3)KVM客戶機系統的內存是qumu-kvm 進程的地址空間的一部分。
(4)KVM虛機的vCPU 作為線程運行在 qemu-kvm進程的上下文中。
vCPU、QEMU 進程、LInux 進程調度和物理CPU之間的邏輯關系:
因為CPU中的虛擬化功能的支持,並不存在虛擬的 CPU,KVM Guest代碼是運行在物理 CPU
之上。
KVM實現客戶機內存的方式是,利用mmap系統調用,在QEMU主線程的虛擬地址空間
中申明一段連續的大小的空間用於客戶機物理內存映射。
在有兩個虛機的情況下,情形是這樣的:
可見,KVM為了在一臺機器上運行多個虛擬機,需要增加一個新的內存虛擬化層, 也就是說,必須虛擬 MMU(Memory Management Unit) 來支持客戶操作系統,來實 現 VA -> PA -> MA 的翻譯。客戶操作系統繼續控制虛擬地址到客戶內存物理地址的映射
(VA -> PA),但是客戶操作系統不能直接訪問實際機器內存,因此VMM 需要負責映射客戶
物理內存到實際機器內存 (PA -> MA)。
VMM 內存虛擬化的實現方式:
? 軟件方式:通過軟件實現內存地址的翻譯,比如 Shadow page table (影子頁表)技
術
? 硬件實現:基於CPU的輔助虛擬化功能,比如AMD的NPT和Intel的EPT技術
KVM 中,虛機的物理內存即為qemu-kvm進程所占用的內存空間。KVM使用CPU輔助的內存虛擬
化方式。在Intel和AMD平臺,其內存虛擬化的實現方式分別為:
? AMD 平臺上的 NPT (Nested Page Tables) 技術
? Intel 平臺上的 EPT (Extended Page Tables)技術 KVM的整體結構:
從GUI到Linux內核,包括以下五個組件:
1) virt-manager
一個用來管理VM的GUI/CUI用戶接口;它使用libvirt api 調用VM的各種功能。
2) libvirt
一個工具及接口,作為較通用的服務器虛擬化軟件,它支持Xen,VMware ESXi/GSX,當然,
還有QEMU/KVM。
3) QEMU
一個和KVM內核模塊交互的模擬器,處理多種客戶機系統請求如I/O;一個QEMU進程對應一個
客戶機系統。
4) KVM內核模塊
從狹義上來說,KVM是一個Linux內核模塊,處理客戶機系統的VM Exits和執行VM Entry指
令。
5) Linux內核
既然QEMU作為一個普通的用戶進程運行,相應客戶機系統的調度就由Linux內核自己來處
理。
所有的組件都是開放源碼軟件(OSS)。
KVM 的功能列表
KVM 所支持的功能包括:
支持CPU 和 memory 超分(Overcommit)
支持半虛擬化I/O (virtio)
支持熱插拔(cpu,塊設備、網絡設備等)
支持對稱多處理(Symmetric Multi-Processing,縮寫為 SMP )
支持實時遷移(Live Migration)
支持 PCI 設備直接分配和單根I/O虛擬化(SR-IOV)
支持內核同頁合並(KSM )
支持NUMA (Non-Uniform Memory Access,非一致存儲訪問結構 ) KVM 工具集合
libvirt:操作和管理KVM虛機的虛擬化API,使用 C 語言編寫,可以由 Python,Ruby,
Perl, PHP, Java 等語言調用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等
Hypervisor。
Virsh:基於libvirt 的命令行工具(CLI)
Virt-Manager:基於libvirt的GUI工具
virt-v2v:虛機格式遷移工具
virt-* 工具:包括Virt-install (創建KVM虛機的命令行工具),Virt-viewer (連接
到虛機屏幕的工具),Virt-clone(虛機克隆工具),virt-top 等
sVirt:安全工具和selinux相關
圖形界面操作:
KVM(Kernel-based Virtual Machine) http://www.linux-kvm.org/ ,基於內核的虛擬機,配合 QEMU(處理器虛擬軟件),需要CPU支持虛擬化技術(並且在BIOS裏打開虛擬化選項),效率可達到物 理機的80%以上。
查看cpu是否支持
# grep -E ‘svm|vmx‘ /proc/cpuinfo
vmx is for Intel processors - svm is for AMD processors
安裝虛擬化軟件
# yum install qemu qemu-img qemu-kvm libvirt libvirt-python libguestfs-tools virt-install
圖形化工具:
# yum install virt-manager virt-viewer
開啟 libvirtd 服務:
# systemctl enable libvirtd && systemctl start libvirtd
KVM的安裝:(前提:關閉selinux 防火墻)
1、如果是用VMware Workstation做實驗,建立的虛擬機的CPU要勾選虛擬化功能,這樣虛擬
機才會支持KVM虛擬化
1、創建虛擬機之前的準備工作:
2、mkdir /mykvm
3、cd /mykvm
4、mkdir iso
5、mkdir svm
6、導入光盤 dd if=/dev/sr0 of=/mykvm/iso/centos7.iso
1. 操作系統安裝介質:ISO文件,並上傳到系統的/iso目錄下
[root@localhost ~]# ls /iso/
2、使用virt-manager圖形界面創建
virt-manager是基於libvirt的圖形化虛擬機管理軟件。在命令行中以root身份輸入
virt-manager命令,出現virt-manager管理界面
創建存儲卷,其實就是KVM虛擬機的硬盤文件,選擇剛建的“vm”存
儲卷,點擊新建卷,設置名字和大小。
創建存儲卷,其實就是KVM虛擬機的硬盤文件,選擇剛建的“vm”存
儲卷,點擊新建卷,設置名字和大小。
選擇“瀏覽”,選擇鏡像文件
選擇內存和CPU設置
選擇虛擬機存儲硬盤,選擇剛剛創建的硬盤文件。
網絡使用默認的NAT網絡即可
單擊完成後,虛擬機就開始創建,然後按照操作系統即可
KVM命令行安裝
第一種方式:
qemu-img創建磁盤文件
通過文件管理可以直接查看、修改、復制虛擬機的內部文件。例如,當系統因為配置文件無法啟動
時,可以直接修改虛擬機的文件。虛擬機磁盤文件主要有raw和qcow2格式。raw格式性能最好,速度最
快,它的缺點就是不支持一些新的功能,如支持鏡像,zlib磁盤壓縮,AES加密等。要使用鏡像功能,磁
盤格式必須為qcow2。
raw格式的話,速度稍微快點,在高版本的qemu-kvm中,幾乎不比qcow2的格式快,而qcow2格式節
省空間,可動態增長,在公有雲中廣泛使用,建議使用qcow2。所有有時候,我們需要將raw格式的磁盤
轉換成qcow2格式。
創建一個raw格式的磁盤文件
[root@localhost kvm-vm]# qemu-img create /kvm-vm/vmtest01.img 8G
Formatting ‘/kvm-vm/vmtest01.img‘, fmt=raw size=8589934592
查看一下
[root@localhost kvm-vm]# ls -lh
總用量 3.0G
-rw-------. 1 qemu qemu 11G 9月 28 22:40 centos7-vm001.qcow2
-rw-r--r--. 1 qemu qemu 1.3G 9月 29 09:28 centos7-vm002.qcow2
drwx------. 2 root root 16K 9月 27 10:45 lost+found
-rw-r--r--. 1 root root 8.0G 9月 29 09:27 vmtest01.img
[root@localhost kvm-vm]# qemu-img info vmtest01.img
image: vmtest01.img
file format: raw
virtual size: 8.0G (8589934592 bytes)
disk size: 0
雖然通過ls命令看到磁盤為8G,但是實際空間大小為0,所以通過qemu-img創建的磁盤為稀疏模式
磁盤。
virt-install命令參數:
通用選項:
-n NAME, --name=NAME 虛擬機名稱
-r MEMORY, --ram=MEMORY 以MB為單位為客戶端事件分配的內存
--vcpus=VCPUS 配置虛擬機的虛擬CPU(vcpu)數量,如:
--vcpus 5
--vcpus 5, maxcpus=10
--vcpus socket=2,cores=4,threads=2
--cpuset=CPUSET Set which physical CPUs domain can use.
--cpu=CPU CPU型號及功能,如:--cpu coreduo,+x2apic
--description=DESCRIPTION 在生成的XML中保存的可讀VM描述。
--security=SECURITY 設定域安全驅動器配置。
--numatune=NUMATUNE 為域進程調整NUMA策略。
安裝方法選項:
-c CDROM, --cdrom=CDROM 光驅安裝介質
-l LOCATION, --location=LOCATION
安裝源(例如:nfs:host:/path、http://host/path、ftp://host/path)
--pxe 使用 PXE 協議從網絡引導
--import 在磁盤映像中構建客戶機
--livecd 將光驅介質視為 Live CD
-x EXTRA, --extra-args=EXTRA
附加到使用--location引導的內核的參數
--os-type=DISTRO_TYPE
操作系統類型,‘linux‘、‘unix‘、‘windows‘
--os-variant=DISTRO_VARIANT
操作系統版本,如: ‘fedora6‘,‘rhel5‘, ‘solaris10‘, ‘win2k‘
--boot=BOOTOPTS 自選配置後安裝引導順序、菜單、永久kernel引導,等等。
存儲配置:
--disk=DISKOPTS 用各種選項指定存儲。 Ex.
--disk path=/my/existing/disk
--disk path=/my/new/disk,size=5 (單位GB)
--disk vol=poolname:volname,device=cdrom,bus=scsi,...
--nodisks 不要為該客戶端設置任何磁盤。
--filesystem=FILESYSTEMS
將主機目錄傳遞給虛擬機。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
聯網配置:
-w NETWORK, --network=NETWORK
配置客戶網絡接口。 Ex:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--nonetworks 不要為該客體創建網絡接口。
圖形配置:
--graphics=GRAPHICS
配置虛擬機顯示設置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--noautoconsole 不要自動嘗試連接到客戶端控制臺
設備選項:
--serial=SERIALS 配置虛擬機串口設備
--parallel=PARALLELS 配置虛擬機並口設備
--channel=CHANNELS 配置虛擬機溝通頻道
--console=CONSOLES 配置虛擬機與主機之間的文本控制臺連接
--host-device=HOSTDEVS 配置與客戶相連的物理主機設備
--soundhw=SOUNDHW 配置客戶聲音設備仿真
--watchdog=WATCHDOG 配置虛擬機 watchdog 設備
--video=VIDEO 配置虛擬機視頻硬件。
--smartcard=SMARTCARD 配置虛擬機智能卡設備。
例如:--smartcard mode=passthrough
--redirdev=REDIRDEV Configure a guest redirection device.
例如:--redirdev usb,type=tcp,server=192.168.1.1:4000
虛擬化平臺選項:
-v, --hvm 客戶端應該是一個全虛擬客戶端
-p, --paravirt 這個客戶端是一個半虛擬客戶端
--container This guest should be a container guest
--virt-type=HV_TYPE 要使用的管理程序名稱(kvm、qemu、xen)
--arch=ARCH 模擬的 CPU 構架
--machine=MACHINE The machine type to emulate
--noacpi 為全虛擬客戶端禁用 ACPI(在 os-type/os-variant db 中覆蓋數值)
-u UUID, --uuid=UUID 客戶端 UUID。
其它選項:
--autostart 引導主機時自動啟動域。
--print-xml 輸出所生成域的XML,而不是定義虛擬機。
--print-step=XMLSTEP 輸出具體安裝步驟
--noreboot 完成安裝後不要引導虛擬機。
--wait=WAIT 要等待的時間(以分鐘為單位)
--dry-run 完成安裝步驟,但不要創建設備或者定義虛擬機。
--force 對任意應用程序提示強制回答‘yes’,終止其它提示
-q, --quiet 禁止無錯誤輸出
--prompt 要求用戶為模糊情況或者需要的選項輸入
-d, --debug 輸入故障排除信息
1、純命令行安裝kvm的操作系統
全部c (如上圖所述)
然後按b安裝
第二種:Vnc安裝
管理虛擬機:
1、libvirt架構概述:
libvirt是用來管理虛擬機或虛擬化功能的軟件集合,主要包括:libvirt API,
libvirtd進程和virsh工具集三部分。最初的目的是為不同的hypervisor提供統一的管理接
口。
libvirtd該後臺進程主要實現以下功能:
(1)遠程代理
所有remote client發送來的命令,由該進程監測執行
(2)本地環境初始化
libvirt服務的啟停,用戶connection的響應等
(3)根據環境註冊各種Driver(qemu, xen, storage…)的實現
不同虛擬化技術以Driver的形式實現,由於libvirt對外提供的是統一的接口,
所以各個Driver就是實現這些接口,即將Driver註冊到libvirt中
查看libvirtd服務狀態:
[root@localhost ~]# systemctl status libvirtd
如果libvirtd服務停止運行,那麽你將不能管理虛擬機,也就是不能使用virt-manager
等工具來管理虛擬機。
虛擬機的所有配置是放置在一個xml文件中,位置在/etc/libvirt/qemu/目錄中
3、使用virsh來管理虛擬機
virsh是使用libvirt management API構建的管理工具
virsh的名稱的含義是virtualization shell。它有兩種工作模式:
立即模式
常用命令總結:
KVM基本功能管理:
1)查看命令幫助
2)查看KVM的配置文件存放目錄
3)查看虛擬機狀態
[root@localhost ~]# virsh list --all
Id 名稱 狀態
---------------------------------------------------
2 vm002 running
3 centos7.0 running
4)虛擬機關機與關機
[root@localhost ~]# virsh shutdown vm002
域 vm002 被關閉
[root@localhost ~]# virsh start vm002
域 vm002 已開始
5)強制虛擬機系統關閉電源
[root@localhost ~]# virsh destroy vm002
[root@localhost ~]# virsh list --all
Id 名稱 狀態
---------------------------------------------------
3 centos7.0 running
- vm002 關閉
6)掛起虛擬機
[root@localhost ~]# virsh suspend vm002
域 vm002 被掛起
[root@localhost ~]# virsh list --all
Id 名稱 狀態
---------------------------------------------------
3 centos7.0 running
5 vm002 暫停
7)恢復虛擬機
[root@localhost ~]# virsh resume vm002
域 vm002 被重新恢復
[root@localhost ~]# virsh list --all
Id 名稱 狀態
3 centos7.0 running
5 vm002 running
8)導出虛擬機配置
[root@localhost ~]# virsh dumpxml vm002 > /etc/libvirt/qemu/vm002-bak.xml
9)虛擬機的刪除與添加
刪除虛擬機
[root@localhost ~]# virsh shutdown vm002
域 vm002 被關閉
[root@localhost ~]# virsh undefine vm002
域 vm002 已經被取消定義
10)修改虛擬機配置信息(兩種)
直接修改配置文件
[root@localhost ~]# vim /etc/libvirt/qemu/vm002.xml
通過virsh命令修改
[root@localhost ~]# virsh edit vm002
11)創建一個新虛擬機配置
(末尾隨便修改一位)
末尾隨便修改一位
KVM虛擬機快照
快照實際上做的是虛擬機的XML配置文件,默認快照XML文件
在/var/lib/libvirt/qemu/snapshot/虛擬機名/下,快照只支持qcow2磁盤格式的系統。
1) 對虛擬機vm002做快照
[root@kvm001 ~]# virsh snapshot-create vm002
已生成域快照 1507040414
2) 查看快照信息
[root@kvm001 ~]# virsh snapshot-list vm002
名稱 生成時間 狀態
-----------------------------------------------------------
1507040414 2017-10-03 22:20:14 +0800 shutoff
firsh_snap 2017-10-03 22:26:49 +0800 shutoff
3) 查看當前快照信息
[root@kvm001 ~]# virsh snapshot-current vm002
<domainsnapshot>
<name>firsh_snap</name> //快照版本號
<state>shutoff</state>
<parent>
<name>1507040414</name>
</parent>
<creationTime>1507040809</creationTime>
<memory snapshot=‘no‘/>
4) 恢復虛擬機狀態到1507040414
[root@kvm001 ~]# virsh snapshot-revert vm002 1507040414
KVM的存儲選項有多種,包括虛擬磁盤文件、基於文件系統的存儲和基於設備的存儲。
virsh中和存儲池相關的命令
pool-autostart 自動啟動某個池
pool-build 建立池
pool-create-as 從一組變量中創建一個池
pool-create 從一個 XML 文件中創建一個池
pool-define-as 在一組變量中定義池
pool-define 在一個XML文件中定義(但不啟動)一個池或修改
已有池
pool-delete 刪除池
pool-destroy 銷毀(刪除)池
pool-dumpxml 將池信息保存到XML文檔中
pool-edit 為存儲池編輯 XML 配置
pool-info 查看存儲池信息
pool-list 列出池
pool-name 將池 UUID 轉換為池名稱
pool-refresh 刷新池
pool-start 啟動一個(以前定義的)非活躍的池
pool-undefine 取消定義一個不活躍的池
pool-uuid 把一個池名稱轉換為池 UUID
virsh中的和存儲卷相關命令
vol-clone 克隆卷。
vol-create-as 從一組變量中創建卷
vol-create 從一個 XML 文件創建一個卷
vol-create-from 生成卷,使用另一個卷作為輸入。
vol-delete 刪除卷
vol-download 將卷內容下載到文件中
vol-dumpxml 保存卷信息到XML文檔中
vol-info 查看存儲卷信息
vol-key 根據卷名或路徑返回卷的key
vol-list 列出卷
vol-name 根據給定卷key或者路徑返回卷名
vol-path 根據卷名或key返回卷路徑
vol-pool 為給定密鑰或者路徑返回存儲池
vol-resize 重新定義卷大小
vol-upload 將文件內容上傳到卷中
vol-wipe 擦除卷
例如:
查看系統中的存儲池
virsh # pool-list --details
Name State Autostart Persistent Capacity Allocation Available
-----------------------------------------------------------------------
iso running yes yes 38.28 GiB 11.28 GiB 27.00 GiB
vms running yes yes 38.28 GiB 11.28 GiB 27.00 GiB
查看vm存儲池的信息
[root@kvm001 ~]# virsh pool-info vm
名稱: vm
UUID: f97233cf-7cde-4f3d-a6a7-381ca4730493
狀態: running
持久: 是
自動啟動: 否
容量: 78.62 GiB
分配: 8.38 GiB
可用: 70.23 GiB
查看vm存儲池中的卷信息
[root@kvm001 ~]# virsh vol-list vm
名稱 路徑
---------------------------------------------------------------------------
-
base-centos7.qcow2 /kvm-vm/base-centos7.qcow2
centos7-vm001.qcow2 /kvm-vm/centos7-vm001.qcow2
centos7-vm002.qcow2 /kvm-vm/centos7-vm002.qcow2
lost+found /kvm-vm/lost+found
oa-disk0.qcow2 /kvm-vm/oa-disk0.qcow2
vm003.qcow2 /kvm-vm/vm003.qcow2
vmtest01.img /kvm-vm/vmtest01.img
vmtest01.qcow2 /kvm-vm/vmtest01.qcow2
(基於目錄的創建池)
創建基於目錄的存儲池 dir:Filesystem Directrory
通過virsh創建
[root@kvm001 ~]# virsh pool-define-as test dir --target "/guest_images/"
如果創建的存儲池的目錄不存在的時候,需要先通過pool-build命令構建然後才能啟
動成功
[root@kvm001 ~]# virsh pool-list --all
名稱 狀態 自動開始
------------------------------------------
default 活動 是
test 不活躍 否
vm 活動 否
vm_iso 活動 是
[root@kvm001 ~]# virsh pool-start test
池 test 已啟動
[root@kvm001 ~]# virsh pool-autostart test
池 test 標記為自動啟動
[root@kvm001 ~]# virsh pool-list
名稱 狀態 自動開始
------------------------------------------
default 活動 是
test 活動 是
vm 活動 否
vm_iso 活動 是
創建基於LVM的存儲池 logical: LVM Volume Group
基於LVM的存儲池要求使用全部磁盤分區
創建存儲池時,首先準備一個vg,vg中不需要創建lv,有兩種情況
使用現有的VG kvmvg
創建新的VG kvmvg
Target Path:新的卷組名
Source Path:存儲設備的位置
Build Pool:會創建新的VG
創建 卷組 池
virsh # pool-define-as kvmvg logical --source-name=kvmvg --target=/dev/kvmvg
基於netfs存儲池
創建存儲卷
存儲卷概述
存儲池被分隔為存儲卷
存儲卷
文件
塊設備 (如物理分區、LVM邏輯卷等)
Libvirt管理的其他類型存儲的抽象
列出存儲池
[root@kvm001 ~]# virsh pool-list
名稱 狀態 自動開始
------------------------------------------
default 活動 是
nfs2 活動 是
storage02 活動 是
vm 活動 否
vm_iso 活動 是
查看具體存儲池vm的信息
[root@kvm001 ~]# virsh pool-info vm
名稱: vm
UUID: f97233cf-7cde-4f3d-a6a7-381ca4730493
狀態: running
持久: 是
自動啟動: 否
容量: 78.62 GiB
分配: 8.38 GiB
可用: 70.23 GiB
查看存儲池VM中的卷
[root@kvm001 ~]# virsh vol-list vm
名稱 路徑
---------------------------------------------------------------------------
-
base-centos7.qcow2 /kvm-vm/base-centos7.qcow2
centos7-vm001.qcow2 /kvm-vm/centos7-vm001.qcow2
centos7-vm002.qcow2 /kvm-vm/centos7-vm002.qcow2
Redhat/CentOS配置網橋的常用方法:
nmcli
nmcli connection add con-name br0 type bridge ifname br0 //添加網橋
nmcli connection add type bridge-slave con-name ens32 ifname ens32 master
br5 //橋接物理網卡
nmcli connection up ens32 //激活連接
dhclient br0
KVM遷移
靜態遷移(冷遷移) 對於靜態遷移,你可以在宿主機上保存一個完整的客戶機鏡像快照,然後在宿主機中關閉或 者暫停該客戶機,然後將該客戶機的鏡像文件復制到另一臺宿主機中,使用在源主機中啟動該客戶 機時的命令來啟動復制過來的鏡像。 動態遷移(熱遷移) 如果源宿主機和目的宿主機共享存儲系統,則只需要通過網絡發送客戶機的 vCPU 執行狀 態、內存中的內容、虛機設備的狀態到目的主機上。否則,還需要將客戶機的磁盤存儲發到目的主 機上。共享存儲系統指的是源和目的虛機的鏡像文件目錄是在一個共享的存儲上的。
在基於共享存儲系統時,KVM 動態遷移的具體過程為:
1、遷移開始時,客戶機依然在宿主機上運行,與此同時,客戶機的內存頁被傳輸到目的主機上。
2、QEMU/KVM 會監控並記錄下遷移過程中所有已被傳輸的內存頁的任何修改,並在所有內存頁都傳
輸完成後即開始傳輸在前面過程中內存頁的更改內容。
3、QEMU/KVM 會估計遷移過程中的傳輸速度,當剩余的內存數據量能夠在一個可以設定的時間周期
(默認 30 毫秒)內傳輸完成時,QEMU/KVM 會關閉源宿主機上的客戶機,再將剩余的數據量傳輸
到目的主機上,最後傳輸過來的內存內容在目的宿主機上恢復客戶機的運行狀態。
4、至此,KVM 的動態遷移操作就完成了。遷移後的客戶機盡可能與遷移前一致,除非目的主機上
缺少一些配置,比如網橋等。 註意,當客戶機中內存使用率非常大而且修改頻繁時,內存中數據不斷被修改的速度大於KVM能夠 傳輸的內存速度時,動態遷移的過程是完成不了的,這時候只能靜態遷移。 關於實時遷移的效率,業界不少人提出了改進的建議,比如通過使用內存壓縮技術,減少需要傳輸 的內存的大小
遷移註意事項:
1、最好遷移的服務器cpu品牌一樣
2、64位只能在64位宿主機間遷移,32位可以遷移32位和64位宿主機
3、宿主機名字不能沖突
4、目的宿主機和源宿主機軟件配置盡可能的相同,如 有相同的橋接網卡,資源池等。
5、兩臺遷移的主機 cat /proc/cpuinfo |grep nx 的設置是相同的
NX,全名為“No eXecute”,即“禁止運行”,是應用在CPU的一種技術,用作把存儲器
區域分隔為只供存儲處理器指令集,或只供數據使用。任何使用NX技術的存儲器,代表僅供數據使
用,因此處理器的指令集並不能在這些區域存儲。這種技術可防止大多數的緩沖溢出攻擊,即一些
惡意程序,把自身的惡意指令集放在其他程序的數據存儲區並運行,從而把整臺計算機控制。
靜態遷移 (冷)
1.拷貝鏡像文件和虛擬機配置文件
2.重新定義此虛擬機
動態遷移: (熱)
- 創建共享存儲
- 2.兩臺機器掛載共享存儲(手工掛載;使用資源池)
- 3.啟動動態遷移
- 4.創建遷移後的虛擬機配置文件
- 5.重新定義虛擬機
案例實施步驟如下:
1、設置主機名、/etc/hosts 互相解析,保證網絡連接
2、兩臺主機的KVM連接NFS共享存儲
3、在源主機的KVM中新建虛擬機並安裝操作系統
4、連接KVM,並進行遷移。
virsh migrate命令幫助
# virsh migrate --help
[--domain] <string> 域名,id 或 uuid
[--desturi] <string> 客戶端(常規遷移)或者源(p2p 遷移)中看到到目的地主機連 接 URI
--live 熱遷移
--offline 離線遷移
--p2p 點對點遷移
--direct 直接遷移
--tunnelled 管道遷移
--persistent 目的地中的持久 VM
--undefinesource 在源中取消定義 VM
--suspend 部啟用目的地主機中的域
--copy-storage-all 使用全磁盤復制的非共享存儲進行遷移
--copy-storage-inc 使用增值復制(源和目的地共享同一基礎映像)的非共享存儲進行
遷移
--change-protection 遷移結束前不得對域進行任何配置更改
--unsafe 即使不安全也要強制遷移
--verbose 顯示遷移進程
--compressed 實時遷移過程中壓縮重復的頁
--auto-converge force convergence during live migration
--rdma-pin-all support memory pinning during RDMA live migration
--abort-on-error 在遷移過程中忽略軟錯誤
--migrateuri <string> 遷移 URI, 通常可省略
--graphicsuri <string> 無空隙圖形遷移中使用的圖形 URI
--listen-address <string> listen address that destination should bind to for incoming migration --dname <string> 在遷移過長中重新命名為一個新名稱(如果支持)
--timeout <number> 如果 live 遷移超時(以秒計)則強制虛擬機掛起
--xml <string> 包含為目標更新的 XML 的文件名
冷:# virsh migrate --live --unsafe --verbose mynfs_vm1 qemu+ssh://192.168.145.30/system
熱遷移:
NFS:為了配合以後的虛擬機遷移,可以將虛擬機統一放在NFS等文件服務器上
(nfs添加一塊網卡)
服務器 centos7 yum install rpcbind nfs-utils (kvm、NFS都裝)
KVM: systemctl start rpcbind (enable)
NFS: systemctl srart rpcbind (enable)
Systemctl start nfs-service.service(enable)
KVM: vim/etc/sysconfig/nfs (端口啟動)
NFS:pvcreate /dev/sdb
Vgcreate nfsvg /dev/sdb
Lvcreate -n nfslv1 -l 卷組號 /dev/sdb
mkdir/mnt/nfs
mount /dev/nfsvg/nfslv1 /mnt/nfs
mkfs.xfs /dev/nfsvg/nfslv1 (格式化)
Vim /etc/fstab
/dev/nfsvg/nfslv1 xfs defaults 0 0
mount -a mount |grep ‘/mnt’
Vim /etc/exports
/mnt/nfs/ *(sync_no_root_squash)
exportfs -av
KVM: showmount -e 192.168.118.119
Mount -t nfs 192.168.118.119:/mnt/nfs/ /media
Cd /media
Touch 1.txt
進NFS /mnf/nfs就可以看到
KVM介紹 虛擬化簡史