找回密码
 立即注册
搜索
查看: 230|回复: 0

[翻译] Windows 镜像处理与 Glazier 入门(第一部分)

[复制链接]

233

主题

0

回帖

2083

积分

管理员

积分
2083
发表于 2025-9-9 15:05:46 | 显示全部楼层 |阅读模式
什么是Glazier?

根据https://github.com/google/glazier#glazierhttps://github.com/google/glazier#why-glazier 的介绍:
  • Glazier是谷歌开发的一款用于自动化部署Windows操作系统的工具。
  • Glazier的创建遵循了以下三个核心原则:基于文本与代码驱动、可扩展性以及可伸缩性


听起来太棒了。我该如何入门呢?

Glazier的README文件建议:
  • 请查看我们的[Glazier]文档网站,了解如何开始使用Glazier。

不过,这个设置概述是“不包含完整配套工具的”。作者期望你已经了解如何创建WIM文件、使用dism命令行工具,以及一些其他常见的Windows系统管理员任务。这些期望是完全合理的。

然而:
  • 我并非专业从事Windows系统管理工作。
  • 我担心,即便我成功手动设置好了Glazier,将来再次操作时,也记不住确切的步骤。

因此,我努力简化并自动化了设置流程,并分享了一种可复现的方法来创建支持Glazier的WinPE ISO镜像。希望这些成果能对你有所帮助


设置 Glazier

创建 WinPE“工厂”
  • 在任意平台上设置一台 Windows 10 虚拟机,平台可以是 AWS、GCP、VMWare(ESXI 或 Fusion)等。我们稍后将使用这台虚拟机来创建 WinPE ISO 镜像。
  • 克隆我的 glazier-starter-kit 代码库
    1. git clone https://github.com/discentem/glazier-starter-kit.git
    复制代码
    该代码库包含三个主要内容:
    • 一个 PowerShell 脚本,可自动生成包含 Glazier 及其所有依赖项的 WinPE ISO 镜像
    • 一套完整的 Glazier 配置文件示例
    • 一个 Golang 脚本,可将 Glazier 配置文件同步到 S3

    我将在后面详细讨论这些内容。现在,我们先来谈谈驱动程序。


从你的设备群中收集驱动程序
根据 Glazier 对启动介质的要求,我们需要确保 WinPE 镜像中包含目标设备上启用本地网卡/显卡/存储设备所需的任何驱动程序。因为在 WinPE 阶段需要网络连接才能访问分发点。

为此,你需要针对希望 Windows 10 镜像支持的每种设备型号执行以下步骤。我设备群中的一款笔记本电脑型号是戴尔 XPS 13 9370,所以我将以这款设备为例进行操作。

  • 从你的设备群中取出一台笔记本电脑。确保这台设备上的 Windows 10 系统已更新至最新版本,并且所有最新驱动程序都已安装。我使用的是戴尔设备,所以我使用了戴尔命令更新工具(Dell Command Update)来更新所有驱动程序。
  • 在这台笔记本电脑上,使用“Export-WindowsDriver”命令导出该设备的所有驱动程序。你需要以管理员身份启动 PowerShell 来执行此操作。
    1. Export-Windowsdriver -Online -Destination c:\drivers
    复制代码
    在执行此命令的过程中,你会看到类似这样的输出信息。这仅是输出内容的一部分片段。
    1. ...
    2. Driver           : oem25.inf
    3. OriginalFileName : C:\Windows\System32\DriverStore\FileRepository\killernetworkextension.inf
    4.                    _amd64_635597853a943a8a\killernetworkextension.inf
    5. Inbox            : False
    6. ClassName        : Extension
    7. BootCritical     : False
    8. ProviderName     : Rivet Networks LLC
    9. Date             : 4/16/2020 12:00:00 AM
    10. Version          : 2.2.3267.0
    11. ...
    12. ...
    13. Driver           : oem28.inf
    14. OriginalFileName : C:\Windows\System32\DriverStore\FileRepository\killernetworkcomponent.inf
    15.                    _amd64_2caa3873bf7cf75d\killernetworkcomponent.inf
    16. Inbox            : False
    17. ClassName        : SoftwareComponent
    18. BootCritical     : False
    19. ProviderName     : Rivet Networks LLC
    20. Date             : 4/16/2020 12:00:00 AM
    21. Version          : 2.2.3267.0
    复制代码

  • 将笔记本电脑上 C:\drivers 目录中的全部内容,复制到 Windows 10 虚拟机的 C:\drivers\dell\xps\9370 目录下。请注意,从技术角度讲,我们实际上只需要与网卡(NIC)、显卡(Video)或存储设备(Storage)相关的驱动程序来支持 WinPE。不过,因为我懒得筛选,所以我会直接复制所有驱动程序。将 C:\drivers 复制回虚拟机后,该目录结构应如下所示(每个子文件夹都包含单个驱动程序的对应文件,此为部分片段):
    1. PS C:\Users\brandon> ls C:\drivers\dell\xps\9370
    2. Directory: C:\drivers\dell\xps\9370
    3. Mode                 LastWriteTime         Length Name
    4. ----                 -------------         ------ ----
    5. d-----         6/19/2021   5:01 PM                atheros_bth.inf_amd64_059e038b6e018050
    6. d-----         6/19/2021   5:01 PM                cui_dch.inf_amd64_b8e01d9e8716d2a7
    7. d-----         6/19/2021   5:01 PM                detectionverificationdrv.inf_amd64_dcc202b5af4a34b5
    8. ...
    复制代码

  • 对你想支持的每一款设备型号,都重复上述第1至3步的操作,同时为每款型号单独设立一个文件夹进行存放。有关驱动程序管理的全面控制方法,可参考相关文档获取更多信息。

