[原] KVM 虛擬化原理探究(1)— overview

KVM 虛擬化原理探究— overview

標籤(空格分隔): KVM網絡


寫在前面的話

本文不介紹kvm和qemu的基本安裝操做,但願讀者具備必定的KVM實踐經驗。同時但願藉此系列博客,可以對KVM底層有一些清晰直觀的認識,固然我沒有通讀KVM的源碼,文中的內容一部分來自於書籍和資料,一部分來自於實踐,還有一些來自於本身的理解,確定會有一些理解的誤差,歡迎討論並指正。本系列文章敬表明我我的觀點和實踐,不表明公司層面。架構

KVM虛擬化簡介

KVM 全稱 kernel-based virtual machine,由Qumranet公司發起,2008年被RedHat收購。
KVM實現主要基於Intel-V或者AMD-V提供的虛擬化平臺,利用普通的Linux進程運行於虛擬態的指令集,模擬虛擬機監視器和CPU。KVM不提供硬件虛擬化操做,其IO操做等都藉助QEMU來完成。優化

image_1apkng413147jg181jlq1j3kjhsm.png-16.4kB

KVM有以下特色:線程

  • guest做爲一個普通進程運行於宿主機
  • guest的CPU(vCPU)做爲進程的線程存在,並受到宿主機內核的調度
  • guest繼承了宿主機內核的一些屬性,好比huge pages(大頁表)
  • guest的磁盤IO和網絡IO會受到宿主機的設置的影響
  • guest經過宿主機上的虛擬網橋與外部相連

KVM總體架構

image_1apknjokv7q91f5cif312h6jpu13.png-122.4kB

每個虛擬機(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)

虛擬CPU

guest的全部用戶級別(user)的指令集,都會直接由宿主機線程執行,此線程會調用KVM的ioctl方式提供的接口加載guest的指令並在特殊的CPU模式下運行,不須要通過CPU指令集的軟件模擬轉換,大大的減小了虛擬化成本,這也是KVM優於其餘虛擬化方式的點之一。blog

KVM向外提供了一個虛擬設備/dev/kvm,經過ioctl(IO設備帶外管理接口)來對KVM進行操做,包括虛擬機的初始化,分配內存,指令加載等等。繼承

虛擬IO設備

guest做爲一個進程存在,固然他的內核的全部驅動等都存在,只是硬件被QEMU所模擬(後面介紹virtio的時候特殊)。guest的全部硬件操做都會有QEMU來接管,QEMU負責與真實的宿主機硬件打交道。接口

虛擬內存

guest的內存在host上由emulator提供,對emulator來講,guest訪問的內存就是他的虛擬地址空間,guest上須要通過一次虛擬地址到物理地址的轉換,轉換到guest的物理地址其實也就是emulator的虛擬地址,emulator再次通過一次轉換,轉換爲host的物理地址。後面會有介紹各類虛擬化的優化手段,這裏只是作一個overview。進程

相關文章
相關標籤/搜索