启动脚本用于在虚拟机 (VM) 的启动过程中执行任务。本页介绍了在虚拟机实例上使用启动脚本的步骤。
准备工作
如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud CLI。GDC 隔网设备的全部命令都使用 gdcloud 或 kubectl CLI,并且需要操作系统 (OS) 环境。
获取 kubeconfig 文件路径
如需针对管理 API 服务器运行命令,请确保您拥有以下资源:
- 找到管理 API 服务器名称,或向平台管理员 (PA) 询问服务器名称。 
- 登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。 
- 使用该路径替换这些说明中的 - MANAGEMENT_API_SERVER{"</var>"}}。
请求权限和访问权限
如需执行本页面中列出的任务,您必须具有 Project VirtualMachine Admin 角色。按照相应步骤验证您的访问权限,或者让项目 IAM 管理员在虚拟机所在项目的命名空间中为您分配项目虚拟机管理员 (project-vm-admin) 角色。
Windows 启动脚本名称的格式
Windows 虚拟机的启动脚本必须遵循特定的命名格式,即附加脚本名称和文件扩展名,并用短划线分隔。例如,create-directory-ps1,其中 create-directory 是脚本名称,ps1 是文件扩展名。不正确的格式包括使用句点代替短划线以及省略文件扩展名,例如 create-directory.ps1 和 create-directory。
以下内容显示了要用于 Windows 启动脚本的文件扩展名:
- ps1:包含 PowerShell 命令。
- cmd:包含命令提示符解释器的批处理命令。
- bat:包含批处理命令。
按顺序运行 Windows 启动脚本
您可以使用多个启动脚本。包含脚本的文件类型会影响运行每个脚本的顺序。下表显示了 Windows 启动脚本的运行顺序:
| Windows 脚本 | 要运行的命令 | 
|---|---|
| PowerShell 脚本 | 每次启动时首次运行。 | 
| 批处理脚本 | 每次启动时运行的第二个。 | 
| 命令脚本 | 每次启动时的第三次。 | 
如果两个启动脚本具有相同的文件扩展名,则系统会根据文件扩展名和名称按字母顺序运行这些脚本。例如,如果您的启动脚本名称为 alpha-script-ps1 和 beta-script-ps1,则 alpha-script-ps1 会在 beta-script-ps1 之前运行。
以下虚拟机规范示例展示了 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
...
传递启动脚本
GDC 空气隔离设备会根据每个启动脚本的名称按字母顺序运行启动脚本。
下表显示了根据脚本大小应使用的脚本格式:
| 脚本大小 | 脚本格式 | 
|---|---|
| 脚本大小上限:2048 字节 | 清除文字 | 
| 大于 2048 字节的脚本 | Kubernetes Secret | 
定义启动脚本
如需使用启动脚本,您必须将 startupScripts 字段添加到虚拟机 spec 字段。在此字段中,您可以将多个启动脚本指定为纯文本或 Kubernetes Secret。
以下示例将启动脚本指定为明文和 Kubernetes Secret:
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==
请查看以下注意事项:
- 启动脚本会在每次启动时运行。
- 启动脚本具有默认的 root 权限。
- 在 Kubernetes Secret 中,虚拟机 spec中scriptSecretRef的名称必须与metadata.name字段一致。
- 在 Kubernetes Secret 中,通过向 data字段添加键script来指定启动脚本内容。
创建具有 Windows 启动脚本的新虚拟机
如需创建包含 Windows 启动脚本的虚拟机,请按照创建包含启动脚本的新虚拟机中的步骤操作。