设置 Glazier 分发点

设置 Web 服务器
根据 Glazier 官方文档中的设置指南,我们需要搭建一个 Web 服务器来托管 Glazier 配置文件。我将使用 Amazon S3 作为示例,但你也可以使用任何支持 HTTPS 的 Web 服务器。以下是几点重要说明:
  • 默认情况下,Glazier 不会为资源下载提供网页认证功能。因此,你的网页服务器需要向互联网开放访问,或者置于网络访问控制列表(ACL)之后,抑或采用其他形式的基于设备的认证方式。
  • Fresnel 是谷歌 WinOps 团队的另一个开源项目,它能够为 Glazier 提供经过认证的下载服务。不过,本文不涉及 Fresnel 的相关内容。

如果你不使用 S3:请自行搭建 Web 服务,然后直接跳转到“熟悉 Glazier”部分。

设置 S3
  • 创建 S3 存储桶。你可以通过 AWS 控制台、Terraform 的 AWS 提供商或其他你选择的工具来完成此操作。更多信息请参见 AWS 官方文档:创建存储桶。
  • 关闭“阻止所有公共访问”设置。AWS 控制台(如下方截图所示)会持续显示警告,提示你不应将“阻止所有公共访问”设置为“关闭”,因为对于托管在 S3 上的任何服务而言,这通常都不是推荐做法。然而,由于我们尚未设置 Fresnel,因此需要为 Glazier 关闭此设置。免责声明:若将 Glazier 部署于生产环境,建议重新启用"阻止所有公共访问"设置,并部署 Fresnel 或其他身份验证机制以保障安全。
    public_access.png
  • 授予所有人(公开)对 S3 存储桶的读取和列表访问权限。免责声明:若将 Glazier 部署于生产环境,不建议执行此操作。请改用 Fresnel 或与安全工程师协作设计身份验证机制。
    everyone_list_read.png

熟悉 Glazier
  • 花几分钟时间阅读以下资源。这些文档将帮助你了解 Glazier 配置文件的布局和语法,以便你能根据自身环境对 Glazier 进行定制化配置。
  • 如果需要,你可以 fork(复制)仓库 glazier-starter-kit/glazier-repo,并根据实际需求进行定制化修改。不过,初期阶段你未必需要立即进行任何定制。glazier-starter-kit/glazier-repo 已包含一套完整的配置文件,这些基础配置虽然功能有限,但足以支持你完成一个 Glazier 的概念验证(Proof-of-Concept)项目。

