关于kvm知识做一次简单梳理回顾,首先了解kvm是什么?

kvm的全称是Kernel-based Virtual Machine,从字面意思理解是基于kernel内核的虚拟机,其实是Linux内核模块,此模块在系统中的表现为虚拟字符设备/dev/kvm,使得Linux kernel工作表现为hypervisor一个管理程序,在用户空间可通过系统调用API,与内核中的kvm模块交互,,从而完成虚拟机的创建,启动,停止,删除等各种管理功能,我们通常不能直接利用API做管理,于是工作在用户空间的qume-kvm进程担负了与用户交互的职责,由她来负责与内核模块交互。

值得注意的是,此模块从 Linux 2.6.20 版本作为模块被包含在 Linux 内核中,且需要支持虚拟化扩展的 CPU。
kvm是redhat公司完全开源的虚拟化技术,官网(http://www.linux-kvm.org)中这样描述:

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)。

接下来看,如何快速简单使用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

查看模块:

    # lsmod |grep kvm 可看到如下模块则已经加载成功
        kvm_intel             170181  0 
        kvm                   554609  1 kvm_intel
        irqbypass              13503  1 kvm

查看是否输出为设备接口:

    # ls /dev/kvm 查看是否是将内核模块输出为一个字符设备,彻底沦为hypervisor管理接口

内核模块准备就绪,安装用户空间所需的交互管理组件?

# 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工作顺利,永不宕机!