为虚拟机实例启用嵌套虚拟化

本文介绍了如何在 Compute Engine 虚拟机实例上启用对嵌套虚拟化的支持,还介绍了启动和配置嵌套虚拟机的基本步骤。

嵌套虚拟化可为 Compute Engine 虚拟机增加对 Intel VT-x 处理器虚拟化指令的支持。使用嵌套虚拟化,您可以一如往常地在 Compute Engine 上启动虚拟机实例,然后在虚拟机实例上安装与 KVM 兼容的管理程序,如此即可在该管理程序之上再运行另一个虚拟机实例。您可以在运行于 Haswell 或更新平台上的任何 Linux 虚拟机实例上使用嵌套虚拟化。如需了解其他限制,请参阅嵌套虚拟化的限制部分。

嵌套虚拟化非常适合那些无法将虚拟机映像转换或导入至 Compute Engine 的基于虚拟机的应用和工作负载。例如,您可以使用嵌套虚拟化为在基于 KVM 的虚拟机上运行的本地工作负载构建灾难恢复解决方案,该解决方案可以无缝地故障转移到在 Compute Engine 上运行的虚拟机,而无需耗费额外的时间或编排来将基于 KVM 的虚拟机转换为原生 Compute Engine 映像。另一个可能很适合嵌套虚拟化的工作负载是某种软件验证框架,该框架需要在与 KVM 兼容的不同操作系统的众多版本上测试和验证软件包的新版本。通过运行嵌套虚拟机,您不再需要转换和管理一个大型的 Compute Engine 映像库。

准备工作

嵌套虚拟化的工作原理

Compute Engine 虚拟机运行在被称为 L0 环境的物理硬件(主机服务器)之上。在主机服务器中,预安装的管理程序允许单个服务器托管多个 Compute Engine 虚拟机,这些虚拟机在 Compute Engine 上称为 L1 或原生虚拟机。当您使用嵌套虚拟化时,可以在 L1 客机操作系统之上安装另一个管理程序,并使用这个 L1 管理程序创建嵌套虚拟机(称为 L2 虚拟机)。运行客机管理程序和嵌套虚拟机的 L1 或原生 Compute Engine 虚拟机也可称为主机虚拟机。

嵌套虚拟化图解

限制

  • 嵌套虚拟化仅适用于在 Haswell 处理器或更高版本 Haswell 处理器上运行的 L1 虚拟机。如果某个地区的默认处理器是 Sandy Bridge 或 Ivy Bridge,您可以使用最低要求 CPU 选择为特定实例选择 Haswell 或更高版本。请查看区域和地区页面,确定哪些地区支持 Haswell 或更高版本的处理器。
  • 只有 Linux 实例上运行的基于 KVM 的管理程序才支持嵌套虚拟化。Hyper-V、ESX 和 Xen 管理程序不支持此功能。
  • Windows 虚拟机不支持嵌套虚拟化;也就是说,主机虚拟机必须运行 Linux 操作系统。但是,嵌套虚拟机可以运行某些 Windows 操作系统(具体如下所述)。

经过测试的 KVM 版本

Google 使用以下主机虚拟机和嵌套虚拟机组合来运行基本的嵌套虚拟化启动和集成测试:

  • Debian 9(内核版本 4.9)可托管以下嵌套虚拟机:
    • CentOS 6.5(内核版本 2.6)
    • Debian 9(内核版本 4.9)
    • RHEL 5.11(内核版本 2.6)
    • SLES 12 SP3 (内核版本 4.4)
    • Ubuntu 16.04 LTS(内核版本 4.15)
    • Windows Server 2008 R2
    • Windows Server 2016 Datacenter Edition
  • SLES 12 SP3(内核版本 4.4)可托管以下嵌套虚拟机:
    • SLES 12 SP3 (内核版本 4.4)
  • Ubuntu 16.04 LTS(内核版本 4.15)可托管以下嵌套虚拟机:
    • Ubuntu 16.04 LTS(内核版本 4.15)

如果您在此处所列版本以外的发行版和内核/KVM 版本上运行嵌套虚拟机时遇到问题,请在报告您的问题之前,先使用上述任一环境作为主机 Compute Engine 实例上的客机操作系统来重现此问题。

