KVM源代碼分析1:基本工作原理 下了很大決心挖這個坑,雖然之前對kvm有些了解,但紙上得來終覺淺,只有深入到代碼層面,才能擯棄皮毛,看到血肉,看到真相。作為挖坑的奠基石,准備寫上幾篇:kvm基本工作原理、CPU

調度原理、KVM內存管理、KVM存儲管理、KVM設備管理。挖好之后進入正題。 所有的虛擬化都是兩部分組成:虛擬機和宿主(HOST),虛擬機內運行正常的業務程序,HOST則正常運行虛擬機,此處的虛擬機則是KVM,負責在HOST里面虛擬化出獨立的OS環境。 KVM屬於完全虛擬化,功能組件上由兩部分組成,KVM Driver(內核態)和Qemu(用戶態)。KVM Driver負責模擬虛擬機的CPU運行,內存管理,設備管理等;Qemu則模擬虛擬機的IO設備接口以及用戶態控制接口。 kvm-oenhan 如上圖所示,Qemu在最上層,將虛擬機的整體呈現到host用戶上,可以理解成客戶模式;Qemu通過中間層libkvm或者ioctl等控制/dev/kvm設備接口,從而掌握內核態中kvm

驅動進行的資源分配,即用戶態模式;kvm驅動接收用戶態操作指令,控制虛擬機在內核態的資源分配,稱之為內核模式。在HOST里面,客戶模式的體現就是一個虛擬機內部環境,用戶態則是虛擬機進程。
oenhan_kvm 上圖是一個執行過程圖,首先啟動一個虛擬化管理軟件,開始啟動一個虛擬機,通過ioctl等系統調用向內核中申請指定的資源,搭建好虛擬環境,啟動虛擬機內的系統,虛擬機內的系統向內核反饋相關資源申請處理,如果是io請求,則提交給用戶模式下的qemu處理,非io請求則將處理結果反饋給客戶模式。 libkvm是qemu自己使用的用戶態接口,可以把qemu源代碼解開,里面有libkvm的函數庫,不過並不對外呈現,虛擬機編程接口一般使用libvirt。
KVM的思想是在Linux內個的基礎上添加虛擬機管理模塊,重用Linux內核中已經完善的進程調度,內存管理,IO管理等部分,因此KVM並不是一個完整的模擬器,而只是一個提供虛擬化功能的內核插件,具體的模擬器工作是借助QEMU來完成的.
在Xen的體系結構中,Xen Hypervisor運行於硬件之上,並且將系統資源進行了虛擬化,將虛擬化的資源分配給上層的虛擬機(VM),然后通過虛擬機VM來運行相應的客戶機操作系統. 在KVM中,一個虛擬機就是一個傳統的Linux中的線程,擁有自己的PID號,也可以被kill系統調用直接殺死(在這種情況下,虛擬機的行為表現為"突然斷電").在一個Linux系統中,有多少個VM,就有多少個進程.如: 以上VM進程信息是通過qemu-kvm來進行的,相關的控制開關作為命名行參數輸入,如虛擬映像對應的磁盤,虛擬網卡,VNC設置,顯卡設置和IO設置等. KVM的API是通過/dev/kvm設備進行訪問的./dev/kvm是一個字符型設備. 1 root@ubuntu:~# ls -l /dev/kvm 2 crw-rw---- 1 root kvm 10, 232 Mar 14 14:20 /dev/kvm kvm僅僅是Linux內核的一個模塊,管理和創建完整的KVM虛擬機,需要更多的輔助工具. 1.qemu-Kvm:僅有KVM模塊是遠遠不夠的,因為用戶無法直接控制內核模塊去做事情,還必須有一個用戶空間的工具。關於用戶空間的工具,KVM 的開發者選擇了已經成型的開源虛擬化軟件 QEMU.QEMU 是一個強大的虛擬化軟件,它可以虛擬不同的 CPU 構架. 運行在內核態的KVM模塊通過/dev/kvm字符設備文件向外提供操作接口.KVM通過提供libkvm這個操作庫,將/dev/kvm這一層面的ioctl類型的API轉化成為通常意義上的函數API調用,提供給QEMU的相應適配層. 比如說在x86 的CPU上虛擬一個Power的CPU,並利用它編譯出可運行在 Power上
