桌面文件WIM 和 ImageX 的 Power User 指南

Wes Miller

本专栏基于 Windows 自动安装工具包 (WAIK) 和 Windows Server 2008 的预发布版。文中的所有信息均可能发生变更。

在以前的一些专栏中,我讨论了 ImageX 和 Windows 映像 (WIM) 格式。在几个月前的 Tech•Ed 上,我听到一些来自开始使用 Windows 部署服务 (WDS)、ImageX 和 Windows 自动安装工具包 (WAIK) 的 IT 专业人员的评论和疑问,意识到

需要提供更多的用户指南。因此,在本月的专栏中,我将重点放在 ImageX 和 WIM 格式上,并介绍如何充分利用它们。将 ImageX 和 WIM 一起使用,您不但可以轻松部署 Windows Vista® 和 Windows Server® 2008,而且还可以轻松部署 Windows® XP、Windows Server 2003 和 Windows 2000。

对 WAIK 所做的更改

您可能想知道即将发布的 Windows Server 2008 对 WAIK 意味着什么。Microsoft 计划在发布 Windows Server 2008 的时段内发布 WAIK 的更新版本。对 WIM 格式没有显著更改(ImageX 工具和格式未改变);适用于 Windows Server 2003 的 WDS 亦未改变。与传言相反,Windows Server 2003 WDS 中将不提供多播功能,仅运行 Windows Server 2008 的 WDS 服务器会具有用于 WDS 的新多播部署功能。

将对 Windows PE 2.0 和 Windows 安装程序进行修改,以便在以下方面提供支持:

  • 部署 Windows Server 2008 和 Windows Vista。
  • 通过 WDS 从 Windows Server 2008 WDS 服务器进行多播部署。
  • 通过 x86 Windows PE 部署 Windows Vista 和 Windows Server 2008 的 x86 版本及 x64 版本。

首先,这表示 Windows PE 2.0 能够部署 Windows Server 2008,就像通过它部署 Windows Vista 那样容易 — 相同的工具和过程对上述两种操作系统的适用性都非常好。其次,当 WDS 服务器在 Windows Server 2008 上运行后,您将能够通过 WDS 使用多播部署。最后,这意味着您将能够使用 x86 Windows PE 2.0 磁盘,并通过它部署 Windows 的 x86 或 x64 映像。

我在 Tech•Ed 上做关于 x64 Windows 的讲述时曾提到过最后一点。遗憾的是,博客和 Windows 技术社区中对这方面的说明有些混乱。这并不是说 Microsoft 将在每张 Windows Vista 或 Windows Server 2008 DVD 上都分发 x64 Windows 和 x86 Windows,也不表示您应将 Windows x64 和 Windows x86 映像合并到单个的 WIM 文件中(即使您可以这样做)。合并不会节省单实例存储,虽然合并的确允许 WIM 作为一个文件传输。

这表示,企业客户和已花费数年时间开发基于 x86 的部署过程(和自定义脚本与工具)的 OEM 将能使用 32 位安装程序从 WIM 内部部署 x86 或 x64 Windows — 这是自 2005 年 x64 Windows 问世以来企业客户一直请求推出的功能。

ImageX 的日常使用

使用 /mount、/mountrw 和 /delete

下面提供了一些对 ImageX 使用 /mount、/mountrw 和 /delete 开关的重要提示:

  • 如果您打算编辑某个卷,请使用 /mountrw 装入该卷。
  • 应将 WIM 装入到一个空目录下,以免与之前存储到该位置的文件混淆,这样还可防止 ImageX 生成不必要的警告消息。
  • 如果希望保存所做的更改,请不要忘记 /unmount /commit 您的读/写映像。我也经常进行了更改,却忘了提交更改(结果更改都丢了)。
  • 通过 /mountrw 删除文件和通过 /delete 删除卷映像都不能恢复空间 — 实际上这会占用更多空间。有关详细信息,请参阅本专栏有关 /export 的部分。
  • 一次只能装入一个 WIM 文件进行读/写访问。两个用户不能同时编辑同一 WIM,一个用户也不能在同一时间编辑两个卷映像。
  • 即使在只读模式 (/mount) 下,也应该限制同时装入的卷映像数量,这是因为,对于装入的每个映像,驱动程序依赖系统上可用的 Windows 非页面池存储量。这将导致因系统(或系统体系结构)而异的限制。我建议,不要试图同时装入五个以上的映像。
  • 如果进行更改,通过 /mountrw 进行较大的更改几乎不费一点时间,但由于需要比较和存储所有新的文件数据,可能会导致 /commit 花费相当长的时间。
  • 使用 /delete 和 /mountrw 时务必谨慎 — 更改一旦提交即无法撤消。
  • 如果 WIM 文件中只有一个卷映像,则无法运行 /delete(而是删除整个 WIM 文件或添加另一个卷映像)。
  • 要快速获取卷映像内容的目录树,请不要使用 /mount,而是使用以下命令:
