桌面文件了解 Windows 映像格式

Wes Miller

本专栏基于 Windows 部署工具的预发布版。文中的所有信息均可能会发生变更。

随着 Windows Vista 的发布,Windows 安装和部署的方式出现重大改变。安装引擎和 Windows Vista 部署工具的完整套件(以及 Windows Server 的预发行版本,其代码为“Longhorn”)已经重新编写。我在最新的 TechNet 杂志文章中曾讨论过这些更改

以及 Windows® 部署团队为进行这些更改而付出的努力**。但关于这一主题有许多要讨论的内容,因此我将在这一新的定期专栏中介绍 Windows PE、Windows 安装和部署以及其他 Windows 管理和安全主题。

在此第一部分中,我将讨论全新的 Windows 映像格式 (WIM)。如果您尚不熟悉映像的细节,请务必阅读侧栏“典型映像过程”加以了解。在下一专栏中,我将讨论 Windows 自动安装工具包 — 它是新的工具套件,其中包括 ImageX(用来创建和处理 WIM 映像的命令行工具)和 Windows 部署服务 (WDS)(将替换远程安装服务 (RIS))— 看看这些工具如何能使 OS 部署更容易。

转折点

Windows 部署团队年复一年地从 OEM 和企业客户那里听到相同的反馈。他们需要对映像更好的支持,还需要 Microsoft 提供统一的映像工具。这些用户不想选择第三方供应商,也不想了解其复杂的产品。而且,我们常常听到这样的抱怨,即 OEM 和企业客户认为他们不应该对使用映像工具部署 Windows 付费,而是想让 Microsoft 提供这些工具。

在 Windows Vista™ 开发初期,Windows 部署团队下了一个非常大的赌注。我们决定彻底放弃整个安装引擎 — 其许多组件已存在近十年之久。安装一直是薄弱环节,而且步骤太多。我们打算加速这个过程,删除不必要的步骤,提高 Windows 安装的整体可靠性。为此,我们将一改过去一段时间以来使用的手动接合引擎的整个安装过程,用完全基于映像的安装过程来替换。

设计全新的映像格式

在重新设计安装过程之初,我们就开始定义应使用的映像的类型了。争论的焦点一直是扇区与文件。也就是说,应使用以逐个扇区复制的方式来存储卷副本的映像格式,还是使用以单个文件为基础存储每个文件的映像格式。大多数人期望从速度(使用扇区的方式)与压缩(使用基于文件的方式)上获益。最后,我们用了一种格式,我感觉这一格式最大程度折衷了这两个益处。它不但具有非常好的性能,而且还提供了很大程度的压缩。

为了设定满足 OEM 和企业用户需求的映像格式,我们首先定义了几个必须实现的主要目标。我们列出的目标很大程度地倾向于基于文件的体系结构。我想我们全都看到了这一方式的优势,因此我们首先沿此方向开始。不久即诞生了 WIM 文件。(您可能会感到奇怪,WIM 中的“M”并不代表什么。我们根据接近交付里程碑时重复的 Windows 团队活动将其命名为 WIM — *.WI 这种缩写看上去怪怪的。)那么,我们来了解一下针对新映像格式提出的一组目标。

Windows 文件系统中性格式 该映像格式必须跨 Windows 支持的两个文件系统体系结构发挥作用。虽然几乎所有系统在运行时都使用 NTFS,但是许多 OEM 和企业都使用 FAT 文件系统作为暂时替代,以便能使用 MS-DOS® 部署 Windows。然后它们会转换为 NTFS。在 Windows Vista 中我们必须继续提供这一支持。

卷几何中性 我们必须解决捕获大卷并将它应用于较小的卷这一历史问题。即便映像工具能通过分区处理手段解决此问题,它也不可靠。在基于文件的体系结构中,映像占用的空间大小仅为组成该映像的多个文件的大小。由于文件系统独立还原,因此卷的大小不可靠。

典型映像过程