性能

即使利用硬件辅助的嵌套虚拟化,嵌套虚拟机本身以及在其中运行的任何应用或工作负载也会有性能损失。虽然无法预测指定应用或工作负载性能下降的确切数值,但对于受 CPU 限制的工作负载而言,预计至少会下降 10%,而对于受 I/O 限制的工作负载下降幅度可能会大很多。

对组织启用嵌套虚拟化

必须首先确保已通过组织政策为您的项目、文件夹或组织启用嵌套虚拟化,然后才能使用嵌套虚拟化。请组织内拥有 orgPolicy.policyAdmin 角色的用户通过移除停用虚拟机嵌套虚拟化这一限制来允许嵌套虚拟化。

控制台

  1. 转到 Google Cloud Console 中的“组织政策”页面。
    转到“组织政策”页面

  2. 在页面顶部的下拉菜单中,选择您要修改其组织政策的项目、文件夹或组织。组织政策页面会显示可用的组织政策限制列表。

  3. 组织政策页面上,选择列表中的停用虚拟机嵌套虚拟化这一限制。随即显示的政策详情页面会描述该限制,并提供目前该限制如何应用的信息。

  4. 点击修改以自定义该限制。

  5. 修改页面,选择自定义。

  6. 强制执行下,选择强制执行选项:

    • 若要启用该限制条件的强制执行,请选择打开

    • 若要停用该限制条件的强制执行,请选择关闭

  7. 点击保存

gcloud

使用 gcloud 命令行工具运行以下命令:

gcloud beta resource-manager org-policies disable-enforce \
    compute.disableNestedVirtualization \
    [--project=[PROJECT_ID] | --folder=[FOLDER_ID] | --organization=[ORGANIZATION_ID]]

请提供 --project--folder--organization 中的一个,其中:

  • [PROJECT_ID] 是要启用嵌套虚拟化的项目的 ID。
  • [FOLDER_ID] 是要启用嵌套虚拟化的文件夹的 ID。
  • [ORGANIZATION_ID] 是要启用嵌套虚拟化的组织的 ID。

API

如需为项目、文件夹或组织启用嵌套虚拟化,请向以下网址发出 POST 请求:

https://cloudresourcemanager.googleapis.com/v1/[RESOURCE]/[RESOURCE_ID]:setOrgPolicy

其中

  • [RESOURCE]projectsfoldersorganizations 中的一个。
  • [RESOURCE_ID] 是项目 ID、文件夹 ID 或组织 ID,具体取决于资源。

在请求正文中提供以下代码:

{"policy":
    {"booleanPolicy":
        {
            "enforced": false
        },
        "constraint": "constraints/compute.disableNestedVirtualization"
    }
  }

在组织政策设置为 enforced 时,您可以确定项目、文件夹或组织是否被阻止使用嵌套虚拟化,例如,可以使用 gcloud 工具:

gcloud beta resource-manager org-policies describe \
    constraints/compute.disableNestedVirtualization --project=[PROJECT_ID] --effective

其中,[PROJECT_ID] 是您的项目 ID。如果响应包含空的 booleanPolicy: {},则允许嵌套虚拟化。否则,响应将包含 enforced: true。如需了解详情,请参阅有关布尔值限制的文档。

对实例启用嵌套虚拟化

您必须首先确保您的组织允许嵌套虚拟化,然后才能对虚拟机实例启用嵌套虚拟化。