ImageX /dir <path_to_wim_file> <image index>
  • 如果您打算同时编辑两个 WIM 文件,请不要尝试在同一时间 /unmount 它们;请安排 mount/unmount 事件的顺序,以便不会出现其中一个事件阻止另一个事件的情况。

ImageX 是参照 OEM 和企业客户讲述过的工具使用方式而特别设计的。图 1 显示了该过程。

图 1 使用 ImageX

图 1** 使用 ImageX **

值得注意的是,步骤 5 很关键 — 事实上映像在不断变化。因此,捕获和修改映像需要尽可能快、尽可能容易。

因此,您可以将附加映像添加到已创建的映像中(使用 /append 开关)。最初,开发团队认为用户会希望向早期映像中添加更多 SKU(Windows 版本),但随着在开发 Windows Vista 的早期阶段中与企业客户合作的增多,我越来越多地听说用户采用了快速部署 X,然后在步骤 2 中进行修改之处重新捕获 X1 的做法。这样做使用户能够快速重新捕获映像,因为用户修改过的文件数量有限。

当团队了解到这些后,他们意识到并非在所有情况下保持原始映像都有意义。在本专栏的稍后部分中,我将介绍根据这种情形和其后的情形而特别添加的 /export 开关。

不断进行更改

在早期,开发团队决定应使 WIM 文件可编辑。由于他们已确定基于扇区的映像格式不能发挥作用(有关说明,请参阅 technetmagazine.com/issues/2006/12/DesktopFiles 上的 2006 年 12 月专栏),因此他们必须提出一个解决方案,通过该方案要能够以本机方式将文件作为 Windows 文件系统的一部分轻松装入,并能轻松对 WIM 文件中已装入的卷映像进行更改。这表示有更多的“移动部件”— 我喜欢这样称呼它们。装入基于扇区的映像相对容易,但装入 WIM 等专用存档格式就要求进行一些非常有针对性的处理。

该格式需要能够从命令提示符进行访问 — 不再使用用于本机处理 ZIP 和 CAB 文件的 Windows Shell Extensions。遗憾的是,这些处理程序只允许 Windows 资源管理器对某个对象进行抽象访问。

因此,WIM 解决方案包含一个驱动程序 (wimfltr.sys) 和 ImageX,由 ImageX 充当实际加载该驱动程序的方法并处理供装入 WIM 所用的接口。该驱动程序用于向 Windows 文件系统添加抽象内容,如图 2 中所示。运行类似以下命令之一的某个命令时,实际上是告知 ImageX 加载 wimfltr.sys 驱动程序,并使该驱动程序在空白目录装入位置上覆盖第一个卷映像(在此处使用的命令中用 1 表示),如下所示:

图 2 装入 WIM 卷映像

图 2** 装入 WIM 卷映像 **(单击该图像获得较大视图)

ImageX /mount iso\sources\boot.wim 1 mount 
ImageX /mountrw iso\sources\boot.wim 1 mount 

这是 WAIK 中的默认行为。因此,当您在装入目录浏览或生成目录列表时,会看到 boot.wim 中卷映像 1 的根目录。当然,无论使用 /mountrw 还是 /mount,都会确定此目录是只读的还是可读/写的(有关详细信息,请参阅侧栏“使用 /mount、/mountrw 和 /delete”)。

/mountrw 功能最初是为轻松添加驱动程序或其他支持 xcopy 命令的文件或内容、安装应答文件或者修改已装入 WIM 文件的脱机注册表以根据需要进行对其进行更改而设计的(请参见图 3)。其设计初衷并非用于添加或删除整个应用程序(因为无法脱机安装 MSI 安装的应用程序)。

图 3 修改装入的 WIM 文件

图 3** 修改装入的 WIM 文件 **(单击该图像获得较大视图)

