创建自定义 Windows 自带许可 (BYOL) 映像


如需在 Google Cloud 上创建 Windows 虚拟机,您必须使用预安装了 Windows 或 Windows Server 的虚拟机映像。Google Cloud 可提供公共映像常用映像,但这些映像仅适合按需许可。如需自带 Windows 许可 (BYOL),您必须导入现有映像,或构建自定义映像。

本指南介绍如何使用 Google Cloud 用于创建公共映像的相同工具和流程来创建自定义映像。

要完成本指南,您需要:

  • 包含 Windows 或 Windows Server 安装介质的 ISO 文件。
  • (可选)一个或多个要应用于映像的 Windows 更新软件包(格式为 .msu)。

准备工作

了解构建流程

要从头开始安装 Windows,一种常用的方法是从包含 Windows 安装文件的 DVD 或 ISO 文件启动计算机。与某些本地管理程序不同,Compute Engine 不允许从 ISO 文件启动。

因此,如需从头开始安装 Windows,您必须按照下面的不同方法执行操作:

  1. 创建新磁盘。
  2. 将 Windows 映像(来自安装介质的 install.wim)提取到磁盘中。
  3. 添加必要的驱动程序、配置 Windows 安装程序以使其处于无人参与状态,并使磁盘变为可启动状态。
  4. 从新磁盘启动以运行 Windows 安装程序。
  5. 正在安装其他软件,包括访客操作系统代理。
  6. 从磁盘创建映像。

本指南将介绍如何使用 Cloud BuilddaisyGitHub 上可用)以自动执行该过程。

daisy 是一个开源命令行工具,可让您执行工作流。工作流以 JSON 文件编写,并包含一系列步骤。每个这样的步骤都描述了一项 Compute Engine 操作,例如创建磁盘或关停虚拟机实例。因此,同理工作流非常适合自动执行从头开始构建 Windows 映像所需的步骤。

用于构建自定义 Windows 映像的 daisy 工作流会创建两个临时虚拟机实例。第一个虚拟机实例(前缀为 bootstrap)执行必要的步骤来创建可启动的磁盘。第二个虚拟机实例(前缀为 install)运行 Windows 安装程序并执行所有剩余步骤。

准备项目以用于构建映像

如需防止 daisy 工具与现有虚拟机实例或基础架构的干扰,请创建一个专用映像来构建映像:

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 启用 Compute Engine API、Cloud Build API 和 Cloud Storage API。

    启用 API

后续步骤取决于您是在本地计算机上使用 Windows 还是 Linux:

Windows

  1. 在本地计算机上,打开一个 Windows PowerShell 窗口。
  2. 初始化变量:

    $PROJECT_ID = "PROJECT_ID"
    

    其中,PROJECT_ID 是您在上一部分中创建的 Cloud 项目的 ID。

  3. 初始化另一个变量,使其包含项目的项目编号:

    $PROJECT_NUMBER = gcloud projects describe $PROJECT_ID --format=value`(projectNumber`)
    
  4. 停用 RDP 和 SSH 访问的默认防火墙规则

    gcloud compute firewall-rules update default-allow-rdp --project $PROJECT_ID --disabled
    gcloud compute firewall-rules update default-allow-ssh --project $PROJECT_ID --disabled
    
  5. 向 Cloud Build 授予 Compute Instance AdminService Account User 角色,以便 Cloud Build 可以创建构建映像所需的临时虚拟机实例:

    gcloud projects add-iam-policy-binding $PROJECT_ID `
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com `
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID `
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com `
       --role roles/iam.serviceAccountUser
    

