kvm的全稱是Kernel-based Virtual Machine,從字面意思理解是基於kernel內核的虛擬機,實際上是Linux內核模塊,此模塊在系統中的表現爲虛擬字符設備/dev/kvm,使得Linux kernel工做表現爲hypervisor一個管理程序,在用戶空間可經過系統調用API,與內核中的kvm模塊交互,,從而完成虛擬機的建立,啓動,中止,刪除等各類管理功能,咱們一般不能直接利用API作管理,因而工做在用戶空間的qume-kvm進程擔負了與用戶交互的職責,由她來負責與內核模塊交互。python
值得注意的是,此模塊從 Linux 2.6.20 版本做爲模塊被包含在 Linux 內核中,且須要支持虛擬化擴展的 CPU。
kvm是redhat公司徹底開源的虛擬化技術,官網(http://www.linux-kvm.org)中這樣描述:linux
Here is the setup which is used with kvm and qemu. Qemu can run as standalone, with kqemu module or with kvm module. In normal mode, only the user code is executed directly and the kernel code is still dynamically translated by QEMU.When KQEMU runs in full virtualization mode, both guest kernel and user code are executed directly on the host CPU. When run with kvm module, the CPU extensions (svm or vmx) are used.
意思說這是與kvm和qemu一塊兒使用。 Qemu能夠獨立運行,使用kqemu模塊或kvm模塊。 在正常模式下,僅直接執行用戶指令,內核指令仍然由QEMU動態翻譯。 當KQEMU以徹底虛擬化模式運行時,客戶端內核和用戶代碼都將直接在主機CPU上執行。 當使用kvm模塊運行時,將使用CPU擴展(svm或vmx)。api
查看內核中是否支持官方所要求的cpu虛擬化:網絡
# grep -E -i "(svm|vmx)" /proc/cpuinfo 只要出現svm或vmx字樣便可 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave a vx f16c rdrand hypervisor lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt
查看模塊信息:架構
# modinfo kvm 查看是否存在 license: GPL author: Qumranet rhelversion: 7.3 srcversion: F0E855E5535DA469A9D8C37 depends: irqbypass intree: Y vermagic: 3.10.0-514.el7.x86_64 SMP mod_unload modversions signer: CentOS Linux kernel signing key
加載模塊:框架
# modprobe kvm
查看模塊:jvm
# lsmod |grep kvm 可看到以下模塊則已經加載成功 kvm_intel 170181 0 kvm 554609 1 kvm_intel irqbypass 13503 1 kvm
查看是否輸出爲設備接口:tcp
# ls /dev/kvm 查看是不是將內核模塊輸出爲一個字符設備,完全淪爲hypervisor管理接口
內核模塊準備就緒,安裝用戶空間所需的交互管理組件?ide
# yum info qemu-kvm 或 # yum install kvm libvirt python-virtinst qemu-kvm virt-viewer bridge-utils
安裝圖形化管理組件virt-manager工具
#yum install libvirt libvirt-daemon-kvm virt-manager 會自動依賴qemu-kvm,第一步啓動deamon
查看是否安裝libvirt-daemon:
# rpm -ql libvirt-daemon 存在以下輸出即爲安裝成功 /etc/libvirt /etc/libvirt/libvirtd.conf /etc/libvirt/virtlockd.conf /etc/libvirt/virtlogd.conf /etc/logrotate.d/libvirtd /etc/sysconfig/libvirtd /etc/sysconfig/virtlockd /etc/sysconfig/virtlogd /usr/lib/sysctl.d/60-libvirtd.conf /usr/lib/systemd/system/libvirtd.service
啓動libvirt-daemon進程:
# systemctl restart libvirtd.service
查看ifconfig信息生成一個橋,nat功能橋:
# ifconfig 查看是否存在virbr0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:9f:ca:ce txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
查看iptables規則會生成一些nat規則MASQUERADE地址假裝
# iptables -vnL 查看關於virbr0的一些自動生成的規則 Chain INPUT (policy ACCEPT 1029 packets, 73235 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
若是是您安裝的是圖形化界面,則執行以下命令便可打開圖形化
# virt-manager
1.模擬:Emulation模擬器
qemu,pearpc,bochs
2.徹底虛擬化:full virtualization
bt/kvm
3.半虛擬化:para-virtualization
特色:guestos明確知道運行於虛擬環境 xen,接近於硬件性能
4.庫級別虛擬化
wine
5.程序級虛擬化
jvm,pvm,...
相似openstack雲虛擬:通俗的能夠理解爲一組主機運行虛擬化,監控管理一組主機的虛擬機實例的接口:cloudOs無需關心底層的硬件設施
雲虛擬化的一些分類:
IaaS,PaaS,SaaS...
簡單瞭解kvm虛擬cpu架構:
------------------------------ |Guest Memory | \ | --------------| |Hyper-visor| |VCPU |VCPU | |Process | |Thread|thread| / (thread) | ----↓------↓---------↓-------| | KVM | Linux Kernel | ----↓------↓---------↓-------- | CPU | | CPU | | CPU | ------- ------- ----------
虛擬cpu的表現形式:虛擬機的每一個虛擬cpu核心表現爲物理機的一個thread線程,配置虛擬機CPU核心應與物理機相同最佳,如若多出反而性能降低
kvm詳細架構:
____________________________________ ______________________ |User mode | |Guest mode | | _______ __________________________| /| ____________________ | ||Linux ||Linux Process(VM launcher)| / ||Virtual Machine || ||Process|| ____________ _/—— || __________________ || || || |Guest memory|→|_ |||Guest memory ||| || || |______↓_____| \—— |||______user mode___||| || || | I/O Ops | | \ ||| kernel ||| || || |__↓_____↓___| | \|||________↓_________||| ||_______|| ←-------/ ↓ | ||_________↓__________|| ———————————↓——————————————↓—————————| | ↓ | | __________↓______________↓________ | | ↓ | ||Linux Kernel ______↓___ || | ↓ | || |KVM Dirver|←--------←----------/ | ||__________________________________|| | | |Kernel mode_________________________| |______________________|
由圖中可看kvm內核模塊與用戶空間是如何協同工做的,在原有用戶空間概念的基礎上新增了訪客模式,在訪客模式內存在獨立的用戶及內核空間(爲節省存儲架構圖爲字符手打,可能顯示稍怪異)。
還有一種半虛擬化解決方案?
virtio:redhat主導開源半虛擬化解決框架
virtio-blk(塊虛擬) virtio-net(網絡) virtio-pci virtio-ballon(容量) virtio-console(控制檯半虛擬化) \____________________↓______________/_______________/____________________________/ virtio ↓ transport ↓ virtio backend drivers
KVM管理工具架構:在用戶空間也用於與內核kvm模塊交互的工具不只只有qemu工具,存在一衆其餘組件,好比圖形化的virt-manager。
________________________________________________________________________________ _____ _________ |Virtual Machine ____________________________________________________ ||virsh| |Qemu | | Manager |virtinst ||| | | _ _ _ | | ____________ __________ | ____________ __________ __________ ____________ ||| | ||Q||Q||Q|| ||virt-manager||virt-viwer|||virt-install||virt-clone||virt-p_w_picpath||virt-convert||||__↓__|_ ||u||u||u|| ——————————— | ——libvirt——— —libvirt—— | ——libvirt——— ——libvirt— —libvirt—— ——libvirt——— |||libvirt|||e||e||e|||Guest|Guest| —————↓————————————↓——————————————↓————————————↓———————————↓———————————↓——————————————↓———|||u||u||u|| ——↓—— ——↓—— | libvirtd |||k||i||i|||qemu |qemu | —————————————————————————————————↓———————————————————————————————————————————————————————|||v||m||o|| ——↓—————↓—— | libvirt |||m||g| — | ↓ ↓ | ————————————————————————————————————————————————————————————————————————————————————————————↓——↓——↓—————↓—————↓—— | KVM | —————————————————————————————————————————————————————————————————————————————————————————————————————————————————
最近遇到kvm相關的問題,便將一些虛擬化相關的結構層次的東西梳理回顧一下,主要是思路上的理解。架構圖片爲字符在不一樣的設備可能出現怪異的景象。好記性不如爛筆頭,遇到問題不要怕理性對待,多多總結,理清關係,願普天之下的各位Linuxer工做順利,永不宕機!