根據預設,系統允許巢狀虛擬化,因此除非有人修改巢狀虛擬化的限制,否則您不需要進行任何變更,即可在機構、資料夾或專案中建立巢狀 VM。如果專案不屬於任何機構,系統預設允許巢狀虛擬化,且您無法變更限制。如要瞭解如何修改決定是否可建立巢狀 VM 的限制,請參閱「管理巢狀虛擬化限制」。
本文說明如何建立各種類型的第 2 級 (L2) 虛擬機器 (VM) 執行個體。建立巢狀 VM 前,您必須建立已啟用巢狀虛擬化的 L1 VM。 如要瞭解 L1 和 L2 VM,請參閱巢狀虛擬化總覽。
建立啟用巢狀虛擬化的 L1 VM 後,您可以執行下列任一操作:
- 建立可存取外部網路的 L2 VM
- 建立 L2 VM,並透過私人網路橋接至 L1 VM
- 建立 L2 VM,並從 L1 VM 外部存取網路
事前準備
-
如果尚未設定驗證,請先完成設定。
「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
Select the tab for how you plan to use the samples on this page:
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
使用
gcloud compute ssh
指令連線至 VM:gcloud compute ssh VM_NAME
將
VM_NAME
替換為要連線的 VM 名稱。安裝最新
qemu-kvm
套件:sudo apt update && sudo apt install qemu-kvm -y
下載與 QEMU 相容的 OS 映像檔,用於 L2 VM。
使用下列指令啟動 L2 VM。畫面出現提示時,請使用
user: root
和password: root
登入。sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -curses
將
IMAGE_NAME
替換為要用於 L2 VM 的 QEMU 相容 OS 映像檔名稱。測試 L2 VM 是否具有外部存取權:
user@nested-vm:~$ host google.com
使用
gcloud compute ssh
指令連線至 VM:gcloud compute ssh VM_NAME
將
VM_NAME
替換為要連線的 VM 名稱。安裝建立私有橋接器所需的套件:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
啟用與
libvirt
套件一同隨附的預設網路:sudo virsh net-start default
執行下列指令,確認您有
virbr0
橋接器:ip addr
輸出結果會與下列內容相似:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::4001:aff:fe80:15/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
建立
tap
介面,從 L1 VM 前往 L2 VM:sudo tunctl -t tap0 sudo ifconfig tap0 up
將
tap
介面繫結至私人橋接器:sudo brctl addif virbr0 tap0
執行下列指令,驗證網橋網路的設定:
sudo brctl show
輸出結果會與下列內容相似:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
下載與 QEMU 相容的 OS 映像檔,用於 L2 VM。
執行
screen
,然後在歡迎提示中按下 Enter 鍵:screen
使用下列指令啟動 L2 VM。畫面出現系統提示時,使用
user: root
和password: root
登入。sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
將
IMAGE_NAME
替換為要用於 L2 VM 的 QEMU 相容 OS 映像檔名稱。在 L2 VM 上執行
ip addr show
,確認 VM 在virbr0
空間中具有位址,例如192.168.122.89
:user@nested-vm:~$ ip addr
在通訊埠
8000
上啟動預留位置網路伺服器:user@nested-vm:~$ python -m http.server
按下
Ctrl+A
和Ctrl+D
卸離screen
工作階段。測試 L1 VM 是否可以連線偵測 L2 VM,並將下列 IP 位址替換為 L2 VM 的 IP 位址:
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>
建立已啟用巢狀虛擬化的 L1 VM,並包含別名 IP 範圍與 HTTP/HTTPS 流量支援:
gcloud
gcloud compute instances create VM_NAME --enable-nested-virtualization \ --tags http-server,https-server --can-ip-forward \ --min-cpu-platform "Intel Haswell" \ --network-interface subnet=subnet1,aliases=/30
將
VM_NAME
替換為 L1 VM 的名稱。REST
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { ... "name": VM_NAME, "tags": { "items": [ http-server,https-server ], }, "canIpForward": true, "networkInterfaces": [ { "subnetwork": "subnet1", "aliasIpRanges": [ { "ipCidrRange": "/30" } ], } ], "minCpuPlatform": "Intel Haswell", "advancedMachineFeatures": { "enableNestedVirtualization": true }, ... }
更改下列內容:
PROJECT_ID
:專案 IDZONE
:要在其中建立 VM 的可用區VM_NAME
:VM 名稱
使用
gcloud compute ssh
指令連線至 VM。如果無法連線至 VM,請嘗試重設 VM 或修改防火牆規則。gcloud compute ssh VM_NAME
將
VM_NAME
替換為要連線的 VM 名稱。更新 VM 並安裝必要套件:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
啟用與
libvirt
套件一同隨附的預設網路:sudo virsh net-start default
執行下列指令,確認您有
virbr0
橋接器:user@nested-vm:~$ ip addr
確認輸出內容類似於下列內容:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::4001:aff:fe80:15/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
建立
tap
介面,從 L1 VM 前往 L2 VM:sudo tunctl -t tap0 sudo ifconfig tap0 up
將
tap
介面繫結至私人橋接器:sudo brctl addif virbr0 tap0
執行下列指令,驗證網橋網路的設定:
sudo brctl show
確認輸出內容類似於下列內容:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
下載與 QEMU 相容的 OS 映像檔,用於 L2 VM。
執行
screen
,然後在歡迎提示中按下 Enter 鍵:screen
使用下列指令啟動巢狀 VM。畫面出現系統提示時,使用
user: root
和password: root
登入。sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
將
IMAGE_NAME
替換為要用於 L2 VM 的 QEMU 相容 OS 映像檔名稱。在 L2 VM 上執行
ip addr
,確認 L2 VM 在 virbr0 空間中具有位址,例如192.168.122.89
:user@nested-vm:~$ ip addr
在通訊埠
8000
上啟動預留位置網路伺服器:user@nested-vm:~$ python -m http.server
按下
Ctrl+A
和Ctrl+D
卸離screen
工作階段。測試 L1 VM 是否可以連線偵測 L2 VM,並將下列 IP 位址替換為 L2 VM 的 IP 位址:
curl 192.168.122.89:8000
確認 L2 VM 的回應類似於下列內容:
<!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>
在 L1 VM 上設定
iptables
,允許從 L1 VM 轉寄至 L2 VM。對於在這些操作說明中使用的 L2 OS 映像檔,您必須清除 IP 表格:sudo iptables -F
確認 L1 VM 的別名 IP:
ip route show table local
確認輸出結果與下列內容相似。在本範例中,有兩個 IP 位址與 L2 VM 的
eth0
乙太網路裝置相關。第一個是10.128.0.2
,此為 L2 VM 的主要 IP 位址,由sudo ifconfig -a
傳回。第二個是10.128.0.13
,為 L2 VM 的別名 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
執行下列指令,將流量從
10.128.0.13
範例別名 IP 轉送至 L2 VM 的192.168.122.89
範例 IP: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
如要瞭解如何排解
iptables
問題,請參閱「iptables
未轉送流量」。登入與 L1 VM 位於同個網路的另一部 VM,並向別名 IP 發出
curl
要求,將下列 IP 位址換成 L2 VM 的別名 IP,藉此從 L1 VM 外部驗證 L2 VM 存取權:user@another-vm:~$ curl 10.128.0.13:8000
確認
curl
回應類似於下列內容:<!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>
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。
建立具有外部網路存取權的 L2 VM
使用下列程序建立可存取外部網路的 L2 VM。此程序會使用
qemu-system-x86_64
啟動 L2 VM。如果您使用其他程序建立 L2 VM 時遇到問題,請先使用這個程序重現問題,再與支援團隊聯絡。建立 L2 VM,並透過私人網路橋接至 L1 VM
使用下列程序,透過私有網路橋接器,在先前建立的 L1 VM 中建立 L2 VM。如要瞭解如何變更虛擬私有雲網路的預設最大傳輸單位 (MTU),請參閱最大傳輸單位總覽。
建立 L2 VM,並從 L1 VM 外部存取網路
您可以設定具有別名 IP 的 L2 VM,讓 L1 VM 外部的 VM 存取 L2 VM。請按照下列程序,透過先前建立的 L1 VM 外部別名 IP,建立可存取網路的 L2 VM。如要瞭解如何建立別名 IP 位址,請參閱設定別名 IP 範圍。
下列程序假設您先前已建立名為
subnet1
的子網路。如果您已有名稱不同的子網路,請將subnet1
替換為子網路名稱,或建立名為subnet1
的新子網路。後續步驟
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-07-21 (世界標準時間)。
-