您可以使用 API 或 gcloud 组件来启用嵌套虚拟化。如要启用嵌套虚拟化,您必须使用一个在 L1 或主机虚拟机实例中启用 VMX 的特殊许可密钥来创建自定义映像,然后在满足嵌套虚拟化限制的实例上使用该映像。许可密钥不会产生额外费用。

  1. 从公开映像或带操作系统的自定义映像创建启动磁盘。或者,您可以跳过此步骤,将许可应用于某个虚拟机实例的现有磁盘。

    gcloud

    使用 gcloud 命令行工具,通过您选择的启动磁盘映像创建磁盘。在此示例中,请通过 debian-9 映像系列创建一个名为 disk1 的磁盘:

    gcloud compute disks create disk1 --image-project debian-cloud --image-family debian-9 --zone us-central1-b

    API

    通过 debian-9 映像系列创建一个名为 disk1 的磁盘:

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks
    
    {
     "name": "disk1",
     "sourceImage": "/projects/debian-cloud/global/images/family/debian-9"
    }

    其中,[PROJECT_ID] 是您的项目 ID。

  2. 通过您创建的启动磁盘或现有实例的启动磁盘,使用虚拟化所需的特殊许可密钥创建自定义映像。

    gcloud

    如果要使用 gcloud 命令行工具创建映像,请使用“--licenses”标志提供以下许可网址:

    https://compute.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx

    例如,以下命令会通过名为“disk1”的示例磁盘创建名为“nested-vm-image”的映像:

    gcloud compute images create nested-vm-image \
      --source-disk disk1 --source-disk-zone us-central1-b \
      --licenses "https://compute.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"

    API

    在 API 中,将 licenses 属性加入您的 API 请求中:

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images
    
    {
       "licenses": ["projects/vm-options/global/licenses/enable-vmx"],
       "name": "nested-vm-image",
       "sourceDisk": "zones/us-central1-b/disks/disk1"
    }

    其中,[PROJECT_ID] 是您的项目 ID。

  3. 使用必要许可创建映像后,您可以删除不再需要的来源磁盘。
  4. 使用带许可的新自定义映像创建虚拟机实例。必须在支持 Haswell CPU 平台或更新版本的地区中创建该实例。例如:
    gcloud compute instances create example-nested-vm --zone us-central1-b \
                  --min-cpu-platform "Intel Haswell" \
                  --image nested-vm-image
  5. 确认该虚拟机已启用嵌套虚拟化。
    1. 连接到虚拟机实例。例如:
      gcloud compute ssh example-nested-vm
    2. 运行以下命令来检查是否已启用嵌套虚拟化。若为非零响应,则表示嵌套虚拟化已启用。
      grep -cw vmx /proc/cpuinfo

启动嵌套虚拟机

您可以通过多种不同方式启动嵌套虚拟机。本部分提供了相关示例来说明如何在运行 Debian 的 L1 虚拟机上使用 qemu-system-x86_64 启动嵌套虚拟机。如果您在使用此处所述过程以外的方法运行嵌套虚拟机时遇到问题,在将您的问题报告为 bug 之前,请先使用此过程重现该问题。

  1. 连接到虚拟机实例。例如:

    gcloud compute ssh example-nested-vm
    
  2. 更新虚拟机实例并安装一些必要的软件包:

    sudo apt-get update && sudo apt-get install qemu-kvm -y
    
  3. 下载操作系统映像:

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  4. 运行 screen

    screen
    
  5. 在出现 screen 欢迎提示时按 Enter 键。

  6. 启动嵌套虚拟机。出现提示时,使用 user: rootpassword: root 登录。

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -curses
    
  7. 测试您的虚拟机是否具有外部访问权限:

    user@nested-vm:~$ wget google.com && cat index.html
  8. 测试完成后,按 Ctrl+ACtrl+D 退出屏幕会话。

在主机和嵌套虚拟机之间启动专用网桥

