• Qemu-kvm浅析


    一.虚拟化介绍

    X86平台的虚拟化技术中,新引入的虚拟化层通常称为虚拟化监控器(Virtual Machine Monitor,VMM),也叫Hypervisor。在虚拟化中,VMM必须能截获计算元件到物理资源的直接访问,并将其重定向到虚拟资源池中。根据VMM是用纯软件的方法还是利用物理资源提供的机制来“截获重定向”,可分为软件虚拟化和硬件虚拟化。

     

    二:软件虚拟化和硬件虚拟化

    软件虚拟化:QEMU,VMWare

    QEMU采用动态二进制翻译技术,客户机的指令不能再物理机上直接执行,需要通过VMM翻译,再转换成可以在物理机上执行的指令,这通常会产生显著的性能开销,所以QEMU虚拟机用起来是相当慢的,但是QEMU的优点是平台无关性,可以在同一平台模拟不同架构平台的的虚拟机。这么好的优点真的是不应该被这么慢的性能拖住而不被广泛使用,所以后面就搭配KVM一起用,QEMU提供I/OKVM提供对硬件的访问。

    VMWare采用二进制翻译和直接执行相结合的方案。客户机用户空间的代码采用直接执行的方式,客户机的内核代码则采用二进制翻译的方式,我们知道一个程序的大部分时间都是在用户空间来完成的,大大的减少了翻译所占的开销,与QEMU相比,这样做性能会大幅提升,但是失去了跨平台的能力。

    硬件虚拟化:

    说白了就是硬件提供了对特殊指令的截获和重定向的支持,从而提升客户机的性能。

    三.半虚拟化和全虚拟化

    在半虚拟化的方案中,通过改动客户机的操作系统,使客户机知道自己运行在虚拟化环境下,能够与VMM进行协同工作。本质上,半虚拟化弱化了对虚拟机特殊指令的被动截获要求,将其转化为客户机的操作系统主动通知。这个主动通知前提是需要修改客户机的操作系统源代码的。

    全虚拟化:

    全虚拟化为客户机提供了完整的虚x86平台,包括处理器、内存和外设,客户机认为自己运行在硬件之上,性能相对于半虚拟化低。

    随着厂商的cpu对虚拟化的支持越来越好,intel引入Intel-VTAMD引入ADM-V技术,靠硬件辅助的全虚拟化性能越来越好,全虚拟化将成为虚拟化技术的核心

    四.KVM

    KVMkernel-based Virtual Machine)是基于kernel的虚拟机,从Linux 2.6.20开始,KVM就被集成进内核,成为内核的可加载的模块。关于KMV,总结如下:

    1.KVM的模块:

    kvm-intel.ko #for Intel CPU

    kvm-amd.ko #for AMD CPU

    kvm.ko #主要的模块

    当三个模块都加载后,会出现/dev/kvm字符设备,负责qemukvm的通讯

    2. kvm架构中,每个虚拟的CPU显示为一个常规的进程,有Linux调度程序进行调度,享受Linux内核所有的功能

    3. KVM本身不提供模拟,运行在内核,提供CPU和内存的虚拟化,以及客户机的I/O拦截,客户机的I/OKVM拦截后交给QEMU处理,为KVM修改过的QEMU运行在用户空间,提供硬件的I/O虚拟化,通过IOCTL /dev/kvm字符设备和KVM进行交互。

    KVM模块被加载的时候:

    1首先初始化内部的数据结构;

    2做好准备后,KVM 模块检测当前的 CPU,然后打开 CPU 控制及存取 CR4 的虚拟化模式开关,并通过执行 VMXON 指令将宿主操作系统置于虚拟化模式的根模式;

    3最后,KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令

    4. KVM的功能列表:

    1)支持CPUMemory超分(overcommit

    2)支持virtio

    3)支持热插拔(cpu,块设备,网络设备等)

    4)支持SMPSymmetric Multi-Processing对称多处理器系统)

    5)支持实时迁移(Live Migration

    6)支持PCI设备直接分配和单根I/O虚拟化(SR-IOV)

    7)支持内核同页合并(KSM

    8)支持非一致性内存访问(NUMA

    5. KVM工具集合

    1) libvirt: 操作管理kvm虚拟机虚拟化API

    2) Virsh: 基于libvirt命令行工具

    3) Virt-Manager: 基于libvirtGUI工具

    4) Virt-v2v:虚拟机迁移

    5) Virt-*

    6) Svirt: 安全工具

    五.Qemu-KVM的简单安装和使用

    1)查看CPU是否支持虚拟化

    cat /proc/cpuinfo|egrep “vmx|svm”

    2)现在的linux都带有kvm 模块,确保kvm模块正确安装

    ls /dev/kvm

    3) 安装qemu

    yum install qemu*

    或者git clone https://git.qemu.org/git/qemu.git 下载最新的qemu

    或者https://download.qemu.org/来下载想要的版本

    4)创建img 文件,有一般有两种方式

    [a]. dd if=/dev/zero of=rhel7u4.img bs=1M count=8192

    [b]. qemu-img create -f qcow2 rhel7u4.img 8G ; 推荐使用这种方式,这种方式创建出 来的img文件是稀疏文件,也就是刚创建出来并没有8G,会随着数据的增多而增加。

    -f : 磁盘文件格式,一般有rawqcow2, 通常用的较多的是qcow2,相比较raw格式来说,性能虽然差点,但是优点是稀疏文件,并且具有加密、压缩、快照等功能

    格式转换:qemu-img convert -f raw input.img -O qcow2 output.qcow2

    5)将客户机os安装到img中,img可以看成是qemu 客户机启动的硬盘。

    安装:

    Qemu-system-x86_64 -m 2048  -smp 4 -vnc 10.239.181.192:12 -enable-kvm  -boot order=cd -hda /root/kvm/rhel7u4.img -cdrom rhel7.4.iso 

    起guest:

    taskset -c 0-4 qemu-system-x86_64 -name vm2 -enable-kvm -cpu host -smp cores=16,sockets=1, -m 77G -drive file=redhat.img -vnc :12  -netdev tap,id=ipvm1,ifname=tap3,script=/etc/qemu-ifup -device e1000,netdev=ipvm1,id=net0,mac=00:00:02:98:AC:62

    taskset -c 1-4:绑定hostcore,意思是用host1-4 core来起这个guest

      -name vm2 :客户机的名字

    -enable-kvm 开启kvm加速

    -cpu host:客户机cpu 模型

    -smp:客户机cpu

    -m 77G:客户机的内存

    -drive file=/home/redhat.img : 配置驱动器,也可以这样写 -boot order=cd  -hda=redhat.img  -cdrom=redhat.iso

    -vnc :12 开启vnc 5912端口,可以通过该端口连接到客户机,也可以指定ip,例如-vnc  10.10.10.10:12,默认是127.0.0.1

    -netdev tap,id=ipvm1,ifname=tap3,script=/etc/qemu-ifup 这是新版的net配置方式,这句话的意思是创建一个tap型的网络设备,id=ipvm1 这个标识符可以随便取,ifname=tap3 tap设备网卡的名字,script=/etc/qemu-ifup表示在创建的虚拟机的时候会先执行qemu-ifup这个脚本,事实上还有个downscript=/etc/qemu-ifdown,这个是自动调用的,不需要特意去指定,是在结束的时候调用。

    -device e1000,netdev=ipvm1,id=net0,mac=00:00:02:98:AC:62 这个-netdev是在host端创建了一个tap网卡,网卡idipvm1, -device e1000是创建一个千兆的网卡,netdev=ipmi1,是与host端的tap设备网卡相对应的另外一端,id=net0guest端网卡的标识符,mac是指定guest端网卡的mac

    另外有种结合numa node来指定客户端的smp,例如 -smp cores=4,threads=2,socket=2 -numa  node, mem=1Gcpus=0-8,nodeid=0  -numa  node,mem=1G,cpus=9-15,nodeid=1

    更简单的方式也可以写成-smp 16,即指定guestcpu 16 core

    6)启动guest后,按ctrl+alt+2 进入到(qemu)命令行,输入info cpus 可以看到guest cpu对应在host中的线程ID

    另外可以在起qemu的时候加入参数-monitor unix:/tmp/vm0.monitor,server,nowait

    然后在host中输入nc -U /tmp/vm0.monitor也可以进到monitor里

     

    或者在hostps -efL |grep qemu也可以看到

     

    22288qemu启动客户机的进程号,22290-22297是它产生的线程,作为客户机的vCPU在运行。

    7)进程处理器的亲和性和vCPU的绑定

    a. 查看vcpu在哪个core上运行

    [root@xid]# taskset  -p  3963

    pid 3963s current affinity mask: 4

    这个416进制,即0100,即运行在core 3

    或者

    [root@xid]# taskset  -pc  3963

    pid 3963s current affinity core: 3

    -c的参数,就直接表示哪个core,是10进制的

    b. 修改客户机的qemu进程,使其运行在core 4

    [root@xid]# taskset -p 0x8 3963

    pid 3963s current affinity mask: 4

    pid 3963s new affinity mask: 8

    或者

    [root@xid]# taskset -pc  4  3963

    pid 3963s current core : 3

    pid 3963s new affinity core: 4

  • 相关阅读:
    GitHub与Markdown(学习笔记)
    “Another git process seems to be running in this repository...”Git此问题解决
    Git学习笔记--实践(三)
    Git学习笔记--配置(二)
    Java 锁(学习笔记)
    Git学习笔记--历史与安装(一)
    Java 8中Stream API(学习笔记)
    Qt Creator的下载和安装
    获取 wx.getUserInfo 接口后续将不再出现授权弹窗,请注意升级(微信小程序开发)
    大型网站架构技术一览
  • 原文地址:https://www.cnblogs.com/xia-dong/p/11470390.html
Copyright © 2020-2023  润新知