美文网首页
KVM简单学习

KVM简单学习

作者: 越狱的灵感 | 来源:发表于2024-05-30 16:52 被阅读0次

    前言

    KVM 全称是 Kernel-Based Virtual Machine,基于linux内核的虚拟化技术,现大数据业务需要支持适配云公司国产化ctyunos,这里使用KVM本地模拟虚机交付,记录下使用过程。

    KVM架构

    image.png
    一些说明
    0,虚拟化是云计算的基础。一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等)做虚拟化、将虚拟化后的整体做为一个可供分割且组合的操作系统。
    1,KVM全称是Kernel-Based Virtual Machine。KVM基于Linux内核实现,属于半虚拟化的Hypervisor。KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存,而Qemu则协助提供IO设备半虚拟化,用于虚拟磁盘IO和网络IO等。不过IO设备的虚拟化方向都是往直接透传到宿主机的方向走,比如vhost-net,直接在硬件或内核级别支持。
    2,一个 KVM虚机在宿主机中其实是一个qemu-kvm进程。而每个虚机中的vCPU则为宿主机中的一个线程。
    3,大名鼎鼎的OpenStack底层也使用Libvirt,Libvirt是KVM的管理工具,还可以管理Xen,VirtualBox等Hypervisor。Libvirt包含3个东西:后台daemon服务libvirtd、API 库和命令行工具 virsh。
    4,虚机的vCPU总数可以超过物理CPU数量,这个叫CPU overcommit(超配)。

    虚拟化原理

    CPU虚拟化

    image.png

    一些说明
    1,一个 KVM虚机在宿主机中其实是一个qemu-kvm进程。而每个虚机中的vCPU则为宿主机中的一个线程。
    2, KVM 允许CPU overcommit(超配:虚机的vCPU总数可以超过物理CPU数量),适当overcommit虚机能够充分利用宿主机的CPU,过大的负载反而会影响整体性能。

    内存虚拟化

    影子页面SPT

    image.png

    一些说明
    1,影子页表SPT由KVM维护,实际上就是一个 Guest页表到Host页表的映射。直接将GVA转换为HPA。
    2,影子页表SPT优点在于当需要访问物理内存的时候,只会经过一层影子页表的转换。而缺点在于需要为Guest的每个进程都维护一个影子页表,这将带来很大的内存开销。同时影子页表的建立是很耗时的,如果 Guest 的进程过多,将导致影子页表频繁切换。

    EPT和NPT

    image.png

    一些说明
    1,Intel的EPT(Extent Page Table)技术和AMD的 NPT(Nest Page Table)技术都是在硬件层面上实现GVA到HPA之间的转换。采用了在两级页表结构,Guest OS页表维护GVA->GPA,EPT页表来维护GPA->HPA映射。
    2,原来是HVA->HPA由HostOS完成的映射由EPT直接完成GPA->HPA,EPTP负责指向EPT。
    3,EPT/NPT地址转化直接由硬件(MMU)查页表完成,大大提升了效率,且只需为Guest维护一份EPT页表,减少内存的开销。

    VirtIO

    QEMU主要负责虚拟设备IO,而QEMU和核心则为VirtIO,VirtIO设计目标是在虚拟化环境下提供与物理设备相近的 I/O 功能和性能,并且避免在虚拟机中安装额外的驱动程序。VirtIO是用半虚拟化,相较于最先QEMU版本的全虚拟化,性能有很大的提升。

    模块组成

    image.png

    一些说明
    1,VirtIO-Block(块设备):提供虚拟磁盘设备的接口。
    2,VirtIO-Net(网络设备):提供虚拟网络设备的接口。
    3,VirtIO-Serial(串口设备):提供虚拟串口设备的接口。
    4,VirtIO-Memory(内存设备):提供虚拟内存设备的接口。
    5,VirtIO-Input(输入设备):提供虚拟输入设备的接口。
    6,VirtIO-SCSI、VirtIO-NVMe、VirtIO-GPU、VirtIO-FS、VirtIO-VSock 等等虚拟设备类型和协议。

    技术原理

    image.png

    一些说明
    1,VirtIO使用前后端架构,包括前端驱动(Guest OS Kernel内部 VirtIO Driver),后端设备(QEMU设备 VirtIO Device),传输协议(vring)。
    2,VirtIO 相当于QEMU实现的全虚拟化,因为直接和Hypervisor中的虚拟化设备交互,避免了CPU在VM Exit和VM Entry之间频繁陷入陷出,性能有较大的提升。且提供了一套统一的虚拟设备接口标准。
    3,不过当前IO设备虚拟化的方向当前主要往IO透传的方向发展了,绕开QEMU直接对接硬件的虚拟化能力,比如Intel VT-d和SR-IOV,基本能达到宿主机的吞吐能力。

    块IO虚拟化

    virtio-block块IO虚拟化同样是virtio-x虚拟化的子模块。

    image.png
    一些说明
    1,virtio-block的流程需要经过两次IO协议栈,在Guest和Host主机中都要走完整的VFS IO协议栈。
    2,官方提供了vhost-blk方案,不过没有合并到主分支,当前方案和vhost-user网络一样,直接走了内核,性能能大大提高,需要的可以了解下,当前业内比较成熟的。
    3,业内成熟的虚拟存储IO栈的软件为SPDK(Storage Performance Development Kit),提供了一整套工具和库,以实现高性能、扩展性强、全用户态的存储应用程序,需要的可以了解下。

    网络虚拟化

    网络虚拟化是虚拟化技术中最复杂的部分。存在virtio-net,vhost-net,vhost-user+DPDKvDPA等方案。这里只简单说下virtio-net(半虚拟化),vhost-net(透传)。

    image.png
    image.png
    一些说明
    1,virtio-net为半虚拟化方案,相对于qemu的全虚拟化,virtio-net通过在Guest OS的VirtIO Net Driver层引入了vring与qemu-kvm层VirtIO Net Device进行通信,降低了VM exit和VM entry的开销,一定程度上改善了网络IO的性能。vhost-net则为透传方案,相对于virtio-net半虚拟化绕过了QEMU直接在Guest OS和host宿主机之间通信,减少了数据的拷贝,特别是减少了用户态到内核态的拷贝。性能得到大大加强,就吞吐量来说,vhost-net基本能够跑满一台物理机的带宽。
    2,生产环境中一般使用DPDK和vDPA结合OVS(Open vSwitch)使用。

    管理工具Libvirt

    libvirt软件包提供了一个独立于虚拟机监控程序的虚拟化API,可与各种操作系统的虚拟化功能进行交互。

    image.png
    image.png
    一些说明
    1,libvirt主要包括3个部分:应用程序编程接口(API)库、一个守护进程(libvirtd)和一个默认命令行管理工具(virsh)。应用程序编程接口(API)库:为了其他虚拟机管理工具(如virsh、virt-manager等)提供虚拟机管理的程序库支持。libvirtd守护进程:负责执行对节点上的域的管理工作,在用各种工具对虚拟机进行管理之时,这个守护进程一定要处于运行状态中。virsh : libvirt项目中默认的对虚拟机管理的一个命令行工具。
    2,一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如 OpenStack、OpenNebula、Eucalyptus 等)都在底层使用 libvirt 的应用程序接口。
    创建CtyunOS虚机
    这里使用virt-manager创建一个CtyunOS的虚机,用于加深学习印象。

    创建CtyunOS虚机

    这里使用virt-manager创建一个CtyunOS的虚机,用于加深学习印象。

    1,安装KVM

    # qemu-kvm -为KVM管理程序提供硬件仿真的软件。
    # libvirt-daemon-system -用于将libvirt守护程序作为系统服务运行的配置文件。
    # libvirt-clients -用于管理虚拟化平台的软件。
    # bridge-utils -一组用于配置以太网桥的命令行工具。
    # virtinst -一组用于创建虚拟机的命令行工具。
    # virt-manager -易于使用的GUI界面和支持命令行工具,用于通过libvirt管理虚拟机。
     
    # 安装
    sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
     
    # qemu-kvm创建软链
    sudo ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
    sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu-kvm
     
    # libvirtd是否启动
    sudo systemctl is-active libvirtd active
     
    # 启动libvirtd
    sudo systemctl start libvirtd.service
     
    # 查看网络信息,建议用默认的net网络即可
    brctl show
    

    2,开通CtyunOS实例

    a)打开virt-manager

    image.png

    b)选择对应的安装介质,配置安装的资源

    image.png
    image.png

    c)设置安装的系统信息

    image.png

    d)安装系统

    image.png

    e)系统安装完成

    image.png

    f)配置网络

    image.png
    # 配置网络
    vi /etc/sysconf iq/network-scripts/ifcfg-ens3
    # 修改ONBOOT=yes后重启网络
    systemctl restart network
     
    # 安装sshd
    yum install -y initscripts openssh-server openssl openssl-devel
    service sshd restart
    ss -tan
     
    # 查看虚机ip,当然也可以到wirt-manager的虚机详情nic页面查看
    virsh domiffadr ctyunos-test
    

    安装配置配置好sshd服务后,即可愉快玩耍ctyunos虚拟机了。

    常用命令

    # virsh 查看帮助命令
    virsh help | grep dom*
     
    # 查看当前运行的虚拟机
    virsh list
    virsh list --all
     
    # 创建一个虚拟机
    sudo virt-install --virt-type kvm --name ctyunsos-100 --ram 2048 \
    --disk /var/lib/libvirt/images/ctyunsos-100.qcow2,format=qcow2 \
    --network network=default \
    --graphics vnc,listen=0.0.0.0 --noautoconsole \
    --os-type=linux --os-variant=ctyunsos2.0.1 \
    --location=/data/kvm/images/ctyunos-2.0.1-220311-x86_64-dvd.iso
     
    # 开启和关闭虚拟机 ,ctyunsos-100 是虚拟机名字
    virsh start ctyunsos-100      
    virsh shutdown ctyunsos-100
     
    # 进入查看虚拟机
    virt-viewer ctyunsos-100
      
    # libvirtd 启动时自动启动虚拟机
    virsh autostart ctyunsos-100
     
    # 禁止虚拟机开机启动
    virsh autostart --disable ctyunsos-100
     
    # 查看虚拟机IP
    virsh domifaddr ctyunsos-100
     
    # 挂起/恢复虚拟机
    virsh suspend ctyunsos-100
    virsh resume ctyunsos-100
     
    # 查看虚拟机信息
    virsh dominfo ctyunsos-100
     
    # 软重启虚拟机
    virsh reboot ctyunsos-100
     
    # 硬重启虚拟机
    virsh reset ctyunsos-100
     
    # 销毁拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘
    virsh undefine ctyunsos-100
     
    # 编辑虚拟机配置文件
    virsh edit ctyunsos-100
     
    # 给虚拟机添加硬盘,创建一块 100G 的硬盘
    qemu-img create -f qcow2 ctyunsos-100-d1.qcow2 20G
     
    # 创建快照, 不写 name 自动按时间生成
    virsh snapshot-create-as --domain ctyunsos-100 --name snapshot01-ctyunsos-100 --description "ctyunsos-100 snapshot" 
     
    # 查看快照
    virsh snapshot-list ctyunsos-100
     
    # 回滚快照
    ## 回滚名称位 snap-vm-ubuntu 的快照
    virsh snapshot-revert --domain vm-ubuntu snapshot01-ctyunsos-100
     
    ## 回滚最新版快照
    virsh snapshot-revert --domain ctyunsos-100 --current
     
    # clone一个虚拟机
    virt-clone --original=ctyunsos-100 --name=ctyunsos-100-new  --file=/var/lib/libvirt/images/ctyunsos-100-new.qcow2
     
    # 查看虚拟机内存和cpu信息
    virsh dommemstat  ctyunsos-100
    virsh  vcpuinfo  ctyunsos-100
    

    虚拟机技术发展

    虚拟机技术的思想源头来源于1974年7月的论文《Formal Requirements for Virtualizable Third-Generation Architectures》。经过这么多年的发展,从最先开始的全虚拟化,半虚拟化(XEN),硬件辅助虚拟化(Intel VT-X/AMD-V),KVM/VirtualBox/Hyper-V,容器化技术LXC&Docker(cgroup&namespace),到当前的microVM和functions技术(firecracker)。已经有了很大的发展。

    image.png
    一些说明
    1,全虚拟化技术,比如QEMU,主要由HyperVisor将虚拟机的命令翻译成宿主机上能执行的命令,性能很差。
    2,半虚拟化技术,比如Xen,在内核加一些接口,接受虚拟机传入内核接口命令,功能和风险较大,需要修改内核。
    3,硬件辅助虚拟化技术,最有效的有KVM/Hyper-V,使用Intel VT-X/AMD-V技术CPU直接接收虚拟机的命令,避免的解释和翻译命令的过程,性能大大提高。
    4,容器化技术,比如Docker,在微服务的发展下,不需要像KVM一样虚拟化出一个有操作系统,有IO等设备的完整机器,基于Cgroups和namespace,隔离出一个独立的操作系统和网络环境,给应用提供简约的运行环境,虚拟化成本大大减少,提供更轻量级的虚拟化方案。
    5,超轻虚拟化技术,比如firecracker,在基于KVM和VirtIO,构建MicroVM Zone。提供毫秒级的VM创建速度,是一个更精简、更安全、更现代化的虚拟化技术方向。

    总结

    1,虚拟化技术的发展,大大推动了云技术的进步。
    2,虚拟化技术从论文《Formal Requirements for Virtualizable Third-Generation Architectures》到现在的serverless以及firecracker代表的microVMs技术,越来越往功能化,小型简单化,高安全,低成本的方向发展了。
    3,从云计算的角度来看,kvm虚拟技术属于IaaS层的产品,给客户提供完整一套基础设施,客户可以用这个kvm虚机做任何事情,而代表LXC的Docker容器技术则属于PaaS层的产品,为特定的软件服务提供特定的服务,比如MySQL images,而这个MySQL images容器只能用于MySQL服务,而不能再这个容器里面在用于跑其他的服务,比如Redis。

    相关文章

      网友评论

          本文标题:KVM简单学习

          本文链接:https://www.haomeiwen.com/subject/avlrqjtx.html