標籤(空格分隔): KVM網絡
本文不介紹kvm和qemu的基本安裝操做,但願讀者具備必定的KVM實踐經驗。同時但願藉此系列博客,可以對KVM底層有一些清晰直觀的認識,固然我沒有通讀KVM的源碼,文中的內容一部分來自於書籍和資料,一部分來自於實踐,還有一些來自於本身的理解,確定會有一些理解的誤差,歡迎討論並指正。本系列文章敬表明我我的觀點和實踐,不表明公司層面。架構
KVM 全稱 kernel-based virtual machine,由Qumranet公司發起,2008年被RedHat收購。
KVM實現主要基於Intel-V或者AMD-V提供的虛擬化平臺,利用普通的Linux進程運行於虛擬態的指令集,模擬虛擬機監視器和CPU。KVM不提供硬件虛擬化操做,其IO操做等都藉助QEMU來完成。優化
KVM有以下特色:線程
每個虛擬機(guest)在Host上都被模擬爲一個QEMU進程,即emulation進程。
咱們建立一個虛擬機後,用普通的ps 命令就能夠查看到。3d
➜ ~ virsh list --all Id Name State ---------------------------------------------------- 1 kvm-01 running ➜ ~ ps aux | grep qemu libvirt+ 20308 15.1 7.5 5023928 595884 ? Sl 17:29 0:10 /usr/bin/qemu-system-x86_64 -name kvm-01 -S -machine pc-i440fx-wily,accel=kvm,usb=off -m 2048 -realtime mlock=off -smp 2 qemu ....
能夠看到,此虛擬機就是一個普通的Linux進程,他有本身的pid。而且有四個線程,線程數量不是固定的,可是至少會有三個(vCPU,IO,Signal)。其中有兩個是vCPU線程,有一個IO線程還有一個信號處理線程。code
➜ ~ pstree -p 20308 qemu-system-x86(20308)-+-{qemu-system-x86}(20353) |-{qemu-system-x86}(20408) |-{qemu-system-x86}(20409) |-{qemu-system-x86}(20412)
guest的全部用戶級別(user)的指令集,都會直接由宿主機線程執行,此線程會調用KVM的ioctl方式提供的接口加載guest的指令並在特殊的CPU模式下運行,不須要通過CPU指令集的軟件模擬轉換,大大的減小了虛擬化成本,這也是KVM優於其餘虛擬化方式的點之一。blog
KVM向外提供了一個虛擬設備/dev/kvm,經過ioctl(IO設備帶外管理接口)來對KVM進行操做,包括虛擬機的初始化,分配內存,指令加載等等。繼承
guest做爲一個進程存在,固然他的內核的全部驅動等都存在,只是硬件被QEMU所模擬(後面介紹virtio的時候特殊)。guest的全部硬件操做都會有QEMU來接管,QEMU負責與真實的宿主機硬件打交道。接口
guest的內存在host上由emulator提供,對emulator來講,guest訪問的內存就是他的虛擬地址空間,guest上須要通過一次虛擬地址到物理地址的轉換,轉換到guest的物理地址其實也就是emulator的虛擬地址,emulator再次通過一次轉換,轉換爲host的物理地址。後面會有介紹各類虛擬化的優化手段,這裏只是作一個overview。進程