关键是要了解装入 WIM 文件时对其进行的更改不会直接更改实际的 WIM 文件(至少不会立即更改);反而会更改 WIM 文件的缓存,该缓存可以有效合并覆盖内容和已做更改。如侧栏中所述,我以前就犯过此种错误。确保完成后使用 /unmount 和 /commit 开关,因为只有这样,才可以将更改提交给 WIM 文件。否则,这些更改将完全丢失。

通过提交保存更改,实际上是告知驱动程序在 WIM 文件本身中进行相应的更改。驱动程序会添加其他文件数据。(请注意,如果进行了大量的更改,则意味着 /commit 可能会很费时,因为那时正在向 WIM 添加文件数据。)

此外,与基于扇区的映像格式不同,您可能已更改了卷映像中的一个或多个文件。因此,它们不再是单一实例(除非曾存储过与此完全相同的文件)并将导致原始文件数据丢失。与 NTFS 或 FAT 卷不同,WIM 不会将文件标识为已删除 — 它不再引用该文件,但不会将其清除。所以,如果经常通过 /mountrw 进行编辑或 /append 多个映像,或者使用 /delete 删除卷映像,只会导致 WIM 文件忽略对该文件数据的引用,而不会完全删除相关文件数据。

为此,开发团队创建了 /export 开关,也称为“WIM 碎片整理程序”。

导出

/export 的重要注意事项:

使用 /export 创建新 WIM 文件时,您可以指定要使用的压缩类型,而不接受当前使用的默认压缩类型。如果打算更改当前压缩类型,导出可能会花费相当长的时间。

/export 使用起来与 /append(通过向现有 WIM 文件添加卷映像)一样有效,但是 /export 不允许修改 WIM 文件的 /compression 属性。

如果要导出整个新的 Windows PE 2.0 卷映像,可以指定 /boot 开关。

创建 /export 开关是为了解决上面提到的情形和工作组发现的一些更加复杂的情形。简单地说,/export 允许提取一个(或两个、三个)现有卷映像并将其导出。这意味着您可以快速提取上述 X 和 X1 WIM 文件,仅使用 X 或 X1 或者使用 X1 和 Y1(从另一个 WIM 文件中导出)创建新的 WIM 文件。

设想以下情形:您对 X 进行修改并使用 /append 将更改作为 X1 添加。由于已将 X 替换为本季度的新映像,您决定要将其删除。可以使用 /delete 开关,ImageX 将忽略 X 映像。但是,要通过删除与 X 相关的所有信息来节省空间,将需要运行以下命令:

ImageX /export source.wim 2 destination.wim "New image for Q4CY07"

此命令会将第二个卷映像导出到具有新名称的新 WIM 文件,完全删除卷映像 1 中的早期信息。如果要将其重新整合到一个 WIM 文件中,还可以从跨区 WIM 映像导出(本专栏后面部分会介绍)。无法通过 /mountrw 编辑跨区映像 — 这是为什么要重新整合这些映像的一个原因。特别要注意,ImageX 不存在 /import 命令,因为 /export 可以创建新 WIM 文件或附加到现有文件。有关本主题的其他信息,请参阅侧栏“/export 的重要注意事项”。

这对于运行 peimg /prep 也很重要:即使此命令准备了要使用的 Windows PE 映像,也不会清除 WIM 中的任何内容。理想情况下,作为 Windows PE 发布过程的一部分,应准备好该映像,然后将其导出到新的 boot.wim 文件。请注意,引导过程只知道在 \sources\boot.wim 中查找 WIM 文件,所以请确保其名称正确,并将其标记为引导卷映像。

我曾提到如果已准备好删除旧的卷映像或将多个卷映像组合起来,您可能希望通过对映像运行 /export 对其进行优化。如果已通过 /mountrw 或 /delete 进行了多处编辑,可能也希望执行此操作。否则,WIM 文件将继续随时间增长(其增长方式相当神密,您无法诊断出来)。如果经常使用 /mountrw 或 /delete,请考虑将 /export 添加到您的工作流以确保映像完全优化。

跨区

早些时候还曾中途出现另一个问题,就是可能需要 WIM 文件满足多张光盘媒体的需要。我们认为 Windows 可能会在多张 CD(也可能是 DVD,现在就如此)上提供,因此我们在 WIM 和 ImageX 中构建了跨区支持。

