開機指令碼是檔案,可在虛擬機器 (VM) 執行個體的啟動程序中執行工作。開機指令碼可套用至專案中的所有 VM,或單一 VM。VM 層級中繼資料指定的開機指令碼會覆寫專案層級中繼資料指定的開機指令碼,且開機指令碼只會在網路可用時執行。本文說明如何在 Linux VM 執行個體上使用啟動指令碼。如要瞭解如何新增專案層級的啟動指令碼,請參閱 gcloud compute project-info add-metadata
。
Linux 開機指令碼可以使用 bash 或非 bash 檔案。如要使用非 Bash 檔案,請在檔案頂端新增 #!
,指定解譯器。舉例來說,如要使用 Python 3 啟動指令碼,請在檔案頂端新增 #! /usr/bin/python3
。
如果您使用本文中的任一程序指定開機指令碼,Compute Engine 會執行下列操作:
將開機指令碼複製到 VM
設定開機指令碼的執行權限
在 VM 開機時,以
root
使用者身分執行開機指令碼
如要瞭解啟動指令碼的各種相關工作,以及執行各項工作的時機,請參閱「總覽」。
事前準備
- 閱讀開機指令碼總覽。
- 請參閱中繼資料伺服器。
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,可以選取下列任一選項,向 Compute Engine 進行驗證:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:
gcloud init
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
- Set a default region and zone.
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:
gcloud init
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。
Linux 開機指令碼的中繼資料鍵
開機指令碼會從中繼資料鍵指定的位置傳遞至 VM。中繼資料金鑰會指定開機指令碼是儲存在本機、Cloud Storage,還是直接傳遞至 VM。您使用的中繼資料鍵也可能取決於開機指令碼的大小。
下表列出可用於 Linux 開機指令碼的中繼資料鍵,並根據開機指令碼的儲存位置和大小,提供應使用的金鑰資訊。
中繼資料鍵 用途 startup-script
傳遞儲存在本機或直接新增的 Bash 或非 Bash 開機指令碼,大小上限為 256 KB startup-script-url
傳遞儲存在 Cloud Storage 中,大小超過 256 KB 的 Bash 或非 Bash 開機指令碼。您在此輸入的字串會直接用於執行 gcloud storage
。如果startup-script-url
包含空格字元,請勿將空格替換為%20
,也不要在startup-script-url
字串中加入雙引號 (""
)。Linux 開機指令碼的執行順序
您可以使用多個開機指令碼。儲存在本機或直接新增的開機指令碼,會先於儲存在 Cloud Storage 中的開機指令碼執行。下表根據中繼資料鍵,顯示 Linux 啟動指令碼的執行順序。
中繼資料鍵 執行順序 startup-script
首次開機後,每次開機時 startup-script-url
初始開機後的每次開機 直接傳遞 Linux 開機指令碼
建立 VM 時,您可以直接將開機指令碼的內容新增至 VM。下列程序說明如何建立 VM,並使用開機指令碼安裝 Apache 及建立基本網頁。
主控台
直接將 Linux 開機指令碼傳遞至新的 VM
前往 Google Cloud 控制台的「建立執行個體」頁面。
如要使用 Linux 作業系統,請按照下列步驟操作:
在導覽選單中,按一下「OS 和儲存空間」。
按一下 [變更]。
在隨即顯示的「開機磁碟」窗格中,選取 Linux 作業系統。
如要直接新增 Linux 啟動指令碼,請按照下列步驟操作:
在導覽選單中,按一下「進階」。
在「Automation」(自動化) 專區中,於「Startup script」(開機指令碼) 欄位輸入下列內容:
#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script added directly.</p></body></html> EOF
視需要指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。
如要建立並啟動執行個體,請按一下「建立」。
直接將 Linux 開機指令碼傳遞至現有 VM
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
按一下執行個體的「名稱」。
按一下 [編輯]。
在「Automation」(自動) 下方,加入開機指令碼的內容。
驗證開機指令碼
執行個體啟動後,請在網頁瀏覽器中查看外部 IP,確認啟動指令碼已建立網站。您可能需要等待約 1 分鐘,範例開機指令碼才會完成。
gcloud
直接將 Linux 開機指令碼傳遞至新的 VM
建立 VM 時,請使用下列
gcloud compute instances create
指令,直接將開機指令碼的內容傳遞至 VM。gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --metadata=startup-script='#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script added directly.</p></body></html> EOF'
將 VM_NAME 替換為 VM 名稱。
直接將 Linux 開機指令碼傳遞至現有 VM
使用下列
gcloud compute instances add-metadata
指令,直接將開機指令碼新增至現有 VM:gcloud compute instances add-metadata VM_NAME \ --zone=ZONE \ --metadata=startup-script='#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script added directly.</p></body></html> EOF'
更改下列內容:
VM_NAME:VM 的名稱
ZONE:VM 所在可用區
驗證開機指令碼
VM 啟動後,在網頁瀏覽器中查看外部 IP,確認開機指令碼已建立網站。您可能需要等待約 1 分鐘,範例開機指令碼才會完成。
REST
直接將 Linux 開機指令碼傳遞至新的 VM
建立 VM 時,使用下列
instances.insert
方法,直接將開機指令碼內容傳遞至 VM。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { ... "networkInterfaces": [ { "accessConfigs": [ { "type": "ONE_TO_ONE_NAT" } ] } ], "metadata": { "items": [ { "key": "startup-script", "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF" } ] }, ... }
更改下列內容:
PROJECT_ID:VM 所在的專案 ID。
ZONE:要在其中建立 VM 的可用區。
直接將 Linux 開機指令碼傳遞至現有 VM
使用
instances.get
方法取得 VM 的metadata.fingerprint
值:GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
更改下列內容:
PROJECT_ID:VM 所在的專案 ID。
ZONE:VM 所在的可用區。
VM_NAME:VM 名稱。
在呼叫
instances.setMetadata
方法時,使用fingerprint
值傳遞啟動指令碼,以及啟動指令碼的中繼資料鍵和值:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata { "fingerprint": FINGERPRINT, "items": [ { "key": "startup-script", "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF" } ], ... }
更改下列內容:
PROJECT_ID:VM 所在的專案 ID。
ZONE:VM 所在的可用區。
VM_NAME:VM 名稱。
FINGERPRINT:使用
instances.get
方法取得的metadata.fingerprint
值。
驗證開機指令碼
VM 啟動後,在網頁瀏覽器中查看外部 IP,確認開機指令碼已建立網站。您可能需要等待約 1 分鐘,範例開機指令碼才會完成。
從本機檔案傳送 Linux 開機指令碼
您可以將開機指令碼儲存在工作站的本機檔案中,並在建立 VM 時將本機檔案做為中繼資料傳遞給 VM。您無法使用儲存在 VM 中的檔案做為開機指令碼。
將 Linux 開機指令碼從本機檔案傳遞至 VM 之前,請先完成下列步驟:
建立本機檔案來儲存開機指令碼。
請注意從 gcloud CLI 到啟動指令碼的相對路徑。
在檔案中新增下列啟動指令碼:
#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script from a local file.</p></body></html> EOF
gcloud
將本機檔案中的 Linux 開機指令碼傳遞至新的 VM
建立 VM,並使用
gcloud compute instances create
指令搭配--metadata-from-file
旗標,傳送要當做開機指令碼的本機檔案內容。gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --metadata-from-file=startup-script=FILE_PATH
更改下列內容:
VM_NAME:VM 的名稱
FILE_PATH:啟動指令碼檔案的相對路徑
將本機檔案中的 Linux 開機指令碼傳遞至現有 VM
使用下列
gcloud compute instances add-metadata
指令,從本機檔案將開機指令碼傳送至現有 VM:gcloud compute instances add-metadata VM_NAME \ --zone=ZONE \ --metadata-from-file startup-script=FILE_PATH
更改下列內容:
VM_NAME:VM 的名稱
ZONE:VM 所在可用區
FILE_PATH:啟動指令碼檔案的相對路徑
驗證開機指令碼
在網路瀏覽器中查看外部 IP,確認啟動指令碼已建立網站。您可能需要等待約 1 分鐘,範例啟動指令碼才會完成。
從 Cloud Storage 傳遞 Linux 開機指令碼
您可以將開機指令碼儲存在 Cloud Storage 中,並在建立 VM 時傳遞該指令碼。將開機指令碼新增至 Cloud Storage 後,您會取得一個網址,可用於建立 VM 時參照開機指令碼。
從 Cloud Storage bucket 新增開機指令碼前,請先完成下列步驟:
建立檔案來儲存開機指令碼。本範例使用 Bash (
.sh
) 檔案。在 bash 檔案中新增下列內容,安裝 Apache 並建立簡單的網頁:
#! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Linux startup script from Cloud Storage.</p></body></html> EOF
安全性影響
根據預設,專案擁有者和專案編輯者可以存取相同專案中的 Cloud Storage 檔案,除非有明確的存取權控管機制禁止存取。
如果 Cloud Storage 值區或物件的安全性低於中繼資料,一旦啟動指令碼遭到修改,且 VM 重新啟動,就可能發生權限提升的風險。這是因為 VM 重新啟動後,啟動指令碼會以
root
身分執行,然後使用附加服務帳戶的權限存取其他資源。
限制
主控台
將儲存在 Cloud Storage 中的開機指令碼傳遞至新的 VM
前往 Google Cloud 控制台的「建立執行個體」頁面。
如要使用 Linux 作業系統,請按照下列步驟操作:
在導覽選單中,按一下「OS 和儲存空間」。
在「作業系統和儲存空間」專區,點選「變更」。 然後選取 Linux 作業系統。
如要允許執行個體存取含有 Linux 開機指令碼的 Cloud Storage bucket,請執行下列操作:
如要透過指定 Cloud Storage 中的檔案新增 Linux 開機指令碼,請按照下列步驟操作:
在導覽選單中,按一下「進階」。
在「Metadata」(中繼資料) 區段中,按一下
「Add item」(新增項目)。畫面上會顯示「鍵」和「值」欄位。在「Key」(金鑰) 欄位中,輸入
startup-script-url
。在「Value」(值) 欄位中,使用下列其中一種格式輸入開機指令碼檔案的 Cloud Storage 位置:
- 已驗證的網址:
https://storage.googleapis.com/BUCKET/FILE
gcloud storage URI:
gs://BUCKET/FILE
更改下列內容:
BUCKET:包含開機指令碼檔案的 bucket 名稱
FILE:開機指令碼檔案名稱
- 已驗證的網址:
視需要指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。
如要建立並啟動執行個體,請按一下「建立」。
將儲存在 Cloud Storage 中的開機指令碼傳遞至現有 VM
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
按一下執行個體的「名稱」。
按一下 [編輯]。
在「Metadata」(中繼資料) 下新增下列值:
金鑰:
startup-script-url
值:開機指令碼檔案的 Cloud Storage 位置,格式如下:
- 已驗證的網址:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 已驗證的網址:
驗證開機指令碼
在網路瀏覽器中查看外部 IP,確認啟動指令碼已建立網站。您可能需要等待約 1 分鐘,範例啟動指令碼才會完成。
gcloud
將儲存在 Cloud Storage 中的開機指令碼傳遞至新的 VM
使用下列
gcloud compute instances create
指令建立 VM 時,請將儲存在 Cloud Storage 中的開機指令碼傳遞至 VM。請為--scope
標記使用storage-ro
值,讓 VM 能夠存取 Cloud Storage。gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --scopes=storage-ro \ --metadata=startup-script-url=CLOUD_STORAGE_URL
更改下列內容:
VM_NAME:VM 名稱。
CLOUD_STORAGE_URL:中繼資料值。使用下列其中一種格式,將開機指令碼檔案設為 Cloud Storage 位置:
- 已驗證的網址:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 已驗證的網址:
將儲存在 Cloud Storage 中的開機指令碼傳遞至現有 VM
使用下列
gcloud compute instances add-metadata
指令,將儲存在 Cloud Storage 中的開機指令碼傳遞至現有 VM:gcloud compute instances add-metadata VM_NAME \ --zone=ZONE \ --metadata startup-script-url=CLOUD_STORAGE_URL
更改下列內容:
VM_NAME:VM 名稱。
ZONE:VM 所在的可用區。
CLOUD_STORAGE_URL:中繼資料值。使用下列其中一種格式,將開機指令碼檔案設為 Cloud Storage 位置:
- 已驗證的網址:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 已驗證的網址:
驗證開機指令碼
在網路瀏覽器中查看外部 IP,確認啟動指令碼已建立網站。您可能需要等待約 1 分鐘,範例啟動指令碼才會完成。
REST
將儲存在 Cloud Storage 中的開機指令碼傳遞至新的 VM
建立 VM 時,請使用下列
instances.insert
方法,將儲存在 Cloud Storage 中的開機指令碼傳遞至 VM。在scopes
欄位中新增https://www.googleapis.com/auth/devstorage.read_only
,讓 VM 存取 Cloud Storage。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { ... "networkInterfaces": [ { "accessConfigs": [ { "type": "ONE_TO_ONE_NAT" } ] } ], "serviceAccounts": [ { "email": "default", "scopes": [ "https://www.googleapis.com/auth/devstorage.read_only" ] } ], "metadata": { "items": [ { "key": "startup-script-url", "value": "CLOUD_STORAGE_URL" } ] }, ... }
更改下列內容:
PROJECT_ID:專案 ID。
ZONE:要在其中建立 VM 的可用區。
CLOUD_STORAGE_URL:中繼資料值。使用下列其中一種格式,將開機指令碼檔案設為 Cloud Storage 位置:
- 已驗證的網址:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 已驗證的網址:
將儲存在 Cloud Storage 中的開機指令碼傳遞至現有 VM
使用
instances.get
方法取得 VM 的metadata.fingerprint
值:GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
更改下列內容:
PROJECT_ID:專案 ID
ZONE:VM 所在可用區
VM_NAME:VM 的名稱
在呼叫
instances.setMetadata
方法時,使用fingerprint
值傳遞啟動指令碼,以及啟動指令碼的中繼資料鍵和值:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata { "fingerprint": FINGERPRINT, "items": [ { "key": "startup-script-url", "value": "CLOUD_STORAGE_URL" } ], ... }
更改下列內容:
PROJECT_ID:專案 ID。
ZONE:VM 所在的可用區。
VM_NAME:VM 名稱。
FINGERPRINT:使用
instances.get
方法取得的metadata.fingerprint
值。CLOUD_STORAGE_URL:中繼資料值。使用下列其中一種格式,將開機指令碼檔案設為 Cloud Storage 位置:
- 已驗證的網址:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 已驗證的網址:
驗證開機指令碼
在網路瀏覽器中查看外部 IP,確認啟動指令碼已建立網站。您可能需要等待約 1 分鐘,範例啟動指令碼才會完成。
從 Linux 開機指令碼存取中繼資料
您可以在開機指令碼中存取中繼資料值。舉例來說,您可以對多個 VM 使用相同指令碼,並將不同的中繼資料值傳遞至每個 VM,個別為每個指令碼設定參數。
如要從開機指令碼存取自訂中繼資料值,請按照下列步驟操作:
建立開機指令碼,查詢中繼資料鍵的值。舉例來說,下列 Bash 檔案 (
.sh
) 開機指令碼會查詢foo
中繼資料鍵的值。#! /bin/bash METADATA_VALUE=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google") apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Accessing metadata value of foo: $METADATA_VALUE</p></body></html> EOF
使用下列
gcloud compute instances create
指令建立 VM 時,請設定foo
中繼資料鍵的值。在本範例中,開機指令碼是從本機檔案傳遞至 VM。gcloud
gcloud compute instances create VM_NAME \ --image-project=debian-cloud \ --image-family=debian-10 \ --metadata-from-file=startup-script=FILE_PATH \ --metadata=foo=bar
更改下列內容:
VM_NAME:VM 的名稱
FILE_PATH:啟動指令碼檔案的相對路徑
如要進一步瞭解如何指定中繼資料鍵/值組合,請參閱設定自訂中繼資料。
在本地工作站的網路瀏覽器中查看外部 IP,確認啟動指令碼輸出
foo
的值。您可能需要等待約 1 分鐘,範例開機指令碼才會完成。
重新執行 Linux 開機指令碼
如要重新執行開機指令碼,請按照下列步驟操作:
執行下列指令:
sudo google_metadata_script_runner startup
查看 Linux 開機指令碼的輸出內容
您可以透過下列任一方式,查看 Linux 啟動指令碼的輸出內容:
連線至執行個體並執行下列指令:
sudo journalctl -u google-startup-scripts.service
透過序列埠 1 查看輸出內容 在 Google Cloud 控制台中,檢查是否有
google_metadata_script_runner
事件。
後續步驟
瞭解如何排解 VM 啟動問題。
瞭解如何新增關閉指令碼。
進一步瞭解如何儲存及擷取中繼資料。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-09-04 (世界標準時間)。
-