如需在 Google Cloud 上创建 Windows 虚拟机,您必须使用预安装了 Windows 或 Windows Server 的虚拟机映像。Google Cloud 可提供公共映像常用映像,但这些映像仅适合按需许可。如需自带 Windows 许可 (BYOL),您必须导入现有映像,或构建自定义映像。
本指南介绍如何使用 Google Cloud 用于创建公共映像的相同工具和流程来创建自定义映像。
要完成本指南,您需要:
- 包含 Windows 或 Windows Server 安装介质的 ISO 文件。
- (可选)一个或多个要应用于映像的 Windows 更新软件包(格式为
.msu
)。
准备工作
- 如果您要使用本指南中的命令行示例,请执行以下操作:
- 安装或更新到 Google Cloud CLI 的最新版本。
- 设置默认区域和可用区。
- 如果您要使用本指南中的 API 示例,请设置 API 访问权限。
了解构建流程
要从头开始安装 Windows,一种常用的方法是从包含 Windows 安装文件的 DVD 或 ISO 文件启动计算机。与某些本地管理程序不同,Compute Engine 不允许从 ISO 文件启动。
因此,如需从头开始安装 Windows,您必须按照下面的不同方法执行操作:
- 创建新磁盘。
- 将 Windows 映像(来自安装介质的
install.wim
)提取到磁盘中。 - 添加必要的驱动程序、配置 Windows 安装程序以使其处于无人参与状态,并使磁盘变为可启动状态。
- 从新磁盘启动以运行 Windows 安装程序。
- 正在安装其他软件,包括访客操作系统代理。
- 从磁盘创建映像。
本指南将介绍如何使用 Cloud Builddaisy
(GitHub 上可用)以自动执行该过程。
daisy
是一个开源命令行工具,可让您执行工作流。工作流以 JSON 文件编写,并包含一系列步骤。每个这样的步骤都描述了一项 Compute Engine 操作,例如创建磁盘或关停虚拟机实例。因此,同理工作流非常适合自动执行从头开始构建 Windows 映像所需的步骤。
用于构建自定义 Windows 映像的 daisy 工作流会创建两个临时虚拟机实例。第一个虚拟机实例(前缀为 bootstrap
)执行必要的步骤来创建可启动的磁盘。第二个虚拟机实例(前缀为 install
)运行 Windows 安装程序并执行所有剩余步骤。
准备项目以用于构建映像
如需防止 daisy 工具与现有虚拟机实例或基础架构的干扰,请创建一个专用映像来构建映像:
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
- 启用 Compute Engine API、Cloud Build API 和 Cloud Storage API。
后续步骤取决于您是在本地计算机上使用 Windows 还是 Linux:
Windows
- 在本地计算机上,打开一个 Windows PowerShell 窗口。
初始化变量:
$PROJECT_ID = "
PROJECT_ID
"其中,
PROJECT_ID
是您在上一部分中创建的 Cloud 项目的 ID。初始化另一个变量,使其包含项目的项目编号:
$PROJECT_NUMBER = gcloud projects describe $PROJECT_ID --format=value`(projectNumber`)
停用 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
向 Cloud Build 授予 Compute Instance Admin 和 Service 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
- 在本地计算机上,打开一个终端窗口。
初始化变量:
PROJECT_ID=
PROJECT_ID
其中,
PROJECT_ID
是您在上一部分中创建的 Cloud 项目的 ID。初始化另一个变量,使其包含项目的项目编号:
PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format=value\(projectNumber\)`
停用 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
向 Cloud Build 授予 Compute Instance Admin 和 Service 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 存储分区中,您可以确保这些文件可供 daisy
和 daisy
用于构建映像的临时虚拟机实例访问。
在本地计算机上下载所需的安装软件包:
创建新的 Cloud Storage 存储分区以存储安装文件:
gsutil mb -p $PROJECT_ID gs://$PROJECT_ID-media
向 Cloud Build 授予 Storage Object Viewer 角色,以便它可以读取安装文件:
gsutil iam ch serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com:objectViewer gs://$PROJECT_ID-media
上传 PowerShell 安装软件包:
gsutil cp
POWERSHELL_PACKAGE
gs://$PROJECT_ID-media/PowerShell.msi其中
POWERSHELL_PACKAGE
是 PowerShell 安装软件包的路径。上传 .NET Framework 安装软件包:
gsutil cp
DOTNET_PACKAGE
gs://$PROJECT_ID-media/dotnet-sdk.exe其中
DOTNET_PACKAGE
是 NET Framework 安装软件包的路径。上传 gcloud CLI 安装软件包:
gsutil cp
CLOUDSDK_PACKAGE
gs://$PROJECT_ID-media/GoogleCloudSDKInstaller.exe其中
CLOUDSDK_PACKAGE
是 gcloud CLI 安装软件包的路径。上传包含 Windows 安装介质的 ISO 文件:
gsutil cp
ISO
gs://$PROJECT_ID-media/其中
ISO
是 ISO 文件的名称。(可选)上传其他更新软件包:
gsutil cp
UPDATE_DIR
/*.msu gs://$PROJECT_ID-media/updates/其中
UPDATE_DIR
是包含更新软件包的目录。
现在,您可以构建自定义映像了。
构建映像
执行 daisy
工作流来构建自定义映像最多需要 4 个小时。现在,您可以创建 Cloud Build 配置,让 Cloud Build 在后台执行工作流,而无需在本地运行 daisy
。
在本地计算机上,克隆包含用于构建 Windows 映像的
daisy
工作流的 Git 代码库:git clone https://github.com/GoogleCloudPlatform/compute-image-tools.git
切换到
windows
目录:cd compute-image-tools/daisy_workflows/image_build/windows/
在
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 映像的本地路径。在
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 版本对应的工作流文件的名称。
将构建提交到 Cloud Build:
gcloud builds submit --project $PROJECT_ID --async
构建大约需要 4 小时才能完成。您可以在 Google Cloud Console 中的 Cloud Build > 历史记录下跟踪构建的状态。
使用自定义映像
构建完成后,您可以在 Google Cloud 控制台中的 Compute Engine > 映像下找到自定义 BYOL 映像。
为了便于区分同一映像的多个版本,构建过程会在映像名称中嵌入时间戳,例如 windows-server-2019-dc-v1613488342
。此外,该过程会将该映像与自定义映像系列相关联,例如 windows-server-2019
。
如需创建使用自定义 BYOL 映像的虚拟机实例,您必须在单租户节点上预配虚拟机实例。
问题排查
如果您怀疑构建流程失败或没有进展,请使用以下方法来诊断这种情况:
- 确认您是否上传了正确的安装软件包和 ISO 文件。
- 请确认您选择的工作流与 Windows 文件的 Windows 版本一致。
- 查看 Cloud Build 中的构建日志 ,并检查是否有任何错误消息。
- 如果构建看起来卡住,请查看构建创建的虚拟机实例的串行端口输出,并检查错误消息。
后续步骤
- 详细了解 daisy 工具。
- 详细了解用于构建映像的 daisy 工作流。
- 了解如何将现有许可引入 Compute Engine。
- 了解使用映像系列的最佳做法。