2021-12-09

Windows 系统封装...

Windows 系统封装的一个新办法

一
一不注意, Typora官网竟然不能访问了, 本来还说正式版终于出来了, 准备买个授权支持一下. ![typora](https://gitee.com/houyufengatgitee/img_bed/raw/1fe57f169b0f3bce4a0fc86f175192fab90c53ba/windowsdeploy/typora.png) 不知道这软件或软件作者干什么了, 也不知道为什么被屏蔽了, 只能希望后续还能放开. 这篇文章只好暂时用Visual Studio Code来写, 又得面对这个傻大黑粗的界面, 而且不是所见即所得,还得开个预览界面... ![vscode](https://gitee.com/houyufengatgitee/img_bed/raw/master/windowsdeploy/vscode.png) 不过这里还是安利一下VS Code, 不愧是微软的作品, 功能强大, 插件丰富, 无论是敲敲Python代码还是拿来写文章, 或者作为数据库管理, 都相当好用, 堪称瑞士军刀. 这么棒的好工具还是开源免费, 说真的, 除了Windows, 微软现在做的东西都非常出色...
二
说到Windows, 今天开始我想聊聊系统封装和部署的问题. 作为完全没干过一天IT的披着计算机信息行业从业人员外衣的男性文员, 这段时间也有花时间研究一下Windows封装和部署的课题, 所以你们知道为什么Python教程和温格自传翻译都停滞了. 当然了, 这样的停滞可能会继续进行, 因为昨天小齐告诉我一个好消息, 俩米的期末考试安排好像出来了, 这对我这样的居家男性简直就是晴天霹雳, 要知道, 每次给俩米弄作业, 望着俩米看着我的纯净而天真的大眼睛, 我知道, 这道题肯定是不会了, 唉...

跑题了, 说到Windows封装和部署, 我的理解是, 这个工作的核心目的是:

为特定使用场景下的大量电脑设置统一的Windows系统及软件, 最终实现客户开机即用

Windows封装和部署的常用场景, 一般是品牌电脑出厂预装系统. 比如, 您买来一台联想电脑, 进入系统后会发现除了Windows系统本体, 往往会有厂商预制的一些工具类软件和设置. 另一种常见的场景是, 针对专门客户, 往往会根据客户要求对系统进行定制, 例如联想卖给Google 几千台ThinkStation 工作站, 可能会根据Google的要求预装他们想要的软件, 这时就需要对Windows系统进行定制和封装.

我理解的Windows 系统定制和封装, 大概包括这么几个步骤:

  • Windows 系统本身
  • 运行定制系统的电脑的驱动程序
  • Windows 系统的个性化设置 (如客户要求统一的桌面壁纸)
  • 客户所需的各种软件

至于一般的封装步骤, 微软给的方案是从这批要部署定制系统的电脑里找出一台, 然后先正常安装系统, 驱动, 软件, 进行个性化设置, 然后用Windows自带的sysprep工具进行封装, 最后用DISM工具抓取系统分区映像, 最后再把抓取到的映像部署到剩下的电脑里.

三
如果只是这个思路, 我就不用专门写文章说了. 这里我给出大家一个新思路, 就是不需要实体电脑, 直接利用Windows自带的Hyper-V虚拟机进行系统的封装, 步骤跟利用实体电脑没有大区别, 唯一有差异的, 就是驱动程序安装. 因为Hyper-V模拟的硬件环境肯定和实体电脑不一样, 直接楞装驱动保证会出错, 对不对? 所以我给出的思路是, 直接用DISM, 把驱动直接集成到Windows安装镜像里, 岂不美哉? 一般大的PC生产商都会对商用电脑提供驱动包, 方便驱动的集成, 比如联想商用产品的驱动包可以在这里找到 [联想驱动包部署](https://support.lenovo.com/us/en/solutions/ht074984). 把驱动包下载回来, 在处理Windows安装镜像时, 直接用DISM进行集成即可:

dism /image:<Windows 映像所在目录> /add-driver: /driver:<驱动包所在目录> /recurse

这样就会得到一个包含所需驱动程序的Windows镜像, 用这个镜像拿到虚拟机里安装, 就能确保虚拟机里的系统既包含了驱动, 又不会出现报错.

使用虚拟机代替实体电脑进行系统封装的另一个好处, 则是支持”反悔”和改过. Windows自带的Hyper-V虚拟机集成了强大的检查点功能, 说白了, 您可以在安装和设置Windows系统时随时设置检查点, 一旦出错就可以退回到最近的检查点, 确保封装的顺利进行.
Windows封装
比如这里我大概弄了二十多个检查点, 每做一步操作就设置一个, 遇到错误就退回上一个检查点重新进行该操作, 这样得到的系统, 基本不会有任何问题 ,这是在实体电脑上无法实现的功能. 至于如何把系统抓出来? 自然是为这个虚拟机添加第二块虚拟硬盘, 然后用Windows PE启动这个虚拟机, 在Windows PE里直接抓取虚拟系统的系统分区 (这里我严重推荐ffu闪存格式, 据说是当初为Windows Phone系统部署设计的, 用在电脑上好用的一批)
dism /capture-ffu /capturedrive:\\.\physicaldrive<系统分区所在磁盘的编号> /imagefile:<第二个虚拟硬盘分区>\windows.ffu /name:<随便写点什么>
这样, 封装好的系统就会以ffu闪存格式存在第二个虚拟硬盘分区里, 直接挂载虚拟硬盘, 把ffu文件拷出来就能用喽.

四
这篇文章算不上教程, 仅仅是一个思路的描述, 核心就是用虚拟机代替实体电脑进行系统封装. 后续我计划把一些封装过程中用到的工具和代码放到github上供大家研究和使用, 当然了, 目前看这件事遥遥无期~~~

2021年已经接近尾声了, 我也不由自主开始回味这一年的点点滴滴. 学会了什么, 领悟了什么, 给谁带来了温暖? 还有什么问题没解决, 还有哪些遗憾需要弥补, 我又伤害了谁? … 我恐惧于虚度人生, 我害怕浪费时间, 我不希望做错事情. 希望接下来的时间能提高效率, 再多做些事情, 多学些东西, 多温暖身边的人. 2021, 请等我一下.