Linux

  1. 在本地计算机上,打开一个终端窗口。
  2. 初始化变量:

    PROJECT_ID=PROJECT_ID
    

    其中,PROJECT_ID 是您在上一部分中创建的 Cloud 项目的 ID。

  3. 初始化另一个变量,使其包含项目的项目编号:

    PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format=value\(projectNumber\)`
    
  4. 停用 RDP 和 SSH 访问的默认防火墙规则

    gcloud compute firewall-rules update default-allow-rdp --project $PROJECT_ID --disabled
    gcloud compute firewall-rules update default-allow-ssh --project $PROJECT_ID --disabled
    
  5. 向 Cloud Build 授予 Compute Instance AdminService Account User 角色,以便 Cloud Build 可以创建构建映像所需的临时虚拟机实例:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    

上传安装文件

现在,您可以收集自定义映像所需的所有安装文件,并将其上传到 Cloud Storage 存储分区。通过将文件存储在 Cloud Storage 存储分区中,您可以确保这些文件可供 daisydaisy 用于构建映像的临时虚拟机实例访问。

  1. 在本地计算机上下载所需的安装软件包:

  2. 创建新的 Cloud Storage 存储分区以存储安装文件:

    gsutil mb -p $PROJECT_ID gs://$PROJECT_ID-media
    
  3. 向 Cloud Build 授予 Storage Object Viewer 角色,以便它可以读取安装文件:

    gsutil iam ch serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com:objectViewer  gs://$PROJECT_ID-media
    
  4. 上传 PowerShell 安装软件包:

    gsutil cp POWERSHELL_PACKAGE gs://$PROJECT_ID-media/PowerShell.msi
    

    其中 POWERSHELL_PACKAGE 是 PowerShell 安装软件包的路径。

  5. 上传 .NET Framework 安装软件包:

    gsutil cp DOTNET_PACKAGE gs://$PROJECT_ID-media/dotnet-sdk.exe
    

    其中 DOTNET_PACKAGE 是 NET Framework 安装软件包的路径。

  6. 上传 gcloud CLI 安装软件包:

    gsutil cp CLOUDSDK_PACKAGE gs://$PROJECT_ID-media/GoogleCloudSDKInstaller.exe
    

    其中 CLOUDSDK_PACKAGE 是 gcloud CLI 安装软件包的路径。

  7. 上传包含 Windows 安装介质的 ISO 文件:

    gsutil cp ISO gs://$PROJECT_ID-media/
    

    其中 ISO 是 ISO 文件的名称。

  8. (可选)上传其他更新软件包:

    gsutil cp UPDATE_DIR/*.msu gs://$PROJECT_ID-media/updates/
    

    其中 UPDATE_DIR 是包含更新软件包的目录。

现在,您可以构建自定义映像了。

构建映像

执行 daisy 工作流来构建自定义映像最多需要 4 个小时。现在,您可以创建 Cloud Build 配置,让 Cloud Build 在后台执行工作流,而无需在本地运行 daisy

  1. 在本地计算机上,克隆包含用于构建 Windows 映像的 daisy 工作流的 Git 代码库:

    git clone https://github.com/GoogleCloudPlatform/compute-image-tools.git
    
  2. 切换到 windows 目录:

    cd compute-image-tools/daisy_workflows/image_build/windows/
    
  3. windows 目录中,找到一组带有后缀 .wf.json 的文件。以下文件包含常用 Windows 版本的 Daisy 工作流定义:

    Windows 版本 工作流文件
    Windows Server 2019(64 位) windows-server-2019-dc-uefi-byol.wf.json
    Windows Server Core 2019(64 位) windows-server-2019-dc-core-uefi-byol.wf.json
    Windows Server 2016(64 位) windows-server-2016-dc-uefi-byol.wf.json
    Windows Server Core 2016(64 位) windows-server-2016-dc-core-uefi-byol.wf.json
    Windows 10(64 位) windows-10-20h2-ent-x64-uefi-byol.wf.json

    打开与要安装的 Windows 版本最匹配的工作流文件。如有必要,请更改工作流文件中的 Windows 版本 (edition) 和许可密钥 (product_key) 设置,使其与您的安装介质相匹配。

    如果您不确定正确的版本名称,请打开提升权限的 PowerShell 提示符,然后运行以下命令以列出安装介质支持的所有版本:

    $IsoFile = "ISO"
    
    $Mount = Mount-DiskImage -ImagePath (Resolve-Path $IsoFile)
    
    $DriveLetter = ($Mount | Get-Volume).DriveLetter
    Get-WindowsImage -ImagePath "$($DriveLetter):\sources\install.wim" | select ImageName
    
    Dismount-DiskImage -InputObject $Mount | Out-Null
    

    ISO 替换为 ISO 映像的本地路径。

  4. windows 目录中,创建一个名为 cloudbuild.yaml 的新文件并粘贴以下代码:

    timeout: 14400s  # 4 hour timeout for entire build
    steps:
    - name: 'gcr.io/compute-image-tools/daisy'
      timeout: 14400s  # 4 hour timeout for build step
      args:
        - -project=$PROJECT_ID
        - -zone=us-central1-a
        - -var:updates=gs://$PROJECT_ID-media/updates/
        - -var:pwsh=gs://$PROJECT_ID-media/PowerShell.msi
        - -var:dotnet48=gs://$PROJECT_ID-media/dotnet-sdk.exe
        - -var:cloudsdk=gs://$PROJECT_ID-media/GoogleCloudSDKInstaller.exe
        - -var:media=gs://$PROJECT_ID-media/ISO
        - WORKFLOW
    

    您需要将其中的:

    • ISO:Cloud Storage 中的 ISO 文件的名称。
    • WORKFLOW:与您使用的 Windows 版本对应的工作流文件的名称。
  5. 将构建提交到 Cloud Build:

    gcloud builds submit --project $PROJECT_ID --async
    

    构建大约需要 4 小时才能完成。您可以在 Google Cloud Console 中的 Cloud Build > 历史记录下跟踪构建的状态。

    Cloud Build 记录

使用自定义映像

构建完成后,您可以在 Google Cloud 控制台中的 Compute Engine > 映像下找到自定义 BYOL 映像。

为了便于区分同一映像的多个版本,构建过程会在映像名称中嵌入时间戳,例如 windows-server-2019-dc-v1613488342。此外,该过程会将该映像与自定义映像系列相关联,例如 windows-server-2019

如需创建使用自定义 BYOL 映像的虚拟机实例,您必须在单租户节点上预配虚拟机实例

问题排查

如果您怀疑构建流程失败或没有进展,请使用以下方法来诊断这种情况:

  • 确认您是否上传了正确的安装软件包和 ISO 文件。
  • 请确认您选择的工作流与 Windows 文件的 Windows 版本一致。
  • 查看 Cloud Build 中的构建日志 ,并检查是否有任何错误消息。
  • 如果构建看起来卡住,请查看构建创建的虚拟机实例的串行端口输出,并检查错误消息。

后续步骤