目录

KVM-QEMU-Libvirt介绍

前面的基础章节有提到虚拟化技术通常可以分为三大类,即:网络虚拟化、I/O虚拟化、CPU虚拟化。

其中KVM实现了CPU和内存的虚拟化,QEMU模型I/O设备(网卡、磁盘等),因此KVM+QEMU配合使用实现真正意义上的服务器虚拟化。

Libvirt是一个开源 API 和工具集,主要用于管理虚拟化技术 ,它为多种虚拟化技术提供了统一的接口,能够支持网络管理、资源管理、虚拟机管理等能力。

它通过向Guest OS模拟CPU和其他硬件,让Guest OS认为自己是一台真正的物理机器。Qemu功能强大,能够模拟多种硬件架构和设备,但由于所有的指令都需要Qemu转译给真正的硬件,因此其性能较低。

Linux的内核模块,该功能需要CPU的支持,依赖于硬件辅助虚拟化技术,如:Intel-VT、AMD-V。有了上述技术支持,KVM可以直接使用CPU指令集来运行虚拟机,从而显著提供性能和效率。

内存管理的扩展功能如:EPT、RVI,主要用于提高虚拟机在内存地址转换上的效率,虚拟机可以直接访问内存,无需频繁地进行软件层面的地址转换,减少CPU的开销。

KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问该接口

Qemu将Kvm整合进来,通过ioctl调用访问/dev/kvm接口,将有关CPU指令的部分交由内核模块,Kvm负责CPU虚拟化和内存虚拟化。由于Kvm不能模拟其他设备,因此Qemu模拟I/O设备(网卡、磁盘等),同时也衍生出了半虚拟化设备virtio_blkvirtio_net,以及pass through直通技术,进一步提高设备性能。

[架构图]

它是目前最为广泛的对KVM虚拟机进行管理的工具和API,Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程virsh调用,用于操作Qemu-Kvm虚拟机。

[架构图]

  1. 确认工具安装
sudo apt update

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
  1. 检查服务状态

   root@kwephis8419858:/# sudo systemctl status libvirtd
 libvirtd.service - Virtualization daemon
     Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-09-13 14:08:03 CST; 1 weeks 3 days ago
TriggeredBy:  libvirtd-ro.socket
              libvirtd-admin.socket
              libvirtd.socket
       Docs: man:libvirtd(8)
             https://libvirt.org
   Main PID: 135067 (libvirtd)
      Tasks: 20 (limit: 32768)
     Memory: 65.7M
     CGroup: /system.slice/libvirtd.service
             ├─ 87941 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/li>
             ├─ 87942 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/li>
             └─135067 /usr/sbin/libvirtd

Sep 13 14:51:20 kwephis8419858 dnsmasq-dhcp[87941]: DHCPACK(virbr0) 192.168.122.122 52:54:00:2c:a4:3a vm-node1
Sep 13 15:21:20 kwephis8419858 dnsmasq-dhcp[87941]: DHCPREQUEST(virbr0) 192.168.122.122 52:54:00:2c:a4:3a

