KVM 是一种集成到 Linux 内核中的虚拟化技术。如果处理器支持,启用 KVM 的系统可以充当类型 1 管理程序。
有几种方法可以使用 KVM 创建虚拟机。QEMU可以使用 KVM 和libvirt,它的Virtual Machine Manager UI 提供了一个方便的界面。
KVM 可用于在兼容硬件上创建嵌套虚拟机。这使您可以在 VM 内创建 VM,以适应更复杂的用例。考虑在您的主机上运行的虚拟化开发环境。您可能需要在该环境中运行虚拟设备模拟器,在裸机硬件深处嵌套两层。
本文将向您展示如何设置嵌套 KVM 虚拟化并测试其是否正常工作。在继续之前,请检查您是否安装了正常运行的 KVM,并且您熟悉如何创建新的 KVM 虚拟机。
检查嵌套虚拟化是否开启
大多数提供硬件虚拟化的现代处理器系列都支持嵌套虚拟化。您可以通过使用命令读取以下路径之一来检查您的管理程序是否已启用嵌套cat,具体取决于您是否拥有 Intel 或 AMD 系统:
# Intel
$ cat /sys/module/kvm_intel/parameters/nested
# AMD
$ cat /sys/module/kvm_amd/parameters/nested
输出应该是Y或N。看到Y意味着你很高兴 - 嵌套虚拟化已经打开。您可以跳到下面的“为来宾激活嵌套虚拟化”部分。如果您N在终端中看到,是时候在 KVM 的内核模块中启用嵌套了。
启用嵌套虚拟化
嵌套由 KVM 内核模块参数控制。您可以通过编辑更改参数/etc/modprobe.d/qemu-system-x86.conf。在某些系统上,可以调用此文件/etc/modprobe.d/kvm.conf。
您可能会看到类似于以下之一的一行:
options kvm_intel
options kvm_intel nested=0
options kvm_amd
options kvm_amd nested=0
这些变体中的任何一种都意味着 KVM 处于活动状态但嵌套被禁用。
要启用嵌套,只需添加或更改nested参数,使其具有1其值:
# Intel systems only
options kvm_intel nested=1
# AMD systems only
options kvm_amd nested=1
接下来,您需要重新加载 KVM 内核模块以应用您的更改。在执行此操作之前,您应该停止所有正在运行的虚拟机。
# Unload the module
$ sudo modprobe -r kvm_intel
# Reload the module with new settings
$ sudo modprobe kvm_intel
如果您有 AMD 处理器kvm_amd,请替换。kvm_intel
现在重复之前的命令以检查是否启用了嵌套。你应该得到Y作为输出。
# Intel
$ cat /sys/module/kvm_intel/parameters/nested
Y
# AMD
$ cat /sys/module/kvm_amd/parameters/nested
Y
此方法永久启用嵌套虚拟化。它会在重新启动后持续存在,直到您nested=1从 KVM 模块的参数中删除。
为来宾激活嵌套虚拟化
来宾虚拟机只有在配置了支持它的 CPU 模式时才能使用嵌套虚拟化。来宾需要与主机上的物理硬件完全匹配的 CPU 定义。
当 CPU 模式设置为host-model(通常是默认设置)时,大多数客户机都可以工作。这意味着来宾收到的 CPU 定义与您的主机类似。在某些情况下,您可能需要使用host-passthrough完全通过主机 CPU 的所有特性的模式。
您可以通过使用 检索来宾的清单来检查和更改来宾的 CPU 类型virsh。首先运行virsh命令以启动交互式 shell。然后键入list --all以检索所有虚拟机:
virsh # list --all
Id Name State
------------------------------
- ubuntu22.04 shut off
- win10 shut off
接下来运行edit 以打开命名 VM 的清单:
virsh # edit ubuntu22.04
在文件中,找到以 . 开头的行<cpu mode=。将其更改为以下之一:
<cpu mode='host-model' check='partial' />
<cpu mode='host-passthrough' check='none' />
保存并关闭文件,然后输入exitvirsh shell 以关闭它。来宾现在应该准备好启动自己的嵌套来宾。如果似乎有问题,请尝试更改模式。
检查访客可以嵌套
大多数操作系统可以告诉您它们是否可以创建 VM。在您的 VM 中运行以下命令以检查 Linux 来宾是否可以访问虚拟化:
cat /proc/cpuinfo | grep "svm|vmx"
svm如果您获得一些带有红色或vmx以红色突出显示的输出,则可以使用虚拟化。SVM 将出现在 AMD 机器上;VMX 出现在 Intel 上。
现在在来宾中安装虚拟化技术。您应该会发现您可以启动一个新的嵌套 VM。这是一个屏幕截图,显示了一个使用嵌套 KVM 运行 Alpine 客户机的 Ubuntu 虚拟机:
限制
嵌套的客人有一些限制。对于已启动嵌套 VM 的来宾,某些 KVM 功能变得不可用。在嵌套 VM 停止之前,您将无法迁移、保存或加载这些虚拟机。
尝试执行这些操作之一的实际效果是不确定的。有些系统可以承受它;其他人可能会导致内核恐慌。在对链中它们上方的 VM 执行操作之前,请始终尝试关闭嵌套的来宾。
概括
嵌套虚拟化提供了更多的功能和灵活性。您可以对需要自己的虚拟化功能的技术进行沙盒处理,例如启动设备模拟器的 IDE。
让嵌套与 KVM 一起工作通常很简单。任何故障排除都应首先检查nested是否为您的 KVM 内核模块启用了参数。之后,检查分配给您的来宾的 CPU 型号,并确认您在 VM 中使用兼容的二级管理程序。