做系统维护这十几年,被问得最多的一句就是"有没有现成的系统盘,装完直接能用"。早年我也用过各种来路不明的"装机版""纯净版"镜像,装完桌面一堆图标,浏览器主页被改写,任务计划里还挂着说不清来路的定时任务。后来我干脆自己动手,从微软官方原版镜像开始,一步步做成属于自己的windows 10系统封装镜像:装完开机、填个名字、进桌面,常用软件、驱动、运行库、系统设置全都在位,全程十几分钟。这套流程我前后迭代了七八版,给自己用、帮同事装、给亲戚朋友救急,都没出过岔子。
先澄清一个容易被搞混的点。"封装"这个词在不同圈子里意思完全不一样。写代码的人听到封装,想到的是面向对象里的封装继承多态、是接口封装、是开源代码的模块化;画电路的人听到封装,想到的是 QFN、SOD123、0603、0805 这些尺寸和焊盘,是 AD 封装库、嘉立创关联封装、Cadence 原理图封装设计。而这篇讲的既不是芯片封装,也不是代码封装,是系统层面的镜像封装——把一台已经配置好的 Windows 10 系统,通过通用化处理剥离掉硬件绑定信息和用户个性化数据,再抓取成一个可以直接部署到别的机器上的映像文件。
这套东西能解决什么?一句话:把重复劳动一次性做掉。装机时最烦的从来不是点下一步,而是那些装完系统之后的琐事——找驱动、装运行库、关掉一堆用不上的预置应用、改默认设置、调电源方案。封装的本质就是把这些事在母盘上做一次,之后每台机器都省一遍。它适合三类人:经常给身边人装机的个人爱好者、需要给一批配置相近电脑做统一部署的小团队、以及想学明白系统底层机制的技术爱好者。这篇文章我会按实际操作顺序,把环境准备、定制、通用化、抓取、维护、排错全流程写清楚,中间该解释原理的地方不跳过,该给的命令行参数全都给实。
1. 为什么要自己动手封装一套 Windows 10 系统
1.1 封装真正解决的是"一致性"和"时间成本"
很多人以为封装只是为了让装机快一点,其实这只是表层好处。真正的价值在于一致性:十台机器装出十个样子,维护起来就是灾难。今天装的那台缺个 .NET 运行库,明天那台忘了关休眠,后天那台驱动是通用版导致显卡性能打折——每台都要单独排查,时间全耗在琐碎的差异上。做了封装镜像之后,所有机器出厂状态完全相同,出问题只需要在一个环境里复现一次,解决办法可以直接套到所有机器上。
时间成本的账也很好算。一台机器从装系统到能用,纯手工大概需要一到两个小时,其中大部分时间花在等待和找资源上。封装镜像能把首次部署压缩到 15 分钟以内,剩下的一次性投入是制作母盘的那三四个小时。只要你要装的机器超过三台,封装就是划算的;超过十台,不封装简直是在惩罚自己。还有一个隐性收益是可控性:镜像里的每一项设置你都知道为什么在那儿,不会出现装完系统发现某个服务被莫名其妙禁用、某个端口被悄悄打开的情况。
1.2 三条主流技术路线的取舍
目前做 Windows 10 封装,主流有三条路,各有适用面。
| 路线 | 核心手段 | 优点 | 局限 | 适合谁 |
|---|---|---|---|---|
| 审核模式 + sysprep | 进系统做定制,再通用化抓取 | 所见即所得,改动直观,成功率最高 | 需要一台虚拟机反复折腾,母盘体积偏大 | 绝大多数个人和小团队 |
| 离线挂载 + 应答文件 | 用 DISM 挂载 install.wim 离线改 | 不启动系统,速度快,适合批量化 | 改设置要靠注册表离线挂载,门槛高 | 有经验的批量部署场景 |
| 图形化第三方工具 | 现成界面勾选精简项 | 上手快 | 精简过头容易出问题,可调项不透明 | 只想快速出个镜像的人 |
我自己的选择是第一条路为主、第二条路为辅。用审核模式做主体定制,因为你能真实看到每一项改动落地后的效果;涉及到必须离线处理的注册表项、驱动包和补丁,再用 DISM 补进去。第三条路我不太推荐新手一开始就走,那类工具的精简选项看着很爽,但很多是直接删文件加改服务启动类型,装完系统某些功能莫名其妙用不了,排查起来比自己做还费劲。等你把前面两条路走通了,再用工具提效不迟。
1.3 先明确部署场景,再决定精简到什么程度
这一步最容易被跳过,但它决定了后面所有取舍。你要先问自己:这套镜像装到什么样的机器上?
如果是给自己或朋友的几台机器用,硬件型号相对固定,那就大胆一点,把驱动直接打进去,预置应用能删的全删,甚至可以做成固定用户名自动登录,开机即用。如果是给一批型号不一的机器用,比如办公室里台式机笔记本混装,那就必须保守:驱动只能放通用存储控制器和网卡,其余交给首次启动时在线安装;预置应用只删确定用不上的;用户配置保留可选项,不能搞默认自动登录。
还有一个常被忽视的点是授权合规。母盘和部署机都要使用正规渠道获取的 Windows 授权,别在镜像里塞来路不明的激活手段。这不是技术问题,但一旦踩线,后面所有工作都是白做。我的习惯是母盘就装官方原版镜像,授权走自己的合规渠道,封装过程只做定制不做授权处理,这样镜像也能干净地长期使用。
2. 封装环境准备与素材清单
2.1 母盘从哪里来,工具用哪些
母盘只有一个原则:从官方渠道获取的完整原版镜像。第三方网站改过的所谓"纯净原版"不要碰,你无法确认里面有没有被动过手脚。拿到 ISO 之后,先校验一下哈希值,确认文件完整没被替换,这一步花两分钟,能避免后面排查半天。
工具清单我按用途列一下,都是长期在用的:
- Hyper-V 或 VMware Workstation:一台虚拟机用来制作母盘。Hyper-V 是系统自带功能,零成本;VMware 快照管理更方便,反复试错时更省心。我用 VMware,因为可以随时回滚到"刚装完系统"的干净快照。
- DISM:系统自带,负责映像的挂载、驱动注入、抓取、压缩和拆分,整个流程的主角。
- Windows ADK 里的 Windows SIM:用来生成和编辑 unattend.xml 应答文件,图形界面比手写 XML 靠谱得多。
- oscdimg:把抓取好的映像打包回可引导 ISO,是 ADK 的一部分。
- 一个空白 U 盘(16GB 以上):如果不用 ISO 而选择直接部署到 U 盘,U 盘需要足够大。
虚拟机的磁盘规划要提前想好。母盘系统盘建议给80GB 以上,因为我习惯在母盘里预留一部分空间装常用软件。磁盘类型选 NVMe 或 SATA 都行,但一旦选定就不要中途换,否则容易触发存储控制器驱动不匹配的问题。虚拟机内存给 4GB 到 8GB,CPU 给 2 到 4 核,够用了,反正封装过程不吃性能。
2.2 网络策略:什么时候断网,为什么
这是整个准备阶段最反直觉的一步:装好系统进入定制环节后,第一件事是断网。原因有两个。
第一,Windows Update 会在后台偷偷装补丁和驱动。你在前面精心做的定制,可能被一次后台更新覆盖掉;更麻烦的是,某些补丁更新完成后会锁定系统组件,导致后面 sysprep 通用化时报错,而且报错信息含糊得让人抓狂。第二,预置的商店应用会联网自我更新,而现代应用(UWP)是 sysprep 失败的头号元凶之一,更新过的应用更容易锁死用户配置文件。
所以我的做法是:安装系统阶段联网,让安装程序顺利走完;一进桌面立刻禁用网卡或断开虚拟网卡,然后再开始做定制。如果确实需要联网装某个软件,装完立刻再断。等定制全部完成、准备通用化之前,再确认一次网络是断开的。这个习惯帮我省掉过至少五次莫名其妙的 sysprep 报错。
虚拟机快照也要在这一步建立。我一般在三个时间点打快照:刚装完系统进桌面、定制完成后、sysprep 之前。第三个快照尤其重要,因为通用化是不可逆的,万一后面出问题,从这个快照回滚比重装系统快得多。
2.3 定制清单要提前写下来
我踩过的坑里,有一类特别窝火:母盘做完了,抓取完了,装到真机上才发现忘了关休眠、忘了改电源方案、忘了设置虚拟内存位置。然后你面临一个两难——重新做一遍母盘,或者接受这个不完美的镜像。所以我现在的习惯是动手前先写清单。
我的清单一般包含这些类别:系统设置(休眠、快速启动、虚拟内存、系统保护、UAC 级别、电源方案)、桌面与视觉(图标显示、任务栏、文件扩展名、隐藏文件可见)、隐私与通知(遥测、广告 ID、通知中心、Cortana)、预置应用删除范围、常用软件列表(含静默安装参数)、运行库(.NET、VC++ 各版本、DirectX 组件)、驱动段。这份清单我存在文档里,每次做新版本就在上面改,越做越顺手。你也可以照这个结构建一份自己的,第二版开始就会发现效率提升非常明显。
3. 审核模式里的系统定制实操
3.1 进入审核模式的关键操作与原理
Windows 安装完成后会停在 OOBE 界面,让你选语言、连网络、建账户。在这个界面上按 Ctrl+Shift+F3,系统会重启并直接以管理员身份登录到桌面,同时右下角有一个"系统准备工具"的窗口。这就是审核模式(Audit Mode)。
它的原理值得说清楚:普通安装流程里,OOBE 阶段会创建真实用户账户、绑定硬件信息、记录首次使用状态。而审核模式跳过了这一切,让系统处于一个"已安装但未初始化"的中间态。在这个状态下,你做的所有改动——安装软件、改设置、调注册表——都会被记录进系统,并且不会被标记为某个特定用户的行为。等你之后执行 sysprep 时,系统会清理掉这个中间态,把改动的部分保留下来。
那个弹出的"系统准备工具"窗口,直接关掉,不要用它。这个图形界面能做的是很有限的通用化,参数不可控,而且它会把系统直接推到通用化状态,你后面就没法再定制了。我们要用命令行版本的 sysprep,参数自己完全掌控。关掉之后,系统就是一台普通管理员账户登录的电脑,你可以随便折腾。
这里有个必须记住的限制:客户端版 Windows 对 sysprep 的使用次数是有限制的,默认大约三次。这意味着你不能拿一台装着玩儿的机器反复通用化。解决办法就是用虚拟机快照,每次通用化前先打快照,玩坏了就回滚。另外如果你在审核模式里已经做了很多定制,想先保存进度再继续,可以用sysprep /audit /reboot把系统重新推回审核模式并重启,这个操作不会消耗通用化次数。
3.2 预置应用清理:手要稳,别删过头
预置应用清理是定制环节里最容易出事的操作。新手往往一上来就是一句干掉所有应用,结果装完发现"开始"菜单点不开、搜索框没反应、照片查看器打不开。我建议按下面的顺序来,先备份再动手。
先看看到底有哪些:
Get-AppxPackage -AllUsers | Select-Object Name, PackageFullName | Sort-Object Name看清楚列表之后,优先处理这几类:游戏类(各种消消乐、纸牌)、推广类(第三方合作预置的订阅提醒)、以及你确定永远用不到的娱乐应用。对于系统组件类(如 ShellExperienceHost、StartMenuExperienceHost、Windows Store 相关包、运行时框架类),绝对不要动。搜索框和开始菜单的依赖关系很微妙,删掉一个看似无关的框架包,界面就可能整体失效。
删除命令建议写成脚本,一次处理一个包,出问题能定位:
$remove = @( "*XboxGamingOverlay*", "*CandyCrush*", "*BingNews*", "*YourPhone*", "*GetHelp*" ) foreach ($p in $remove) { Get-AppxPackage -AllUsers $p | Remove-AppxPackage -ErrorAction SilentlyContinue Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like $p | Remove-AppxProvisionedPackage -Online -ErrorAction SilentlyContinue }注意这里删了两遍:一遍删当前已安装的实例,一遍删预置包。只删前者的话,新用户首次登录时预置包会重新铺开,白删。这个细节很多教程都不讲,但它是"删了感觉还在"的根本原因。
注意:清理完之后,测试一下开始菜单、搜索、设置页、照片、计算器是否正常。如果你打算在通用化前再试一次,从快照回滚重来远比带着问题往下走划算。
3.3 默认用户配置:CopyProfile 的正确用法
如果你想让自己调好的桌面布局、任务栏位置、文件管理器设置、右键菜单习惯,在部署后每个新用户身上都生效,就需要CopyProfile。它的作用是把当前用户的配置复制到系统默认用户配置里,新账户创建时会继承这套设置。
这里有个关键前提,也是很多人失败的原因:CopyProfile 只在审核模式的内置管理员账户下才起作用。也就是说,你必须在审核模式里用 Administrator 做这些配置,如果你中途创建了一个普通账户去设置,CopyProfile 是不生效的。所以整个定制过程我都建议在审核模式的默认管理员账户里完成,别自作聪明建个新账户。
让 CopyProfile 生效还需要在应答文件里声明。在 unattend.xml 的specialize阶段加入:
<settings pass="specialize"> <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> <CopyProfile>true</CopyProfile> </component> </settings>还有一个配套操作值得做:把带自定义布局的LayoutModification.xml放到C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\目录下,这样开始菜单的磁贴布局也能被固定。不用这个文件的话,新用户的开始菜单还是微软的默认布局,跟你调好的完全不一样。
4. sysprep 通用化与映像抓取
4.1 sysprep 命令行的完整参数
定制做好、快照打好、网络断开、所有应用窗口关闭之后,就可以执行通用化了。命令是这条:
C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown /unattend:C:\unattend.xml逐个参数解释一下,别照抄不理解:
/generalize:通用化的核心动作。它会清除 SID、硬件绑定信息、事件日志、驱动缓存等,让映像变成"可以装到别的机器上"的状态。这是不可逆的,执行完这台母盘就不能再正常使用了。/oobe:部署完成后进入开箱体验流程,也就是让最终用户走选语言、建账户那几步。如果你想要完全无人值守,就靠应答文件把这些步骤填掉。/shutdown:通用化完成后关机。我一般用这个而不用/reboot,因为关机后可以直接挂载磁盘抓取映像,状态更干净。/unattend::指定应答文件。可以省略,但省略之后部署时要手动走一遍 OOBE。
执行后屏幕会显示 sysprep 正在处理的进度,大概几分钟。如果报错,它会在C:\Windows\System32\Sysprep\Panther\目录下留下日志,setuperr.log和setupact.log是排查的主要依据,这两个文件一定要会看,后面排错章节我会具体讲怎么读。通用化成功后机器自动关机,此时不要手贱再去开这台虚拟机——它已经处于"半成品"状态,开机只会把状态搞乱。
4.2 应答文件:让部署过程彻底无人化
应答文件(unattend.xml)是封装流程里技术含量最高的一块。它的作用是告诉 Windows 在安装的各个阶段该怎么配置,从而跳过所有需要人工点击的界面。
它按**阶段(pass)**组织,常用的有四个:
| 阶段 | 执行时机 | 典型用途 |
|---|---|---|
| windowsPE | 映像解压、磁盘分区阶段 | 分区方案、语言设置、跳过许可条款 |
| specialize | 系统首次启动、硬件检测阶段 | 计算机名、CopyProfile、时区、产品密钥 |
| oobeSystem | 用户首次登录前 | 跳过网络连接、创建本地账户、跳过隐私页 |
| offlineServicing | 离线挂载映像时 | 注入补丁和驱动 |
我最常改的几个节点是这样的。跳过 OOBE 的网络连接和隐私页,在 oobeSystem 阶段:
<settings pass="oobeSystem"> <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> <OOBE> <HideEULAPage>true</HideEULAPage> <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen> <HideOnlineAccountScreens>true</HideOnlineAccountScreens> <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> <NetworkLocation>Work</NetworkLocation> <ProtectYourPC>3</ProtectYourPC> </OOBE> <UserAccounts> <LocalAccounts> <LocalAccount wcm:action="add"> <Name>User</Name> <Group>Administrators</Group> <Password> <Value>你的密码</Value> <PlainText>true</PlainText> </Password> </LocalAccount> </LocalAccounts> </UserAccounts> </component> </settings>HideOnlineAccountScreens这个节点是重点。不做设置的话,新版 Windows 10 的 OOBE 会强制你连网并登录在线账户,本地账户入口被藏得很深,对批量部署极其不友好。把这个设为 true,首次启动就只会要求创建本地账户,配上上面的 LocalAccount 定义,甚至能实现自动创建账户直接进桌面。
写完 XML 一定要用 Windows SIM 校验一遍。手写 XML 最容易出错的三个地方:缺少 wcm 命名空间声明、component 的版本号写错、节点顺序不对。这三类错误的表现都是部署到某个阶段卡住或者直接报"Windows 无法分析或处理应答文件",排查起来全靠日志。
4.3 用 DISM 抓取映像并处理体积
系统通用化并关机之后,把这台虚拟机的磁盘挂载到另一台机器(或者用 WinPE 启动),就可以抓取映像了。命令如下:
dism /Capture-Image /ImageFile:D:\install.wim /CaptureDir:C:\ /Name:"Win10-Custom" /Description:"自制母盘v1" /Compress:max /CheckIntegrity几个参数值得展开。/Compress:max用 LZX 算法压缩,压缩率最高但耗时最长,一个 25GB 的系统大概能压到 8GB 到 12GB,我一般能接受这个等待时间。如果时间紧张可以换成/Compress:fast,代价是体积大不少。/CheckIntegrity会在抓取过程中做完整性校验,多花一点时间但能避免抓出一个损坏的映像——这种错误往往到部署阶段才暴露,那时你会怀疑人生。
如果映像超过了单个文件能承载的大小(比如要放进 FAT32 格式的 U 盘),就需要拆分:
dism /Export-Image /SourceImageFile:D:\install.wim /SourceIndex:1 /DestinationImageFile:D:\install.swm /FileSize:3800/FileSize单位是 MB,3800 是个常用的值,配 FAT32 的 4GB 单文件上限刚好。拆分出的 swm 文件在部署时能被自动识别,不需要额外处理。
4.4 打包成可引导 ISO
拿到 install.wim 之后,从官方 ISO 里提取出完整的目录结构(除了 sources 目录下的原版 install.wim),把我们的自制映像替换进去。然后用 oscdimg 打包:
oscdimg -m -o -u2 -udfver102 ^ -bootdata:2#p0,e,bD:\ISO\boot\etfsboot.com#pEF,e,bD:\ISO\efi\microsoft\boot\efisys.bin ^ D:\ISO D:\Win10_Custom.iso这里的-bootdata参数是关键,它同时写入了传统 BIOS 引导和UEFI 引导两套引导信息,这样打出来的 ISO 在老机器和新机器上都能启动。很多自己打 ISO 的人只用 BIOS 引导参数,结果新电脑上 U 盘根本进不去,白白折腾半天。
ISO 做好后,用虚拟机空盘测试一遍完整部署流程,从引导到进桌面全部走一遍,确认没有问题再拿去装真机。这一步千万别省,真机上出问题排查成本高得多。
5. 驱动、补丁与镜像的长期维护
5.1 驱动注入的两种做法该怎么选
驱动处理是决定镜像"通用性"的关键。两种思路:
离线注入是从官方驱动包里提取出 inf 文件,用 DISM 在挂载映像的时候打进去:
dism /Mount-Image /ImageFile:D:\install.wim /Index:1 /MountDir:D:\Mount dism /Image:D:\Mount /Add-Driver /Driver:D:\Drivers /Recurse dism /Unmount-Image /MountDir:D:\Mount /Commit/Recurse会递归扫描子目录,所以驱动包按厂商分类放好就行。这种做法的优点是部署时不需要联网,缺点是驱动包体积大,而且如果打进了错误版本的驱动,反而会引起蓝屏。
首次启动安装是把驱动包放在镜像里的某个目录,用应答文件里的FirstLogonCommands在首次登录时静默调用安装程序。优点是灵活、体积可控,缺点是需要联网或者带上完整的离线安装包。
我的实际做法是混合:只离线注入两类驱动——存储控制器驱动和网卡驱动。存储控制器驱动是必须的,否则在 RAID 或某些 NVMe 配置的机器上会直接蓝屏 0x0000007B;网卡驱动是必须的,因为没有网卡就没法联网装其他驱动。其余显卡、声卡、蓝牙之类,全部交给首次启动时在线安装或者后面的驱动工具处理。这样镜像体积能控制在合理范围,兼容性也最好。
5.2 补丁和运行库要不要预置
运行库我建议全部预置,而且是离线预置。VC++ 各年份版本、.NET Framework 各版本、DirectX 运行库,这些是大量软件的基础依赖,缺一个就有软件装不上或者闪退。预置的方式是在母盘系统里直接安装一遍,或者用 DISM 在离线阶段用/Add-Package打进去。体积代价大概一到两个 GB,换来的是装机后不用再一个个补装,非常值。
系统补丁我倾向于不预置或者少预置。原因有三:一是补丁会不断更新,今天打进去的补丁下个月就过时了;二是某些补丁和 sysprep 有冲突,尤其是涉及 .NET 和商店组件的更新,很容易导致通用化失败;三是补丁安装本身耗时很长,占用了制作母盘的大量时间。我的做法是母盘只装到最近的累积更新,剩下的交给部署后的自动更新处理。如果你的使用场景是完全离线环境,那就另说,把补丁打全再封装。
5.3 镜像版本管理:别让它烂在硬盘里
做镜像最大的坑不是技术,是版本管理混乱。我一开始也没在意,结果硬盘里躺着七八个 install.wim,文件名都是 install.wim,根本分不清哪个是哪个,装了才发现拿的是半年前的旧版本。
后来我定了一套简单的规则,你可以直接抄:映像名称里带上日期和版本号,比如Win10-Custom-2405-v3;母盘的虚拟机和应答文件放在同一个中文命名的文件夹里,比如封装-2405;每次发布镜像写一段变更记录,记清楚这一版删了什么、加了什么、修了哪个 bug。这三件事加起来每次也就多花五分钟,但它能让你半年后回头看还知道自己在干什么。
另外,映像文件要放在机械硬盘或者大容量存储上,别一直堆在系统盘。一个镜像十来个 GB,堆几个就把系统盘吃满了,而系统盘满会引发一堆莫名其妙的问题。
6. 常见问题与排查实录
6.1 sysprep 报错速查表
| 报错关键词 | 常见原因 | 处理办法 |
|---|---|---|
| 无法验证 Windows 安装 | 已超过通用化次数限制 | 从快照回滚重做,或在注册表 SkipRearm 后重试(不推荐常用) |
| 处理应答文件时出错 | XML 语法或节点错误 | 用 Windows SIM 校验,重点查命名空间和 pass 归属 |
| 现代应用相关错误 | UWP 应用被更新或锁定 | 断网、卸载全部用户的应用后再通用化 |
| 某个应用阻止 sysprep | 应用正在运行并占用用户配置 | 关闭所有应用,结束残留进程,重启后再试 |
| 通用化成功但部署蓝屏 0x7B | 存储控制器驱动缺失 | 离线注入对应驱动,或临时改 BIOS 中磁盘模式 |
| 部署后卡在 OOBE 网络页 | 应答文件未跳过在线账户 | 补上 HideOnlineAccountScreens 节点 |
| 映像抓取后无法引导 | 引导信息不完整 | 检查 oscdimg 的 bootdata 是否包含 UEFI 项 |
这张表里的每一条我几乎都遇到过至少一次。我的建议是遇到报错先看日志再动手:C:\Windows\System32\Sysprep\Panther\setuperr.log记录错误点,setupact.log记录完整流程,用记事本打开从文件末尾往前找最近的错误行,关键词通常很直白。
6.2 几个我踩过的坑,希望你别再踩
第一个坑:在审核模式里创建了普通账户做配置。我一开始觉得 Administrator 名字难看,就顺手建了个新账户把桌面调好,结果 CopyProfile 完全不生效,部署后新用户桌面还是微软默认的样子。后来才搞明白 CopyProfile 只认审核模式的内置管理员,前面说过,这里再强调一遍。
第二个坑:定制完成后顺手点了系统更新。有一次我想着"顺便把补丁打了",结果更新装到一半我重启了虚拟机,sysprep 直接报了一个完全看不懂的现代应用错误。翻日志发现是一个商店组件的更新把用户配置锁死了。从此我的规矩是:开始定制之后,系统更新一律不碰,要打补丁就在母盘最开始的阶段一次性打完,之后再断网。
第三个坑:镜像做完没测试就装真机。这个坑的代价最大。有一次镜像在虚拟机里跑得好好的,装到一台笔记本上直接找不到无线网卡,还以为是驱动问题,折腾了两小时才发现是应答文件里写死了计算机名和域设置,跟网络无关。从那以后我给自己定了个硬规矩:每个新镜像至少在一台虚拟机和一台真机上完整部署一次,确认无误才归档。
第四个坑:精简过头。早期我很兴奋地把一堆"看起来没用"的组件删掉,包括某个输入法相关组件和一个系统还原相关服务。后来发现同事用的时候中文输入法切换异常,而且系统出问题后没法还原。精简的边界应该是:只删明确知道用途且确定用不上的东西,凡是搞不清是干什么的组件,一个都不动。系统的体积大几百兆,换来的是稳定性,这笔账非常划算。
如果要把这套流程压缩成一句话给你带走,那就是:用快照兜底,用断网保稳,用日志排错,用测试验收。这十六个字是我做了这么多版镜像之后真正沉淀下来的东西,比任何一条具体命令都重要。至于镜像里装哪些软件、怎么布局桌面,那属于个人口味,你按自己的习惯来就行,反正改起来也就是重做一次母盘的事——有了前面这套流程,重做一次也就半天时间。