当 OEM 复制大量系统或大型组织需要将 Windows 部署到众多计算机中时,他们通常使用映像技术。前提是采用主机系统,严格按需要进行构建,然后将其复制到目标系统上。如果您不熟悉映像过程,以下是大概介绍。

  1. 管理员将 Windows 安装在系统上并按需要配置它。这涉及添加和删除组件、安装常用应用程序以及调整 UI 及其他设置。我们称之为主机系统。
  2. 然后管理员运行 Sysprep(由 Microsoft 以 Windows 部署工具形式提供),它会执行整理属性这一重要工作,这些属性可使 Windows 安装具有唯一性(例如,计算机名称、Windows 安全标识符 (SID) 及其他跨系统的唯一标识符)。当 Sysprep 的第二部分运行时,这些属性会被重置。
  3. 接着,管理员关闭计算机并重新启动进入 Windows PE、MS-DOS 或允许管理员运行映像应用程序的其他 OS。
  4. 现在,管理员运行映像工具,创建参考系统的映像。此映像是一个包含参考磁盘或分区的精确副本的文件(或文件集合)。
  5. 系统关闭,然后管理员将映像存档,映像可以根据需要进行更新(添加应用程序、修补程序和服务包)。
  6. 该映像被复制到一台或多台计算机上,至此 Sysprep 完成其工作,运行一次安装程序的简化版(称为“最小化安装”或“欢迎使用 Windows”,这取决于运行 Sysprep 时所用的 Windows 版本和配置 Sysprep 的方式)。此阶段依赖于一个名为 setupcl.exe 的极小的本机模式可执行文件。

系统体系结构中性 该映像体系结构必须使用 Windows 可以支持的任何体系结构。当时,这意味着支持截然不同的 x86 和 IA64 (Intel Itanium) 体系结构。现在,这也包括 x64(AMD64 和 EM64T)体系结构。

必须快速捕获并应用。如果是压缩形式,必须相当快地捕获映像。而更为关键的是,在应用映像时必须非常快速。

支持非破坏性映像应用程序 由于我们替换了升级选项(该选项会替换 Windows,而不会损坏用户数据或应用程序),并派生出能用于系统恢复的工具,我们希望该工具能够映像系统,但不会破坏卷上的任何现有内容。如果不做出相当多的工作,基于扇区的格式不会让用户实现上述目的 — 通常您只能还原一个整卷,甚至什么也做不了。

支持大量压缩 在 Windows Vista 开发初期,我们仍侧重于以 CD 形式交付。但鉴于 Windows XP 的映像大小接近 1GB,我们确定,尽可能紧密压缩映像很重要。对于基于扇区的映像而言,有很多手段可以实现此目的,但是我们关心是的这种实现中的移动部分。许多基于扇区的格式省略了磁盘上的空白区域以节省空间。(这就是即便映像大小始终为 0,也记录 0 的原因。)但是,由于使用基于文件的方式,我们对此进行了本质上的处理,因为我们不占用空白区域。

支持文件的单一实例 这个问题与前述问题相同。众所周知,Windows 可以在几个不同位置存储同一文件的多个副本。基于文件的方式使得只存储每个文件的一个实例并根据需要使用该文件很容易办到。

支持多介质(光盘)方式 甚至在 WIM 的初期,当我们刚好能在单张 CD 中容纳一个映像时,我们就已知道我们必须支持多个介质。即使我们在一张 CD 上交付 Windows,一旦用户添加应用程序、服务包等,他们的映像很可能会超出单张 CD 或 DVD 所能容纳的大小。因此我们必须允许它们跨越多个介质,以用于其自身的安装和恢复解决方案。

支持一个文件 Blob 上存在多个卷映像 很少有一个映像能够用于一切的情况。我们设计“单一实例”时,还加入了获取多个卷的功能 — 相同压缩和单一实例相互作用。因此,如果获得 Windows XP Professional 的映像,然后附加了 Windows XP Tablet PC Edition(它是 Windows XP Professional 的扩展集)的新映像,则该映像将只会依据两种版本之间明显不同的文件而增加大小。