正如我所提到的,通过 /split 创建的跨区映像基本上都是只读的 — 无法直接 /capture 为新的跨区映像、无法通过 ImageX 装入或通过 /append 附加。所以,我建议在完成标准工作流并准备好进行发布后,拆分 WIM 文件。也就是说,在常规 WIM 文件上进行所有编辑,并考虑将拆分作为部署方案发布过程的一部分。

开始应用映像时,跨区映像可能会是一项挑战。使用跨区映像时,我建议使用 ImageX 而不使用安装程序。同时也建议通过网络应用映像(以便实现最佳性能,而无需对应用的源磁盘建立映像),或直接将其复制到驱动器然后再应用该映像(请注意,这将绑定磁盘,因为应用时磁盘会对自身进行读取和写入)。

查看有效性

使用 ImageX 时,将会移动大量数据(大量非常重要的数据)。在今年的 Tech•Ed 上我经常听到一个问题“如何确保映像有效?”要做到这一点不是很简单,但也不是很难。

首先我们要了解,与大多数存档格式一样,WIM 容易损坏。这种损坏大多数时候发生在通过网络传输 WIM 文件时。在开发 Windows Vista 的早期,我了解到有关特定网卡的特定问题 — 如果丢失数据包,将损坏 WIM 文件,并且这种损坏方式很难被诊断出来。此情况实际反映了多年前 driver.cab 文件增大时发生的情形 — 发生了类似的随机损坏。一般来说,如果获得映像损坏或安装程序失败的报告,则您需要检查生成报告的系统上使用的 NIC 类型。不管使用 ImageX 本身还是运行 WDS 都要如此。

因此如何查看某个映像是否已损坏呢?首先,您可以使用 /check 开关。这样不必进行 WIM 文件中的其他完整性检查就可以在应用之前确认 WIM 未被损坏。同时,务必在应用时运行 /check,它将验证该映像(尽管这更费时)。

此外,如果遇到问题(或只是想更加谨慎),您可以在捕获前应用后,对这些文件运行哈希实用程序。还可以在捕获后,通过装载映像或重新运行哈希使用程序(是一个不错的方法)确保映像已正确捕获。

您需要确保从开始就能够正确捕获映像。/check 开关及格式本身设计为检查点,而不是用于修复错误捕获的映像的恢复工具。

引导和标记

我曾提到您可以使用 /boot 捕获 Windows PE 的 WIM 卷映像并引导它。您应只将其视为特定卷映像上的引导扇区。它只存在于每个 WIM 的一个卷上,并且仅对 Windows PE 2.0 有效。请注意,您无法对 Windows PE 1.x 进行 WIM 引导 — 这完全不可能。

可以在 Windows 卷映像中看到对标记的引用。标记只能由 Windows 安装程序使用。卷映像上的标记为 2 表示该卷映像包含 Windows PE 和安装程序。标记为 9 表示仅包含 Windows PE。任何其他标记或标记缺失都表示映像将不能并且无法由安装程序使用。应注意,使用 ImageX 捕获映像后,可以在映像上设置标记以对其进行修改。建议使用 WAIK(和可选的商业台式机部署解决方案加速器)创建 Windows PE WIM 引导映像,因为这样可以正确设置标记以开始引导。

针对 HTA 用户的备注

最近,我听到一些在 Windows PE 2.0 上运行 HTA 文件的问题报告。遗憾的是,包含重要脚本的 HTA 文件似乎存在问题。在图 4 中,看一下我创建的示例文件的快照,并注意返回的脚本错误(未包含任何信息)。许多客户都报告了此问题,我自己也遇到过此问题。

图 4 HTA 脚本错误

图 4** HTA 脚本错误 **(单击该图像获得较大视图)

不过,幸运地是解决起来并不复杂。准备映像时,添加 XML 支持和 HTA 支持。HTA 组件中缺失的依赖项将包含在 XML 外接程序模块中,从而解决此问题。

我要感谢 ImageX 开发人员 Bruce Green 以及 Windows 部署测试团队的 Minxiao Zhou 和 Raja Ganjikunt 对本专栏的帮助。

Wes Miller是德克萨斯州奥斯汀市 Pluck 公司 (www.pluck.com) 的一位开发经理。在这之前,他在奥斯汀市的 Winternals Software 公司任职,并曾在 Microsoft 担任 Windows 项目经理和产品经理。您可以通过电子邮件 technet@getwired.com 与 Wes 联系。

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.