當(dāng)你安裝了一臺 Linux约啊,想啟動一個 KVM 虛擬機(jī)的時候,你會發(fā)現(xiàn)需要安裝不同的軟件取董,啟動虛擬機(jī)的時候棍苹,有多種方法:
- virsh start
- kvm 命令
- qemu 命令
- qemu-kvm 命令
- qemu-system-x86_64 命令
QEMU
首先看 qemu,其中關(guān)鍵字 emu茵汰,全稱 emulator枢里,模擬器,所以單純使用 qemu 是采用的完全虛擬化的模式。
Qemu 向 Guest OS 模擬 CPU栏豺,也模擬其他的硬件彬碱,GuestOS 認(rèn)為自己和硬件直接打交道,其實是同 Qemu 模擬出來的硬件打交道奥洼,Qemu 將這些指令轉(zhuǎn)譯給真正的硬件巷疼。由于所有的指令都要從 Qemu 里面過一手,因而性能比較差灵奖。
完全虛擬化是非常慢的嚼沿,所以要使用硬件輔助虛擬化技術(shù) Intel-VT,AMD-V瓷患,所以需要 CPU 硬件開啟這個標(biāo)志位骡尽,一般在 BIOS 里面設(shè)置。查看是否開啟
# 對于Intel CPU 可用命令判斷
grep "vmx" /proc/cpuinfo
# 對于AMD CPU 可用命令判斷
grep "svm" /proc/cpuinfo
當(dāng)確認(rèn)開始了標(biāo)志位之后擅编,通過 KVM攀细,GuestOS 的 CPU 指令不用經(jīng)過 Qemu 轉(zhuǎn)譯,直接運行爱态,大大提高了速度谭贪。
所以 KVM 在內(nèi)核里面需要有一個模塊,來設(shè)置當(dāng)前 CPU 是 Guest OS 在用锦担,還是 Host OS 在用俭识。
KVM
基于內(nèi)核的虛擬機(jī)(英語:Kernel-based Virtual Machine,縮寫為 KVM)是一種用于 Linux 內(nèi)核中的虛擬化基礎(chǔ)設(shè)施吆豹,可將 Linux 內(nèi)核轉(zhuǎn)化為一個虛擬機(jī)監(jiān)視器鱼的。
KVM 提供抽象的設(shè)備理盆,但不模擬處理器痘煤。它開放了/dev/kvm 接口,供用戶模式的主機(jī)使用猿规。
qemu-kvm
Qemu 將 KVM 整合進(jìn)來衷快,通過 ioctl 調(diào)用/dev/kvm 接口,將有關(guān) CPU 指令的部分交由內(nèi)核模塊來做姨俩,就是 qemu-kvm (qemu-system-XXX)
qemu 和 kvm 整合之后蘸拔,CPU 的性能問題解決了,另外 Qemu 還會模擬其他的硬件环葵,如 Network, Disk调窍,同樣全虛擬化的方式也會影響這些設(shè)備的性能。
于是 qemu 采取半虛擬化或者類虛擬化的方式张遭,讓 Guest OS 加載特殊的驅(qū)動來做這件事情邓萨。
例如網(wǎng)絡(luò)需要加載 virtio_net,存儲需要加載 virtio_blk,Guest 需要安裝這些半虛擬化驅(qū)動缔恳,GuestOS 知道自己是虛擬機(jī)宝剖,所以數(shù)據(jù)直接發(fā)送給半虛擬化設(shè)備,經(jīng)過特殊處理歉甚,例如排隊万细,緩存,批量處理等性能優(yōu)化方式纸泄,最終發(fā)送給真正的硬件赖钞,一定程度上提高了性能。
virsh
然而直接用 qemu
或者 qemu-kvm
或者 qemu-system-xxx
的少聘裁,大多數(shù)還是通過 virsh
啟動仁烹, virsh
屬于 libvirt
工具, libvirt
是目前使用最為廣泛的對 KVM
虛擬機(jī)進(jìn)行管理的工具和 API
咧虎,可不止管理 KVM卓缰。
Libvirt
分服務(wù)端和客戶端, Libvirtd
是一個 daemon 進(jìn)程砰诵,是服務(wù)端征唬,可以被本地的 virsh 調(diào)用,也可以被遠(yuǎn)程的 virsh 調(diào)用茁彭,virsh 相當(dāng)于客戶端总寒。
Libvirtd 調(diào)用 qemu-kvm
操作虛擬機(jī),有關(guān) CPU 虛擬化的部分理肺,qemu-kvm 調(diào)用 kvm
的內(nèi)核模塊來實現(xiàn)
這下子摄闸,整個相互關(guān)系才搞清楚了。