kvm虛擬化框架結構層次梳理及圖形化的使用

關於kvm知識作一次簡單梳理回顧,首先了解kvm是什麼?

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

接下來看,如何快速簡單使用kvm?

查看內核中是否支持官方所要求的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
kvm虛擬機圖形化的使用,看下效果?

安裝圖形化管理組件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工做順利,永不宕機!

相關文章
相關標籤/搜索