一.KVM原理簡介
廣義的KVM實際上包含兩部分,一部分是基于Linux內核支持的KVM內核模塊,另一部分就是經過簡化和修改的Qemuo
KVM內核模塊是模擬處理器和內存以支持虛擬機的運行,Qemu主要處理丨℃以及為用戶提供一個用戶空間工具來進行虛擬機的管理。兩者相互結合、相輔相成,構成了一個完整的虛擬化平臺。
需要注意的是,Qemu本身并不是KVM的一部分,Qemu是一套完整的虛擬化解決方案,是純軟件實現虛擬化,包括處理器虛擬化、內存虛擬化以及各種虛擬設備的模擬,但因為是純軟件模擬出來的,所以Qemu的性能比較低。
二.KVM運行時的三種模式
客戶模式:執行非I/O的客戶代碼,虛擬機運行在這個模式下
用戶模式:用戶執行I/O代碼,QEMU運行在這個模式下?
內核模式:CPU調度和內存管理相關
客戶模式(?Guest Mode)?:?可以理解為虛擬機在操作系統中運行的模式。?客戶模式又分為內核模式和用戶模式。?內核模式模擬CPU以及內存,?實現客戶模式的切換,?處理從客戶模式的退出。?KVM內核模塊運行在這個模式下,?模擬CPU以及內存,?實現客戶模式的切換,?處理從客戶模式的退出。
用戶模式(?User Mode)?:?在這種模式下,?運行QEMU,?實現IO模擬與虛擬機管理。?QEMU運行在這個模式下,?為用戶提供虛擬機管理的用戶空間工具以及代表用戶執行I/O操作。?
內核模式(?Kernel Mode)?:?這是KVM虛擬化的核心模式,?運行KVM內核模塊。?在這個模式下,?KVM為虛擬機創建虛擬CPU和虛擬內存,?然后執行VMLAUNCH指令進入客戶模式,?裝載Guest OS并運行。?如果Guest OS運行過程中發生異常,?KVM會暫停Guest OS的運行,?保存當前狀態,?并退出到內核模式來處理這些異常。?內核模式還負責處理需要I/O的情況,?處理完成后重新進入客戶模式。
三.KVM工作原理
KVM(Kernel-based Virtual Machine)是基于Linux內核的虛擬機技術,其工作原理核心是利用硬件虛擬化擴展(如Intel VT-x/AMD-V)將物理CPU、內存和I/O設備虛擬化為多個虛擬機資源,具體如下:
核心組件
? KVM模塊:作為Linux內核模塊,負責創建和管理虛擬機(VM),并通過硬件虛擬化功能實現CPU和內存的虛擬化。
? QEMU:模擬I/O設備(如網卡、硬盤),與KVM結合后,通過KVM模塊接管CPU和內存,自身專注于I/O模擬,提升性能。
工作流程
1. 初始化:KVM模塊加載后,通過/dev/kvm接口為每個虛擬機創建虛擬CPU(vCPU),每個vCPU對應一個Linux進程。
2. CPU虛擬化:利用硬件虛擬化技術(如Intel VT-x的VMX模式),將vCPU調度到物理CPU上運行,實現指令集的隔離和特權級轉換。
3. 內存虛擬化:通過KVM的內存管理組件(如影子頁表或EPT/NPT技術),將虛擬機的虛擬地址映射到物理地址,確保各VM內存獨立。
4. I/O虛擬化:QEMU通過軟件模擬或硬件直通(如PCIe設備直通),讓VM訪問外設,硬件直通可提升I/O性能。
5. 資源調度:Linux內核的調度器負責分配物理CPU時間片給各個vCPU,內存和I/O資源也由KVM和QEMU協同管理。
關鍵技術
? 硬件輔助虛擬化:依賴CPU提供的虛擬化指令,避免純軟件模擬的性能損耗。
? 半虛擬化驅動(virtio):VM通過virtio接口與宿主機通信,優化網絡、磁盤等I/O性能。
? 實時遷移:利用KVM的狀態保存和恢復機制,可在物理主機間遷移運行中的VM,不中斷服務。
KVM通過與Linux內核深度整合,實現了高效的服務器虛擬化,廣泛應用于云計算和企業服務器集群。
- Qemu:快速仿真器
- Libkvm:?libkvm?通過 ioctl 系統調用進入內核模式
- Ioctl:ioctl是設備驅動程序中對設備的I/O通道進行管理的函數
- fd:用fd 通過ioctl 向設備驅動來發送創建,運行虛擬機命令,設備驅動/dev/kvm 就會來解析命令
- /dev/kvm:Linux字符集設備 /dev/kvm,是kvm的內核模塊
QEMU(Quick EMUlator)是一個開源的通用模擬器和虛擬化軟件,由?Fabrice Bellard創建。?它允許在一個平臺上運行一個或多個操作系統,這些操作系統與宿主機(運行QEMU的機器)的原生操作系統完全隔離。QEMU具有以下主要功能:
- 系統模擬:可以模擬多種不同的計算機類型和架構,如x86, x86-64 (AMD64/Intel 64), ?ARM, ?PowerPC, ?SPARC等。這意味著可以在一個架構上運行為另一架構編譯的操作系統和程序。
- 用戶模式模擬:支持用戶模式模擬,允許單個程序以不同的操作系統用戶空間在主機上運行,這對于開發和測試跨平臺應用程序非常有用。
- 虛擬化:當在支持硬件虛擬化的處理器上運行時,QEMU可以利用?KVM(Kernel-based Virtual Machine)模塊提供快速虛擬化,使虛擬機以接近物理硬件的速度運行,同時提供隔離和資源控制的優點。
- 網絡和設備模擬:支持復雜的網絡模擬功能,允許虛擬機通過不同的網絡拓撲配置相互通信或訪問互聯網。同時能夠模擬各種硬件設備,如硬盤、網絡接口卡、圖形適配器、USB設備等。
QEMU可以獨立使用,也經常與其他虛擬化和模擬工具一起使用,如?VirtualBox或?VMware的用戶界面,或者與?libvirt這樣的虛擬化管理庫配合使用,以簡化虛擬機的管理和操作。這使得QEMU在軟件開發、測試、系統管理、教育和研究等領域有廣泛應用
四.實驗步驟
實驗環境
主機 | .? 操作系統 | IP地址 | 主要軟件 |
kvm01 | CentOS 7.9 x86_64 | 192.168.10.108 | KVM 虛擬機 |
kvm02 | CentOS 7.9 x86_64 | 192.168.10.109 |
1.搭建KVM虛擬化平臺
1.2準備KVM虛擬化環境
(1)YUM 安裝 KVM
yum -y install qemu-kvm
yum -y install qemu-img
yum -y install bridge-utils
yum -y install qemu-kvm-tools
yum -y install virt-install
yum -y install libvirt
yum -y install virt-manager
yum -y install libguestfs-tools
備注:
qemu-kvm : kvm核心包–虛擬操作系統模擬器加速模塊
qemu-img :是QEMU的磁盤管理工具
bridge-utils:虛擬機與外界通信的命令管理工具
qemu-kvm-tools :qemu-kvm的工具包
virt-install:虛擬機安裝工具
libvirt:必須要裝的核心工具
virt-manager:虛擬機圖形管理工具(宿主機有桌面環境時可以考慮安裝,命令操作或者遠程控制則不需要)
libguestfs-tools:用于訪問虛擬機的磁盤映像文件提供的一組命令
QEMU是“Quick Emulator”的縮寫,是一個用C語言編寫的開源虛擬化軟件。
QEMU(Quick Emulator)快速仿真器
(2)關機,設置CPU支持虛擬化,然后開機
(3)開機后驗證
hostnamectl set-hostname kvm01
?bash
vim /etc/hosts
192.168.10.201 kvm01
192.168.10.202 kvm02
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
cat /proc/cpuinfo | grep vmx
lsmod | grep kvm
(4)開啟libvirtd服務
安裝完成后還需要開啟 libvirtd 服務,以開啟相關支持。
systemctl start libvirtd
systemctl enable libvirtd
2.設置KVM網絡
這里以 Bridge(橋接)為例進行操作演示
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0
vi ifcfg-ens160
BRIDGE=br0
vi ifcfg-br0
TYPE=bridge
NAME=br0
DEVICE=br0
systemctl restart network
ifconfig
3.KVM管理
virt-manager
(1)創建存儲池
存儲池的名稱為:kgc
存儲池的目錄為:/data_kvm/store
(2)創建存儲卷
在kgc的存儲池中添加存儲卷
存儲卷名稱為:test01
卷最大容量10G
(3)將Linux系統的ISO文件拷貝到/opt目錄下,并關閉存儲設置
(4)在kvm01的主機上新建虛擬機,名稱為test01
5.使用KVM命令集管理虛擬機
virsh -h? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //查看命令幫助
ls /etc/libvirt/qemu/? ? ? ? ? ? //查看KVM的配置文件存放目錄
virsh list --all? ? ? ? ? ? ? ? ? ? ? //查看虛擬機狀態
virsh shutdown test01? ? ? ?//虛擬機關機
virsh start test01? ? ? ? ? ? ? ? //虛擬機開機
virsh destroy test01? ? ? ? ? ?//強制實例系統關閉電源
?virsh create /etc/libvirt/qemu/test01.xml? ?//通過配置文件啟動虛擬機系統實例
virsh suspend test01? ? ? ? ? ? ?//掛起虛擬機
?virsh resume test01? ? ? ? ? ? ? //恢復虛擬機
virsh autostart test01? ? ? ? ? ? //配置虛擬機實例伴隨宿主機自動啟動
virsh dumpxml test01 > /etc/libvirt/qemu/test02.xml? ? ? ? ?//導出虛擬機配置
virsh shutdown test01
virsh undefine test01? ? ? ? ? ? ? ? ?//虛擬機的刪除與添加
查看刪除結果,test01 的配置文件被刪除,但是磁盤文件不會被刪除。
ls /etc/libvirt/qemu/
通過 virsh list --all 查看不到 test01 的信息,說明此虛擬機被刪除
通過備份的配置文件重新定義虛擬機:
cd /etc/libvirt/qemu
?mv test02.xml test01.xml
重新定義虛擬機:
virsh define test01.xml
修改虛擬機配置信息
vim命令:vim /etc/libvirt/qemu/test01.xml
virsh命令:?virsh edit test01
6.KVM文件管理
(1)查看當前磁盤格式
qemu-img info /data_kvm/store/test01.qcow2
備注:
如果虛擬機磁盤文件不是 qcow2 格式,可以通過 qemu-img 命令轉換磁盤文件格式,
如執行以下操作可以將 test01 虛擬機 raw 格式磁盤轉換至 qcow2 格式。
[root@kvm01 ~]# virsh shutdown test01
[root@kvm01 ~]# qemu-img convert -f raw -O qcow2 /data_kvm/store/test01.img /data_kvm/store/test01.qcow2
執行轉換磁盤格式的命令后還需要修改 test01 的 xml 配置文件中磁盤的類型與磁盤文件名。
[root@kvm01 ~]# virsh edit test01
…… //省略部分內容
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/data_KVM/store/test01.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
(2)virt-cat 命令,類似于 cat 命令
使用這個命令需要安裝 libguestfs-tools-c 工具包。
virt-cat -a /data_kvm/store/test01.qcow2 /etc/sysconfig/grub
(3)virt-edit 命令
virt-edit 命令,用于編輯文件,用法與 vim 基本一致。
virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf
(4)virt-df 命令
virt-df 命令用于查看虛擬機磁盤信息。
virt-df -h test01
7.虛擬機克隆
(1)查看虛擬機狀態
virsh list --all
(2)從 test01 克隆 test02
virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
(3)查看虛擬機狀態
virsh list --all
(4)啟動虛擬機
?virsh start test02
8.虛擬機快照
KVM 虛擬機要使用鏡像功能,磁盤格式必須為 qcow2。
(1)對 test01 創建快照
virsh snapshot-create test01
已生成域快照 1503494464
(2)查看虛擬機快照版本信息
virsh snapshot-current test01
(3)查看快照信息
?virsh snapshot-list test01
(4)創建新快照
?virsh snapshot-create test01
(5)查看快照信息
virsh snapshot-list test01
(6)恢復虛擬機狀態
virsh snapshot-revert test01 1503494464
(7)查看虛擬機快照版本信息
?virsh snapshot-current test01
(8)刪除快照
?virsh snapshot-delete test01 1503494464