Windows 2008和Vista中的WinSxS是什么?为什么那么肥?

这是一篇MS Technet Blog上的英文文章,我觉得挺有用,就把它翻译成了中文,希望对大家有帮助。原文请访问这里

对于Windows Vista和Windows Server 2008的安装,有一个很常见的问题,那就是“WinSxS文件夹为啥那么大”。为了回答这个问题,首先需要介绍模块化(Componentization)这一概念,以及Windows Vista中的模块管理方式。

在老版本Windows,以及Windows Vista之间,最重大的变化之一是,从原本的,用inf描述的操作系统,彻底进化为模块化操作系统。Windows中的模块(或者组件,译注)实际上就是一个或多个二进制(Binary)文件、一个编录(Catalog)文件,以及一个用于描述相关文件安装方式的XML文件组成的,从相关的注册表键和服务,到文件所需要具有的安全权限等信息都包含在内。模块是按照逻辑单元进行分组的,而通过使用这些单元即可产生不同版本(SKU,译注)的Windows。

操作系统中的所有模块都保存在WinSxS文件夹中,实际上这个文件夹本身就叫做模块仓库(Component store)。每个模块都有不同的名称,其中包含了该模块的版本、语言,以及适用的处理器架构等信息。对于系统,只在WinSxS文件夹中保存模块,而我们在系统中其他位置看到的,这些文件的所有其他实例,实际上都属于通过硬链接(Hard link)创建的到模块仓库的“投影”(Project)。最后这一点需要重申:操作系统中,每个文件的每个版本只存在一个实例(或完整数据副本),该实例就位于WinSxS文件夹中。因此从这个角度来看,WinSxS文件夹实际上就代表了整个操作系统,并可等同于底层操作系统的“地基”。这也就解释了在执行某些操作,例如系统文件检查(SFC),或者安装额外的功能和角色时,我们可以不再提供安装介质。

这也就解释了为什么这个文件夹刚开始并不大,但随着时间的流逝会越来越大,答案很简单:系统维护(Servicing)所致。在老版本Windows中,维护的最小目标是文件,而在Windows Vista中,最小目标则是模块。在更新某一特定二进制文件时,我们会发布一个新版本的完整模块,这个新版本也和原版本一起,保存在模块仓库中。模块的最高版本会被“投射”给系统,而仓库中的老版本则不会被使用。而这也是导致模块仓库越来越大的第三个原因。

模块仓库中,并非每个模块都是适用的,这意味着并非所有模块都需要“投射”给操作系统。例如,对于可使用IIS,但尚未安装该组件的系统,仓库中就存在IIS模块,但并不会“投射”到系统中任何一个可能需要该模块的位置。如果您熟悉老版本Windows中多分支维护(Multi-branch servicing)的工作方式,那么您肯定就能理解,对于每个发行分支(Distribution Branch)和Service Pack级别,我们都提供了不同版本的模块,而所有这些不同的版本也都保存在WinSxS文件夹中,哪怕这些模块目前并不立刻需要使用。因此,对于一个SP1后(Post SP1) GDR补丁包,如果其中包含对一个模块的更新,最终将会给WinSxS文件夹中安装四个不同版本的模块,对于某些模块,在64位系统上,版本数量还会翻倍。

译注:有关GDR的介绍,请参考下列链接。同时下列链接中的介绍也解释了为什么说GDR补丁会带来至少四个版本的问题。

http://social.microsoft.com/Forums/zh-CN/windowsxpzhchs/thread/7fcd1ccd-01e9-41c9-bc6e-3605ee0277e5

这样您应该能够明白,为什么仓库会慢慢变得巨大,您的下一个问题可能是:我们为什么不直接删除模块的老版本。简而言之,这是为了提升可靠性。模块仓库,以及系统中的其他信息,使得我们可以随时判断某个组件要“投射”的最适合版本。这意味着,如果您卸载了某个安全更新,我们还可以给系统中安装下一个最高版本好的模块,因此这就彻底解决了“无序卸载”的问题。同时这也意味着如果您打算安装一个可选功能,我们并不会简单地直接安装RTM版本的模块,而是会寻找系统中可用的最新版本的模块。而因为系统中每个模块的状态变化,都有可能触发其他模块的变化,而且因为所有模块之间的关系是由系统决定的,因此我们可以用老版本系统中无法实现的方式响应这些需求。

唯一可以安全地给WinSxS文件夹减肥的方法是减少系统可能执行的操作数量,而最简单的方式是卸载卸载首次安装某一模块的数据包,借此即可删除系统中这些数据包的后续版本。Service Pack 1中包含了一个名为VSP1CLN.EXE的二进制文件,这个工具可以将Service Pack数据包永久性固定到系统中(无法删除),并可删除所有相关模块的RTM版本。但只有在确定不再需要RTM版本,永久保留Service Pack的情况下,才能使用该工具。

没错,WinSXS文件夹非常大,并且随着系统的使用,还将继续增大。我希望本文可以帮助大家了解该文件夹的用途,以及可以针对该文件夹进行的操作。但也需要注意,Windows的维护结构(Servicing structure)以及仓库的布局,以后还有可能更改。

Joseph Conway
Senior Support Escalation Engineer
Microsoft Enterprise Platforms Support

分享:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

发表评论前,先做个简单的数学题吧: * Time limit is exhausted. Please reload CAPTCHA.