What's QEMU
QEMU是一個(gè)主機(jī)上的VMM(virtual machine monitor),通過動(dòng)態(tài)二進(jìn)制轉(zhuǎn)換來模擬CPU松捉,并提供一系列的硬件模型,使guest os認(rèn)為自己和硬件直接打交道搁吓,其實(shí)是同QEMU模擬出來的硬件打交道,QEMU再將這些指令翻譯給真正硬件進(jìn)行操作。通過這種模式俊嗽,guest os可以和主機(jī)上的硬盤,網(wǎng)卡铃彰,CPU绍豁,CD-ROM,音頻設(shè)備和USB設(shè)備進(jìn)行交互牙捉。但由于所有指令都需要經(jīng)過QEMU來翻譯竹揍,因而性能會(huì)比較差:
What's KVM?
KVM實(shí)際是linux內(nèi)核提供的虛擬化架構(gòu),可將內(nèi)核直接充當(dāng)hypervisor來使用邪铲。KVM需要處理器硬件本身支持虛擬化擴(kuò)展芬位,如intel VT 和AMD AMD-V技術(shù)。KVM自2.6.20版本后已合入主干并發(fā)行带到,除此之外晶衷,還以模塊形式被移植到FreeBSD和illumos中。除了支持x86的處理器,同時(shí)也支持S/390,PowerPC,IA-61以及ARM等平臺(tái)晌纫。
工作原理
KVM包含一個(gè)內(nèi)核模塊kvm.ko用來實(shí)現(xiàn)核心虛擬化功能税迷,以及一個(gè)和處理器強(qiáng)相關(guān)的模塊如kvm-intel.ko或kvm-amd.ko。KVM本身不實(shí)現(xiàn)任何模擬锹漱,僅僅是暴露了一個(gè)/dev/kvm接口箭养,這個(gè)接口可被宿主機(jī)用來主要負(fù)責(zé)vCPU的創(chuàng)建,虛擬內(nèi)存的地址空間分配哥牍,vCPU寄存器的讀寫以及vCPU的運(yùn)行毕泌。有了KVM以后,guest os的CPU指令不用再經(jīng)過QEMU來轉(zhuǎn)譯便可直接運(yùn)行嗅辣,大大提高了運(yùn)行速度撼泛。但KVM的kvm.ko本身只提供了CPU和內(nèi)存的虛擬化,所以它必須結(jié)合QEMU才能構(gòu)成一個(gè)完整的虛擬化技術(shù)澡谭,也就是下面要介紹的技術(shù)愿题。
What's QEMU-KVM
從前面的介紹可知,KVM負(fù)責(zé)cpu虛擬化+內(nèi)存虛擬化蛙奖,實(shí)現(xiàn)了cpu和內(nèi)存的虛擬化潘酗,但kvm并不能模擬其他設(shè)備,還必須有個(gè)運(yùn)行在用戶空間的工具才行雁仲。KVM的開發(fā)者選擇了比較成熟的開源虛擬化軟件QEMU來作為這個(gè)工具仔夺,QEMU模擬IO設(shè)備(網(wǎng)卡,磁盤等)攒砖,對(duì)其進(jìn)行了修改缸兔,最后形成了QEMU-KVM。
在QEMU-KVM中吹艇,KVM運(yùn)行在內(nèi)核空間惰蜜,QEMU運(yùn)行在用戶空間,實(shí)際模擬創(chuàng)建掐暮、管理各種虛擬硬件,QEMU將KVM整合了進(jìn)來政钟,通過/ioctl 調(diào)用 /dev/kvm路克,從而將CPU指令的部分交給內(nèi)核模塊來做,KVM實(shí)現(xiàn)了CPU和內(nèi)存的虛擬化养交,但KVM不能虛擬其他硬件設(shè)備精算,因此qemu還有模擬IO設(shè)備(磁盤,網(wǎng)卡碎连,顯卡等)的作用灰羽,KVM加上QEMU后就是完整意義上的服務(wù)器虛擬化。
綜上所述,QEMU-KVM具有兩大作用:
提供對(duì)cpu廉嚼,內(nèi)存(KVM負(fù)責(zé))玫镐,IO設(shè)備(QEMU負(fù)責(zé))的虛擬
對(duì)各種虛擬設(shè)備的創(chuàng)建,調(diào)用進(jìn)行管理(QEMU負(fù)責(zé))
這個(gè)方案中怠噪,QEMU模擬其他的硬件恐似,如Network, Disk,同樣會(huì)影響這些設(shè)備的性能傍念。于是又產(chǎn)生了pass through半虛擬化設(shè)備virtio_blk, virtio_net矫夷,提高設(shè)備性能。
QEMU-KVM憋槐,是QEMU的一個(gè)特定于KVM加速模塊的分支双藕,里面包含了很多關(guān)于KVM的特定代碼,與KVM模塊一起配合使用阳仔。
目前QEMU-KVM已經(jīng)與QEMU合二為一忧陪,所有特定于KVM的代碼也都合入了QEMU,當(dāng)需要與KVM模塊配合使用的時(shí)候驳概,只需要在QEMU命令行加上 --enable-kvm就可以赤嚼。