在 Windows VM 中使用開機指令碼

開機指令碼會在虛擬機器 (VM) 的啟動程序中執行工作。本頁面提供相關步驟,說明如何在 VM 執行個體上使用開機指令碼。

事前準備

如要使用 gdcloud 指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud CLI。Distributed Cloud 的所有指令都使用 gdcloudkubectl CLI,且需要作業系統 (OS) 環境。

取得 kubeconfig 檔案路徑

如要對 Management API 伺服器執行指令,請確認您具備下列資源:

  1. 登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。

  2. 使用 Management API 伺服器的 kubeconfig 檔案路徑,取代這些操作說明中的 MANAGEMENT_API_SERVER

要求權限和存取權

如要執行本頁列出的工作,您必須具備專案虛擬機器管理員角色。請按照步驟驗證存取權,或請專案 IAM 管理員在 VM 所在的專案命名空間中,指派專案 VirtualMachine 管理員 (project-vm-admin) 角色給您。

設定 Windows 啟動指令碼名稱格式

Windows VM 的啟動指令碼必須採用特定命名格式,並以破折號分隔指令碼名稱和附加的副檔名。舉例來說,create-directory-ps1,其中 create-directory 是指令碼名稱,ps1 則是副檔名。格式錯誤的例子包括使用半形句號取代半形連字號,以及省略副檔名,例如 create-directory.ps1create-directory

以下列出 Windows 開機指令碼適用的副檔名:

  • ps1:包含 PowerShell 指令。
  • cmd:包含命令提示字元解譯器的批次指令。
  • bat:包含批次指令。

依序執行 Windows 開機指令碼

您可以同時使用多個開機指令碼。含有指令碼的檔案類型會影響每個指令碼的執行順序。下表顯示 Windows 開機指令碼的執行順序:

Windows 指令碼 執行順序
PowerShell 指令碼 每次開機時都會先執行。
批次指令碼 每次開機時都會執行。
指令碼 每次開機時,第三個磁碟都會啟動。

如果兩個開機指令碼的副檔名相同,系統會根據副檔名和名稱,依字母順序執行指令碼。舉例來說,如果啟動指令碼名稱為 alpha-script-ps1beta-script-ps1,則 alpha-script-ps1 會在 beta-script-ps1 之前執行。

下列 VM 規格顯示 startupScripts 欄位中的 Windows 開機指令碼順序和結構:

...
  startupScripts:
  - name: create-directory-ps1
    script: |-
      New-Item -ItemType Directory -Path C:\ -Name NewDir
      Get-ChildItem -Path C:\
  - name: hello-world-bat
    script: |-
      ECHO "Hello World!"
  - name: list-directories-cmd
    script: |-
      dir C:\Windows  > files.txt
...

傳遞開機指令碼

Distributed Cloud 會根據每個開機指令碼的名稱,依字母順序執行開機指令碼。

下表列出不同大小的腳本應使用的格式:

腳本大小 腳本格式
指令碼最多 2048 個位元組 清除文字
指令碼超過 2048 個位元組 Kubernetes Secret

定義開機指令碼

如要使用啟動指令碼,您必須將 startupScripts 欄位新增至 VM spec 欄位。您可以在這個欄位中,以純文字或 Kubernetes 密碼的形式指定多個啟動指令碼。

以下範例會將啟動指令碼指定為純文字和 Kubernetes 密鑰:

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "vm-test"
spec:
  ...
  startupScripts:
  - name: create-directory-ps1
    script: |-
      New-Item -ItemType Directory -Path C:\ -Name NewDir
      Get-ChildItem -Path C:\
  - name: list-directories-cmd
    scriptSecretRef:
      name: list-directories
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: list-directories
data: 
  script:
    ZGlyIEM6XFdpbmRvd3MgID4gZmlsZXMudHh0Cg==

請注意下列事項:

  • 開機指令碼會在每次開機時執行。
  • 開機指令碼預設具有根權限。
  • 在 Kubernetes 密鑰中,VM spec 中的 scriptSecretRef 名稱必須與 metadata.name 欄位相符。
  • 在 Kubernetes 密鑰中,將 script 鍵新增至 data 欄位,指定開機指令碼內容。

使用 Windows 開機指令碼建立新的 VM

如要使用 Windows 開機指令碼建立 VM,請按照「使用開機指令碼建立新的 VM」一文中的步驟操作。