kvm2

Linux KVM(基于内核的虚拟机)驱动程序

概述

KVM(基于内核的虚拟机)是 Linux 上 x86 硬件的完整虚拟化解决方案,其中包含虚拟化扩展。为了与 KVM 一起工作,minikube 使用 libvirt 虚拟化 API

要求

  • libvirt v1.3.1 或更高版本
  • qemu-kvm v2.0 或更高版本

安装先决条件

正确安装 KVM 和 libvirt 与每个 Linux 发行版高度相关。请参考

配置完成后,验证 libvirt 是否报告任何错误

virt-host-validate

用法

使用 kvm2 驱动程序启动集群

minikube start --driver=kvm2

使 kvm2 成为默认驱动程序

minikube config set driver kvm2

检查虚拟化支持

要使用 VM 驱动程序,请验证您的系统是否已启用虚拟化支持

grep -E -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no

如果上述命令输出“no”

  • 如果您在 VM 中运行,则您的虚拟机监控程序不允许嵌套虚拟化。您需要使用*None(裸机)*驱动程序
  • 如果您在物理机上运行,请确保您的 BIOS 已启用硬件虚拟化

特殊功能

minikube start 命令支持 5 个额外的 KVM 特定标志

  • --kvm-gpu:在 minikube 中启用实验性的 NVIDIA GPU 支持
  • --hidden:在 minikube 中从访客隐藏虚拟机监控程序签名
  • --kvm-network:KVM 默认网络名称
  • --network:专用的 KVM 私有网络名称
  • --kvm-qemu-uri:KVM qemu uri,默认为 qemu:///system

问题

  • 如果用户不在正确的 libvirt 组中,则 minikube 将重复请求 root 密码 #3467
  • 当防火墙阻止 VM 网络访问时,出现 Machine didn't return an IP after 120 seconds #3566
  • qemu.conf 中的 dynamic ownership = 1 时,出现 unable to set user and group to '65534:992 #4467
  • KVM VM 不能与 VirtualBox 同时使用 #4913
  • 在某些发行版上,libvirt 网桥网络可能在主机重新启动后才能正常工作

另请参阅 co/kvm2-driver 打开的问题

嵌套虚拟化

如果您在嵌套虚拟化环境中运行 KVM,请确保您的配置内核模块正确遵循 教程。

故障排除

  • 运行 id 以确认用户属于 libvirt[d] 组(输出应包含类似于:‘groups=…,108(libvirt),…’ 的条目)。
  • 运行 virsh domcapabilities --virttype="kvm" 以确认主机支持 KVM 虚拟化。
  • 运行 virt-host-validate 并检查建议。
  • 运行 ls -la `which virsh`, virsh uri, sudo virsh net-list --allip a s 以收集其他调试信息。
  • 运行 minikube start --alsologtostderr -v=9 以调试崩溃。
  • 运行 docker-machine-driver-kvm2 version 以验证 kvm2 驱动程序是否正确执行。
  • 阅读 如何调试虚拟化问题

KVM/libvirt 网络故障排除

在大多数情况下,minikube 将尝试检测并为您解决 KVM/libvirt 网络的任何问题。但是,在某些情况下,需要手动干预,主要是因为需要 root 权限。

  1. 运行 sudo virsh net-list --all 以列出所有接口。

示例输出

 Name                     State    Autostart   Persistent
-----------------------------------------------------------
 default                  active   yes         yes
 mk-kvm0                  active   yes         yes
 mk-minikube              active   yes         yes
 my-custom-kvm-priv-net   active   yes         yes

其中

  • default 是默认的 libvirt 网络,
  • mk-kvm0 是为 minikube kvm0 配置文件创建的默认 libvirt 网络(例如,使用 minikube start -p kvm0 --driver=kvm2),
  • mk-minikube 是为默认 minikube 配置文件创建的网络(例如,使用 minikube start --driver=kvm2)并且
  • my-custom-kvm-priv-net 是为 minikube 配置文件提供的自定义私有网络名称(例如,使用 minikube start -p kvm1 --driver=kvm2 --network="my-custom-kvm-priv-net")。
  1. 运行 sudo virsh net-autostart <network> 以手动将 network 设置为自动启动(如果尚未设置)。

  2. 运行 sudo virsh net-start <network> 以手动启动/激活 network(如果尚未启动/激活)。

    1. 如果 default libvirt 网络丢失或无法启动/激活 - 请查阅特定于您的操作系统/发行版的 libvirt 文档;以下步骤可能可以帮助您解决问题

      1. 运行 sudo virsh net-dumpxml default > default.xml 以备份 default libvirt 网络配置。
      2. 运行 sudo virsh net-destroy default 以停止 default libvirt 网络。
      3. 运行 sudo virsh net-undefine default 以删除 default libvirt 网络。
      4. 运行 sudo virsh net-define /usr/share/libvirt/networks/default.xml 以重新创建 default libvirt 网络。
        • 注意:重复上述步骤 b.c.,然后运行 sudo virsh net-define default.xml 以恢复原始的 default libvirt 网络配置(以防出现任何问题)。
      5. 运行 sudo virsh net-start default 以启动 default libvirt 网络。
      6. 运行 sudo virsh net-autostart default 以自动启动 default libvirt 网络。
    2. 如果 非默认 libvirt network 无法启动/激活,请使用以下步骤

      1. 运行 sudo virsh net-dumpxml <network> 以转储 XML network 配置 - 注意 bridge name=<bridge>ip address='<address>' netmask='<netmask>' 值。示例输出
      <network connections='1'>
        <name>mk-minikube</name>
        <uuid>cfcb37fb-fd75-4599-825a-14bee5d863f5</uuid>
        <bridge name='virbr1' stp='on' delay='0'/>
        <mac address='52:54:00:80:97:5a'/>
        <dns enable='no'/>
        <ip address='192.168.39.1' netmask='255.255.255.0'>
          <dhcp>
            <range start='192.168.39.2' end='192.168.39.254'/>
          </dhcp>
        </ip>
      </network>
      

      b. 运行 ip -4 -br -o a s 以显示所有分配了 IP 的接口(采用 CIDR 格式),现在将上述 IP addressnetmaskbridge 的 IP 地址网络掩码进行比较。示例输出

      lo               UNKNOWN        127.0.0.1/8
      virbr0           UP             192.168.122.1/24
      wlp113s0         UP             192.168.42.17/24
      br-08ada8d5dfa4  DOWN           172.22.0.1/16
      docker0          DOWN           172.17.0.1/16
      virbr1           UP             192.168.39.1/24
      
      • 如果它们匹配,或者 IP 地址未在任何地方列出:运行 sudo ip link delete <bridge>,然后运行 sudo virsh net-start <network>sudo virsh net-autostart <network>,以让 libvirt 重新创建网桥并 [自动] 启动网络
      • 如果 IP 地址属于另一个接口:其他东西占用了 IP 地址,造成了冲突,您必须确定是什么占用了,然后在两者之间做出选择……
  3. 运行 sudo systemctl restart libvirtdsudo systemctl restart libvirt (取决于您的操作系统/发行版) 来重启 libvirt 守护进程。

希望到现在您已经使 libvirt 网络正常运行,并且您将再次成功运行 minikube。