这样,OEM 或企业用户可以附加许多彼此之间派生的映像,而其大小不会呈指数增加。这一功能很难通过基于扇区的格式实现。

WIM 的工作方式

WIM 格式的设计目标是尽可能简单,同时满足我们的指导原则。基于文件的方式可以满足上述目标。但它是如何精确工作的呢?

简单地说,您可以将 WIM 文件看作是 CAB 文件(它与 ZIP 格式很相似,但由 Microsoft 设计并认可 CAB 格式)。实际上,我曾听说 WIM 被称为“CAB 的子项”。WIM 文件和 CAB 文件之间的主要区别在于,除了捕获和压缩文件本身外,WIM 映像还存储应用于文件的元数据和组成在给定卷映像中捕获的卷的目录。因此,它有点像一种存档文件,其中包括将卷还原为创建映像时的样式所需的所有元信息 — 访问控制列表 (ACL)、短/长文件名、属性等等。

请注意,捕获过程的任何一点都不是所收集的分区信息(大小或类型)。应用过程也不对系统进行分区。ImageX 与多数映像工具不同,它具有分区中性的特点,需要在应用之前就创建分区并进行格式化。要在应用映像之前自动执行该过程,您应使用 diskpart 以及格式化命令行工具。

在卷映像中存储哪些内容不受任何限制。映像可包含两个卷(分别在星期二和星期四捕获的相同卷),一个具有服务包的映像和一个不具有服务包的映像,或者满足您需要的其他内容。要理解的主要一点是同样的文件只会捕获一次。两个卷映像具有的共同之处越少,占用的空间就越多。

我还应指出,WIM 格式的设计中,没有任何使其无法与 Windows 早期版本共用的内容。它在 Windows Vista 中的使用情况与在 Windows 2000 中的使用情况一样良好。现在让我们详细了解捕获并应用映像时刚好发生的情况。

捕获映像

捕获卷映像时,将有以下步骤执行:

捕获卷的元数据 ImageX 收集有关文件名、NTFS ACL 以及卷上其他文件系统属性的数据。(您可以选择使用一个脚本文件排除某些文件。)

捕获文件数据 文件由 ImageX 加载。每个文件都加载到卷上并准备收集有关该文件的某些数据。

生成文件哈希 生成基于文件本身的文件加密哈希。此哈希成为映像中文件的唯一标识符。

检查副本并将其删除 如果映像中已经存在另一个具有相同哈希的文件,则认为这是相同的文件,并且新文件通过指向已经存在的文件加以引用。

压缩唯一的文件数据 与采用 CAB 或许多其他存档格式不同,采用 WIM 格式的每个文件都是单独压缩的,而不是以组成一个数据流的文件集合的形式进行压缩。您也可以选择根本不进行压缩,这样将跳过此步骤。

压缩并存储卷的元数据 所有文件存档后,就会创建卷的元数据项。这将列出每个添加到卷映像中的文件。

生成并存储映像 XML 数据 这是对所捕获的每个卷映像的引用。例如,如果您运行 ImageX/info,此 XML 数据就是您将看到的数据。

编写缓存的 WIM 数据索引 最后,将编写主数据索引(以及缓存的数据)。这是适用于整个 WIM 的主文件表;其中每个哈希包含一项。

正如您所看到的,WIM 是按逐个文件的基准创建的。而且,不管为映像附加多少卷,您都只有一个 WIM 文件。

映像超载

在我们开始着手进行 WIM 的工作时,有许多团队在开发类似的解决方案。那时,自动化部署服务团队正在为不同的客户群开发映像解决方案。他们的方式有一些非常有趣的低级别实现细节,但是像当时大多数映像引擎一样,他们的映像引擎是基于扇区的。Windows XP Embedded 团队也构建了基于扇区的映像引擎,允许嵌入的独立硬件供应商 (IHV) 在系统制造时部署其自己的映像。而且,当 Microsoft 在 2003 年拥有了虚拟 PC 团队时,该团队引入了适用于虚拟硬盘 (VHD) 文件另一种文件格式。