上传 Glazier 配置文件
  • 将 glazier-starter-kit/glazier-repo 中的所有内容(包括你添加或修改的文件)上传至你的 Web 服务器。上传完成后,Web 服务器的根目录结构应类似如下:
    1. % ls -1
    2. dev
    3. stable
    4. version-info.yaml
    复制代码
    如果你将 Amazon S3 用作分发点,可以使用我编写的 Go 二进制工具将 Glazier 配置文件上传至你的 Glazier 分发点。使用我的 main.go 脚本步骤如下:
  • 记录下 Web 服务器的 URL。如果你使用的是 S3,其格式将为:https://你的存储桶名称.s3.amazonaws.com/


创建 WinPE ISO 和 USB 驱动器
回到虚拟机环境中继续操作
  • 再次以管理员身份启动 PowerShell,并新建一个执行策略为 Bypass 的会话。
    1. powershell.exe -ExecutionPolicy Bypass
    复制代码

  • 运行 bootstrap_winpe.ps1 脚本。注意:根据你克隆 glazier-starter-kit 的位置不同,该脚本可能位于你计算机上的其他目录中。
    1. C:\glazier-starter-kit\tools\bootstrap_winpe.ps1 --config_server https://YOUR_WEBSERVER_OR_BUCKETNAME_URL_GOES_HERE
    复制代码
    几分钟后,你应该会看到输出结果以如下形式结束:
    1. Done.
    2. NoPromptIso: C:\OSDCloud\OSDCloud_NoPrompt.ISO
    3. =========================================================================
    4. 2021-06-27-142237 New-OSDCloud.ISO Completed in 00 minutes 10 seconds
    5. OSDCloud ISO created at C:\OSDCloud\OSDCloud.ISO
    6. =========================================================================
    复制代码
    如需了解该脚本的完整功能说明,请查看 GitHub 代码库中的注释:https://github.com/discentem/gla ... bootstrap_winpe.ps1
    1)安装 Chocolatey 包管理器
    2)通过 Chocolatey 安装 Windows ADK 及 WinPE 组件
    3)安装并导入 OSDeploy PowerShell 模块
    4)创建 OSDCloud 模板和 OSDCloud 工作区
    5)下载 Python 运行环境
    6)将驱动程序安装至 WIM 镜像
    7)挂载 boot.wim 文件(在磁盘上展开 WinPE 文件系统)
    8)在 WIM 镜像中安装 Python
    9)通过 Chocolatey 安装 Git
    10)将 Glazier 仓库克隆至已挂载的 WIM 镜像,并执行 git pull 更新
    11)安装 Glazier 所需的 Python 依赖包
    12)写入自定义 startnet.cmd 脚本,实现开机自动连接 Wi-Fi 并启动 Glazier
    13)打包上述所有内容生成完整的 ISO 文件

    多次运行该脚本是安全的。部分步骤具有幂等性(重复执行不会影响最终结果),其他步骤虽会重复操作但最终仍能生成正确的 ISO 镜像。
  • 使用你喜欢的工具,将 C:\OSDCloud\OSDCloud_NoPrompt.ISO 制作成可启动 U 盘。我常用 New-OSDCloud.usb 脚本,但理论上 UNetBootin、Rufus 或其他同类工具均可胜任。