倘若没有运行,可以执行以下命令启动它:sudo systemctl status libvirtd

  1. 分配磁盘

    qemu-img create -f qcow2 /path/to/vm_disk.qcow2 10G
    • f:指定了创建镜像的格式,如:raw、vmdk、vhd等
    qemu-img create -f qcow2 -o backing_file=/path/to/base_image.qcow2,cluster_size=64K /path/to/new_image.qcow2 10G
    • o:指定特定格式的选项
      • backing_file:指定一个基础镜像文件,新的镜像将基于该文件
      • cluster_size:磁盘映像中存储数据的基本单位 ,默认为 64K。
  2. 下载系统镜像

    Ubuntu镜像:

    https://releases.ubuntu.com/
  3. 确认KVM支持

    root@kwephis8419858:/# egrep -c '(vmx|svm)' /proc/cpuinfo
    0
    ## 返回值为 0,表示你的 CPU 不支持虚拟化,或虚拟化功能在 BIOS 中被禁用
    
    root@kwephis8419858:/# lsmod | grep kvm
    root@kwephis8419858:/# 
    ## 没有输出,说明 KVM 模块可能没有加载

    如果你的 CPU 支持虚拟化,但 KVM 模块未加载,你可能需要启用虚拟化支持

  4. 创建虚拟机

    virt-install --virt-type kvm --name vm-node1 --ram 2048 --cdrom=/data/iso/ubuntu-18.04.6-live-server-amd64.iso --disk=/data/qemu_disk/vm-node1-20G.qcow2,bus=virtio,size=20,format=qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
    • virt-type:指定虚拟化技术,kvm、qemu等
    • ram:指定内存大小(MB)
    • cdrom:指定安装操作系统的ISO文件
    • disk:指定虚拟磁盘路径;bus总线使用virtio,大小为20G
    • network:虚拟机连接到的虚拟网络
    • graphics:启用VNC图形界面,允许任何IP地址连接
    • noautoconsole:创建虚拟机后不自动打开控制台

    如果不支持KVM,则可以使用QEMU等..

  1. 查看网络列表

    root@kwephis8419858:/# virsh net-list --all
     Name      State    Autostart   Persistent
    --------------------------------------------
     default   active   yes         yes

    ​ 安装了 libvirt 后,通常会自动创建一个名为 default 的虚拟网络。这个网络是 libvirt 的默认虚拟网络,用于虚拟机之间的通信和与宿主机的网络连接。

  2. 查看详细信息

    root@kwephis8419858:/# virsh net-info default
    Name:           default
    UUID:           8d397a9e-5c04-4505-a970-71b5153f5373
    Active:         yes
    Persistent:     yes
    Autostart:      yes
    Bridge:         virbr0
  3. 启动/禁用/自动启动网络

    root@kwephis8419858:/# virsh net-destroy default
    Network default destroyed
    root@kwephis8419858:/# virsh net-start default
    Network default started
    root@kwephis8419858:/# virsh net-autostart ovsbr
    Network ovsbr marked as autostarted
  4. 定义/删除/修改网络

    root@kwephis8419858:/# virsh net-define /etc/libvirt/qemu/networks/default.xml
    
    root@kwephis8419858:/# virsh net-undefine default
  1. 列出虚拟机

    root@kwephis8419858:/# virsh list --all
     Id   Name       State
    --------------------------
     7    vm-node1   running
  2. 启动/关闭虚拟机

    root@kwephis8419858:/# virsh start vm-node1
    Domain vm-node1 started
    
    root@kwephis8419858:/# virsh shutdown vm-node1
    Domain vm-node1 is being shutdown
  3. 暂停/恢复虚拟机

    root@kwephis8419858:/# virsh suspend vm-node1
    Domain vm-node1 suspended
    
    root@kwephis8419858:/# virsh resume vm-node1
    Domain vm-node1 resumed
  4. 修改/导出虚拟机配置

    root@kwephis8419858:/# virsh edit vm-node1
    Domain vm-node1 XML configuration not changed.
    
    root@kwephis8419858:/# virsh dumpxml vm-node1
  5. 定义/删除虚拟机

    root@kwephis8419858:/# virsh define vm-node1
    root@kwephis8419858:/# virsh undefine vm-node1
  1. 查看状态

    root@kwephis8419858:/# virsh dominfo vm-node1
    Id:             8
    Name:           vm-node1
    UUID:           aa42a9e1-ac6d-43c1-a960-e8540b5ee490
    OS Type:        hvm
    State:          running
    CPU(s):         2
    CPU time:       128.2s
    Max memory:     2097152 KiB
    Used memory:    2097152 KiB
    Persistent:     yes
    Autostart:      disable
    Managed save:   no
    Security model: apparmor
    Security DOI:   0
    Security label: libvirt-aa42a9e1-ac6d-43c1-a960-e8540b5ee490 (enforcing)
  2. 监控性能

    root@kwephis8419858:/# virsh domstats  vm-node1
    Domain: 'vm-node1'
      state.state=1
      state.reason=5
      cpu.time=128954121860
      cpu.user=119840000000
      cpu.system=2880000000
      vcpu.current=2
      vcpu.maximum=2
      ...
      net.count=1
      net.0.name=vnet0
      net.0.rx.bytes=0
      net.0.tx.bytes=3854
      ...
      block.count=2
      block.0.name=vda
      block.0.path=/data/qemu_disk/vm-node1-10G.qcow2

    1)Domain状态

    • state.state: 1 表示虚拟机正在运行
    • state.reason: 5 是状态的具体原因,通常用于调试

    2)CPU使用情况

    • cpu.time: 总 CPU 时间(纳秒)。
    • cpu.user: 用户模式下消耗的 CPU 时间(纳秒)。
    • cpu.system: 内核模式下消耗的 CPU 时间(纳秒)。
    • vcpu.current: 当前虚拟 CPU 数量(2)。
    • vcpu.maximum: 最大虚拟 CPU 数量(2)。

    3)网络统计

    • net.count: 网络接口的数量(1)。
    • net.0.rx.bytes: 接收的字节数(0 表示未接收数据)。
    • net.0.tx.bytes: 发送的字节数(3854 字节)。

    4)磁盘I/O统计

    • block.count: 磁盘设备的数量(2)。
    • block.0.name: 设备名称(vda)。
    • rd.bytes: 读取的字节总数(257787904 字节)。
    • wr.bytes: 写入的字节总数(11457536 字节)。
    • allocation: 分配的空间(2186018816 字节)。
    • capacity: 虚拟磁盘的容量(10GB)。
    • physical: 实际物理空间使用(2186063872 字节)。