如需启用主机和嵌套虚拟机之间的连接,您可以创建一个专用网桥。此示例过程适用于运行 Debian 的 L1 虚拟机。

  1. 连接到虚拟机实例。例如:

    gcloud compute ssh example-nested-vm
    
  2. 更新虚拟机实例并安装一些必要的软件包:

    sudo apt-get update && sudo apt-get install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  3. 启动随附于 libvirt 软件包的默认网络:

    sudo virsh net-start default
    
  4. 检查现在是否存在 virbr0 网桥:

    sudo ifconfig -a
    
     eth0      Link encap:Ethernet  HWaddr 42:01:0a:80:00:02
               inet addr:10.128.0.2  Bcast:10.128.0.2  Mask:255.255.255.255
               UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
               RX packets:14799 errors:0 dropped:0 overruns:0 frame:0
               TX packets:9294 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:1000
               RX bytes:97352041 (92.8 MiB)  TX bytes:1483175 (1.4 MiB)
    
     lo        Link encap:Local Loopback
               inet addr:127.0.0.1  Mask:255.0.0.0
               inet6 addr: ::1/128 Scope:Host
               UP LOOPBACK RUNNING  MTU:65536  Metric:1
               RX packets:0 errors:0 dropped:0 overruns:0 frame:0
               TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:0
               RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
     virbr0    Link encap:Ethernet  HWaddr 5a:fa:7e:d2:8b:0d
               inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
               UP BROADCAST MULTICAST  MTU:1500  Metric:1
               RX packets:0 errors:0 dropped:0 overruns:0 frame:0
               TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:0
               RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
  5. 创建一个从主机虚拟机到嵌套虚拟机的 tun 接口:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  6. 将 tun 接口绑定到网桥虚拟机:

    sudo brctl addif virbr0 tap0
    
  7. 再次检查是否已正确设置网桥网络:

    sudo brctl show
    
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254005085fe       yes              tap0
  8. 下载操作系统映像:

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  9. 运行 screen

    screen
    
  10. 在出现 screen 欢迎提示时按 Enter 键。

  11. 启动嵌套虚拟机:

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    
  12. 出现提示时,使用 user: rootpassword: root 登录。

  13. 在嵌套虚拟机上,运行 ifconfig 确认该虚拟机的 virbr0 空间中已有地址,例如 192.168.122.89:

    user@nested-vm:~$ ifconfig
  14. 在端口 8000 上启动虚拟 Web 服务器:

    user@nested-vm:~$ python -m SimpleHTTPServer
  15. Ctrl+ACtrl+D 退出屏幕会话。

  16. 测试主机虚拟机是否可以对嵌套虚拟机执行 ping 操作:

    curl 192.168.122.89:8000
    

    嵌套虚拟机应返回类似如下的消息:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

将嵌套虚拟机配置为可从主机虚拟机外部访问

您可以为实例设置多个网络接口,或为其设置别名 IP,以便主机虚拟机外部的虚拟机可以对嵌套虚拟机执行 ping 操作。

以下示例过程会将主机和嵌套虚拟机设置为可以使用别名 IP 从同一网络中的其他虚拟机访问嵌套虚拟机。此过程使用先前创建subnet1 虚构子网。您可以将 subnet1 替换为自己子网的名称,也可以新建一个名为 subnet1 的子网。