开始“镜像部署”

  • 从你新制作的 U 盘启动设备群中的任意一台机器。
  • 启动 U 盘后,若未连接以太网(有线网络),系统将提示你选择 Wi-Fi 网络。
    2.png
  • 成功连接网络后,将自动运行 autobuild.ps1 脚本。该脚本大量借鉴了 @tseknet 公开的 autobuild.ps1 示例(感谢分享!)。
    1. X:\windows\system32>powershell -NoProfile -NoLogo -WindowStyle Maximized -NoExit
    2. -File "X:\Windows\System32\autobuild.ps1" -config_server https://YOUR_WEBSERVER_OR_BUCKETNAME_URL_HERE
    复制代码
  • 如果你使用的是我提供的原始配置文件来运行 Glazier,接下来你将看到以下界面。
    8.png
    你看到这个界面是因为我在 build.yaml 配置文件中进行了相关设置。更多信息请参考:Glazier YAML 配置文档 - 选择器界面
    1. - pin: ''
    2.   choice:
    3.      name: test_thing
    4.      type: toggle
    5.      prompt: "test toggle"
    6.      options: [
    7.         {label: 'False', value: False, tip: ''},
    8.         {label: 'True', value: True, tip: ''},
    9.      ]
    10. - pin: ''
    11.   ShowChooser: []
    复制代码
    该徽标(Logo)已从以下地址复制到 WIM 镜像中:Glazier 启动工具包资源 - Logo 文件(具体复制操作见工具脚本第132行:bootstrap_winpe.ps1#L132
    Glazier 要求徽标必须存放在资源目录下:Glazier 源码 - 选择器模块配置
  • 点击「立即镜像部署」或等待 60 秒后,Glazier 将自动执行我预设的 PowerShell 命令

耶!我们成功啦!等等……我们到底做了什么?

我们以可复用的方式部署了 Glazier,并配置它完成了一些基础操作。这只是一个概念验证(POC),但它的潜力远不止于此!更多功能请参考:Glazier 官方文档 - 自动化操作清单。


后续行动建议
我们实际上需要对正在「镜像部署」的计算机进行磁盘分区。
  • 问题:你可能已经注意到,我们实际上并没有真正进行“镜像(部署镜像到系统)”操作。我们只是让Glazier给出日期信息然后退出。
  • 解决方案:编写一个PowerShell脚本,该脚本能实际对驱动器进行分区,并将一个纯净的Windows 10 WIM镜像文件展开到该驱动器上。类似OSDCloud中的(相关操作) 。


面向互联网开放的Web服务器是不安全的。
  • 问题:Glazier没有开箱即用的客户端身份验证方法。它默认并不安全。
  • 解决方案:启动谷歌的Fresnel项目
  • 进阶解决方案:编写一个与Fresnel功能相当、但可托管在AppEngine之外其他地方的(身份验证)项目。


我们应在启动进入主机操作系统后,对一些“镜像部署后”的任务实现自动化。
  • 问题:即便我们解决了驱动器分区并安装了纯净版Windows 10的问题,我们仍未完成任何新颖或特别的操作。我们还应安装一些软件包,例如配置管理工具(Puppet或Saltstack)以及软件包管理器(Chocolatey、Googet或Gorilla)。
  • 解决方案:在Glazier配置中添加一些内容,以便在主机操作系统安装完成后自动登录并执行相关操作。可参考https://github.com/google/glazie ... .md#images--sysprep 获取一些思路。


我们可以用Go语言编写一些新的Glazier操作,或者对整个工具进行重新构思设计。
  • 问题:在Windows预安装环境(WinPE)中设置Python环境极其麻烦。如果Glazier是一个单一的Go语言可执行二进制文件,那么设置工作会容易得多。看起来谷歌公司的人也有同样的想法。但目前,还没有任何Glazier操作使用这段(Go)代码(至少目前还没有)。
  • 可能的解决方案:
    1)编写一些调用上述Go代码的Glazier操作。
    2)一个相对大胆的想法:使用https://github.com/google/starlark-go ,编写一个全新的镜像部署工具,该工具使用Starlark语言而非YAML语言(来配置)。


有问题、需要澄清或有评论要发表吗?
请在我的博客的GitHub仓库(https://github.com/discentem/blog-content )中提交问题(issue)或拉取请求(PR,pull request)。如果你想针对这篇特定文章提交拉取请求,可以在这里找到该文章的源文件。


致谢
感谢谷歌WinOps团队开发了Glazier工具。这个工具着实激发了我的想象力。
感谢@contains_eng,是你启发我写些东西来帮助人们配置Glazier。很抱歉,迟到了好几年
感谢@tseknet,总是耐心解答我的问题,还总是抓住机会完善Glazier的文档。你太棒了!我很怀念和你共事的时光,老伙计。
感谢@seguraosd开发了超棒的OSDCloud工具。
感谢@editingemilyMacDevOpsYVR主题演讲中,坦诚分享自己写书过程中的挣扎与历程。与写书相比,这篇博客文章的篇幅微不足道,但在我写作遇到困难时,你依然激励着我坚持下去。
感谢@groob向我介绍了starlark-go。虽然我尚未在生产工具中使用它,但一直在努力寻找应用场景

原文链接

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表