所有这些格式的核心都是基于扇区的。它们符合每个客户群的需求,但是这些解决方案不符合我们对 WIM 的指导原则。因此,我们继续构建了新的 WIM 格式和用来捕获映像的 ImageX 命令行工具。最终,在我们的格式作为 Windows Vista 测试版的一部分公之于众之前,许多其他团队适当地加以了采用。例如,SMS 团队在其“操作系统部署功能包”中就提供了 WIM 的早期实现。

应用映像

现在让我们看看计数器过程:应用映像。

加载缓存的 WIM 数据索引。这一部分涉及前面过程中的最后一步。由于这是主索引,因此在指定了要应用的卷映像后,第一件事情就是从 WIM 中加载它。

检索并加载映像元数据 ImageX 加载每个卷映像特定的元数据。

创建目录结构 要确保每个文件都有一个被还原到的位置,需创建该卷的完整目录树。

提取文件数据 从 WIM 中以文件存档时的顺序提取文件。

应用文件数据 在此步骤中,文件被加载、解压缩(如果卷映像以 WIM 压缩),并复制到每个被引用位置。最后,应用每个文件的所有元数据。

应用所有目录元数据 由于目录中的 ACL 可能会阻碍映像的正确应用,因此这最后的步骤很重要。

灵活的压缩

我们使用 WIM 映像格式的主要目标之一就是提供灵活的压缩选项。因此,我们提供了必要时捕获压缩卷映像的功能,同时还允许捕获未压缩的映像。如果映像不需要极度压缩,或者高速捕获很重要,则最好选择后者。

进行压缩时,要记住一些关键原则。压缩用的时间始终比解压缩长。压缩算法越精密,压缩给定数据集所用的时间就越长。而且提供给压缩算法的数据越多,压缩效果就越好。

使用 XPress 或 LZX 压缩可以压缩 WIM 映像 — 当然,也可以选择不压缩。如果需要进行一些压缩,但不希望捕获过程占用更多时间,则 XPress 可以对这种情况很好地折衷。LZX 会提供最佳的压缩比 — 但是,正如您能推测到的,此方法会占用相当长的时间。

虽然不进行压缩会使映像捕获的速度最快,但是它也会产生最大的映像。压缩类型是按 WIM 提供的选项。一旦将卷映像捕获为 WIM,所有将来的卷映像都必须以相同的压缩设置进行捕获。

请注意,因为 WIM 映像是在逐个文件的基础上压缩的,所以压缩可能会不完整。这是有意做出的决定 — 我们这样做的目的就是使映像更易于编辑。捕获后编辑映像的功能是一个重要的选项。对于在捕获映像后要编辑的文件而言,必须替换文件数据及其元数据。如果我们同时压缩了整个 WIM,那么对我们进行设计(如果完全有可能)来说,对编辑文件提供支持就会复杂到令人难以置信的程度,并且替换映像中的文件将占用相当多的时间。通过我们进行的折衷,我们提出了一种既可有效压缩,又仍能使用我们的工具进行编辑的格式。

我希望本文能让您很好地了解我们为 Windows Vista 设计的各种映像功能的工作方式。在我的下一篇专栏中,我将介绍一些可用来管理和部署 WIM 映像的工具,侧重于 ImageX 和 Windows 部署服务。

Wes Miller是德克萨斯州奥斯汀市 Pluck 公司 (www.pluck.com) 的一位开发经理。在这之前,Wes 在奥斯汀市的 Winternals Software 公司任职,并曾在 Microsoft 担任 Windows 程序经理和产品经理。可通过 technet@getwired.com 与 Wes 联系。Wes 对 John Macintyre(现任 Microsoft 的 WIM/ImageX 程序经理)给予本专栏的帮助表示感谢。

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