最后请注意,此过程适用于运行 Debian 的 L1 虚拟机。

  1. 创建已启用嵌套虚拟化的虚拟机,但请确保添加别名 IP 范围以及对 HTTP/HTTPS 流量的支持。例如:

    gcloud compute instances create example-nested-vm --image nested-vm-image \
        --tags http-server,https-server --can-ip-forward \
        --min-cpu-platform "Intel Haswell" \
        --network-interface subnet=subnet1,aliases=/30
    
  2. 连接到虚拟机实例。例如:

    gcloud compute ssh example-nested-vm
    
  3. 更新虚拟机实例并安装一些必要的软件包:

    sudo apt-get update && sudo apt-get install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. 启动随附于 libvirt 软件包的默认网络:

    sudo virsh net-start default
    
  5. 检查现在是否存在 virbr0 网桥:

    sudo ifconfig -a
     
     eth0      Link encap:Ethernet  HWaddr 42:01:0a:80:00:02
               inet addr:10.128.0.2  Bcast:10.128.0.2  Mask:255.255.255.255
               UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
               RX packets:14799 errors:0 dropped:0 overruns:0 frame:0
               TX packets:9294 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:1000
               RX bytes:97352041 (92.8 MiB)  TX bytes:1483175 (1.4 MiB)

    lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

    virbr0 Link encap:Ethernet HWaddr 5a:fa:7e:d2:8b:0d inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

  6. 创建一个从主机虚拟机到嵌套虚拟机的 tun 接口:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  7. 将 tun 接口绑定到网桥虚拟机:

    sudo brctl addif virbr0 tap0
    
  8. 再次检查是否已正确设置网桥网络:

    sudo brctl show
    
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254005085fe       yes              tap0
  9. 下载操作系统映像:

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  10. 运行 screen

    screen
    
  11. 在出现 screen 欢迎提示时按 Enter 键。

  12. 启动嵌套虚拟机:

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    
  13. 出现提示时,使用 user: rootpassword: root 登录。

  14. 在嵌套虚拟机上,运行 ifconfig 确认该虚拟机的 virbr0 空间中已有地址,例如 192.168.122.89:

    user@nested-vm:~$ ifconfig
  15. 在端口 8000 上启动虚拟 Web 服务器:

    user@nested-vm:~$ python -m SimpleHTTPServer
  16. Ctrl+ACtrl+D 退出屏幕会话。

  17. 测试主机虚拟机是否可以对嵌套虚拟机执行 ping 操作:

    curl 192.168.122.89:8000
    

    嵌套虚拟机应返回类似如下的消息:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    
  18. 在主机虚拟机上设置 iptables,以允许将流量从您的主机虚拟机转发到嵌套虚拟机。对于本说明中所用的 L2 客机映像 (debian_squeeze_amd64_standard.qcow2),您必须先清空 IP 表格:

    sudo iptables -F
    

    接下来,确定虚拟机的别名 IP 地址:

    ip route show table local
    

    虚拟机应返回类似于以下输出的消息。在此示例中,有两个 IP 地址与虚拟机的以太网设备 eth0 关联。第一个是 10.128.0.2,即 sudo ifconfig -a 返回的虚拟机主 IP 地址。第二个是 10.128.0.13,即虚拟机的别名 IP 地址。

    local 10.128.0.2 dev eth0 proto kernel scope host src 10.128.0.2
    broadcast 10.128.0.2 dev eth0 proto kernel scope link src 10.128.0.2
    local 10.128.0.13/30 dev eth0 proto 66 scope host
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 192.168.122.0 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1
    broadcast 192.168.122.255 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    

    若要将流量从别名 IP 地址 (10.128.0.13) 转发到嵌套虚拟机 (192.168.122.89),请运行以下命令:

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
    sudo iptables -t nat -A PREROUTING -d 10.128.0.13 -j DNAT --to-destination 192.168.122.89
    sudo iptables -t nat -A POSTROUTING -s 192.168.122.89 -j MASQUERADE
    sudo iptables -A INPUT -p udp -j ACCEPT
    sudo iptables -A FORWARD -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p udp -j ACCEPT
    
  19. 接下来,登录与托管虚拟机位于同一网络的另一虚拟机,并向别名 IP 地址发出 curl 请求。例如:

    user@another-vm:~$ curl 10.128.0.13:8000

    嵌套虚拟机应返回类似如下的消息:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

问题排查

Google 使用 Compute Engine 实例上的特定 Linux 发行版本和内核/KVM 版本来运行基本的嵌套虚拟化启动和集成测试。此外,这些测试使用特定的过程。在将问题报告为 bug 之前,请先使用下面几项重现这些问题:

我无法启动启用了嵌套虚拟化的新虚拟机。

在 2020 年 1 月 31 日之后,所有组织的默认组织政策都会停用嵌套虚拟化。请确保首先启用嵌套虚拟化,然后启动启用了嵌套虚拟化的虚拟机。

运行 grep -c vmx /proc/cpuinfo 返回 0,并且说我的虚拟机未启用嵌套

  1. 确保您使用 Haswell 或更高版本的 CPU 平台启动虚拟机。
  2. 确保您的虚拟机映像使用了正确的许可

我无法退出嵌套虚拟机。

如果您未在启动每个嵌套虚拟机会话之前运行 screen,则可以关停嵌套虚拟机,或从其他终端终止该进程。如要关停嵌套虚拟机,请在您的嵌套虚拟机中运行 poweroff 命令。或者,从另一个终端登录到主机虚拟机并终止该进程,然后在启动新的嵌套虚拟机之前在主机虚拟机上运行 screen

我的 iptables 规则未将流量转发到我的嵌套虚拟机。

  • iptables 会自上而下解析规则,请确保您的规则相较于其他规则具有更高优先级。
  • 检查确认没有会拦截数据包的冲突规则。
  • 考虑清空 iptables:

    1. 首先,设置默认政策:

      sudo iptables -P INPUT ACCEPT
      sudo iptables -P FORWARD ACCEPT
      sudo iptables -P OUTPUT ACCEPT
      
    2. 然后清空所有表和链,并删除非默认链:

      sudo iptables -t nat -F
      sudo iptables -t mangle -F
      sudo iptables -F
      sudo iptables -X