KVM 虛擬化架構和實現原理
目錄
KVM虛擬化架構
KVM是嵌入在Linux作業系統標準核心中的一個虛擬化模組,它能夠將一個Linux標準核心轉換成為一個VMM,嵌有KVM模組的Linux標準核心可以支援通過kvm tools來進行載入的GuestOS。所以在這樣的作業系統平臺下,計算機物理硬體層上直接就是VMM虛擬化層,而沒有獨立出來的HostOS作業系統層。在這樣的環境中HostOS就是一個VMM。
每個由KVM建立的GuestOS都是HostOS(或VMM)上的一個單個程序。而在GuestOS上的User-space中執行的Applications可以理解為就是程序中的執行緒。
需要注意的是:KVM只是虛擬化解決方案的一部分,想要實現全虛擬化,還需要其他的條件:
1. CPU處理器提供的虛擬化支援(VT-x 硬體輔助虛擬化,可以為GuestOS建立虛擬化處理器,本質是對暫存器的隔離模擬和對指令集的劃分)。
2. 記憶體可以通過kvm虛擬化成獨立的虛擬化地址(/dev/kvm)
3. I/O虛擬化(QEMU)
==> KVM虛擬化 = KVM核心模組 + /dev/kvm + QEMU
/dev/kvm
Linux作業系統標準核心中的KVM核心模組生成了一個名為/dev/kvm
的裝置,有了/dev/kvm
裝置,使得GuestOS的地址空間(記憶體地址、磁碟地址)能夠獨立於標準核心或其他任何GuestOS的地址空間。Linux作業系統目錄結構包含的/dev
目錄樹下的裝置對於所有User-space程序或執行緒(無論是在GuestOS上,還是在VMM上)來說都是通用的,但是每個開啟/dev/kvm
裝置的不同的程序或執行緒,所能使用的都是唯一且各不相同的地址對映(為了支援GuestOS間的隔離)。
KVM核心模組通過/dev/kvm
有兩種支援Guest地址到Host(VMM)地址的轉換方法:
- 應用LinuxOS維護的一組影子頁表(shadow page table)
- CPU也可以通過在訪問未經對映的記憶體位置時使用VMM(主機核心)來支援記憶體轉換程序。
所以總的來說,/dev/kvm
裝置的作用就是:將不同的GuestOS之間的地址隔離,或將GuestOS和HostOS(VMM)之間的地址隔離
QEMU
QEMU是一個I/O虛擬化解決方案,能夠對一個完整的計算機物理層環境進行虛擬化(EG. 磁碟、圖形介面卡、網路裝置)。
在GuestOS中生成的所有I/O請求都會被QEMU中途截獲,並重新發送到QEMU程序模擬的User Mode中。
Openstack、KVM、QEMU 的關係
KVM 用來模擬 CPU 的執行,但缺少了對 Network 和 I/O 的支援。QEMU-KVM 是一個完整的模擬器,它基於 KVM 上,提供了完整的 Network 和 I/O 支援。其中 Openstack 為了跨 VM 性,所以不會直接控制 QEMU-KVM,而是通過 libvit 的庫去間接控制 QEMU-KVM 。
KVM的虛擬化實現
KVM核心模組為Linux標準核心引入了一種除現有的Kernel Mode和User Mode之外的新程序模式。這種新模式就稱為Guest Mode模式,顧名思義,它用來執行GuestOS的程式碼。
Linux標準核心的執行模式可以針對不同的執行內容和目的進行定義。Guest Mode的存在就是為了執行GuestOS的程式碼,但是隻針對那些非I/O的程式碼。I/O程式碼還需要QEMU來作為支援。
GuestOS可以在兩種模式下執行:
- 在Guest Mode中執行的GuestOS可以支援標準的核心。
- 在User Mode下執行的GuestOS則支援自己的核心和User-space(Applications)。
相同的是,GuestOS只能夠在User Mode下執行I/O操作,而且這是單獨使用QEMU-KVM進行管理的。