如何在 Windows Server 2008 R2 的新更新中清理 WinSxS 目录并释放磁盘空间

原文地址:https://blogs.technet.com/b/askpfeplat/archive/2014/05/13/how-to-clean-up-the-winsxs-directory-and-free-up-disk-space-on-windows-server-2008-r2-with-new-update.aspx

应广大读者要求,本文将详细介绍如何使用 Windows Server 2008 R2 的更新功能,来清理 WinSxS 目录和组件存储。

https://support.microsoft.com/kb/2852386

先复习一下,我之前的博文中提到过,Windows Server 2008 R2 更新类似于 Windows 7 客户端的一项修复。

Windows 7 版本中的这项修复介绍了 Disk Cleanup 向导中的一个附加选项,它可以清理之前版本中的 Windows 更新文件。KB2852386 在 Windows Server 2008 R2 中增加了一个 Disk Cleanup 选项,类似于 Windows 7 的更新。

这对于 Windows Server 2008 R2 来说意味着什么呢?更新安装完成后并且在执行清理之前,必须安装 Desktop Experience Feature。为什么呢?因为在 Windows Server 2008 R2 中 Disk Cleanup 不是默认安装的。相反,它是与 Desktop Experience Feature 一起安装的一个组件。

为什么更新中不包括类似 Windows Server 2012 R2 中的 DISM 开关一样的功能?

这还有待评估。但是由于所需的大量改变和严格的变更审批流程,这种方式是不可行的。所有用户都更新到 Windows Server 2012 R2 需要很长一段时间,并且根据企业客户内部调查的反馈,这次以 Disk Cleanup 形式的更新仍然是很有用的,即使是在以 Desktop Experience 为前提的条件下。希望您也这么认为。然而 Desktop Experience 这一要求对于一些人来说会影响他们的环境,但是我们仍然决定发布它,希望在某些情况下可以对您有所帮助。

如何获取更新?

可以在 Windows Update 上获取更新。或从 Microsoft Update Catalog 网站上手动下载。也可以从上面提到的 KB 文章中找到下载链接。

下面开始清理旧的 Windows 更新文件!

首先,看一下已安装的 Windows 2008 R2 Server SP1,在 Windows Explorer 中,我的 Windows/WinSxS 目录大小如下图所示:

WinSxS 目录的大小会根据服务器不同而有所不同。有些人的 WinSxS 目录较小,而有些人的则较大。

与安装其他更新一样安装更新。只需下载并双击 .msu 文件:

安装更新时不需要提前安装 Desktop Experience,但是如果再次查看 WinSxS 目录,会发现大小没有改变。这与我们想要运行 Disk Cleanup 并使其生效的预期一样。也不需要重新启动来安装修补程序。

但在安装 Desktop Experience Feature 之前,Disk Cleanup 还无法使用。

安装 Desktop Experience 时,还需要附加功能。选择 Add Required Features,单击 Next,然后单击 Install:

重新启动,完成安装。

出现提示时,单击 Close and Reboot。

重新启动后,可在 Start --> All Programs --> Accessories --> System Tools 中找到 Disk Cleanup 选项:

启动后,Disk Cleanup 会提示选择想要清理的磁盘:

单击 Ok,执行扫描:

提供可清理的几个选项,包括 Windows Update Cleanup 这一新选项:

与 Windows 7 的清理类似,清理结果会有所不同,而且在下次重启时还会进行实际清理。重新启动后,查看一下 WinSxS 目录,如下图所示:

自动化操作

Tom Moser 写了一个可全程自动化的 PowerShell 脚本。我可以获得欢呼吗?好吧,欢呼对于 IT 管理员来说有点太过了,那我可以获得一点点表扬吗?这个脚本确实打败了手动操作。

在 TechNet Script Center 中可找到该脚本,网址为:

https://gallery.technet.microsoft.com/scriptcenter/CleanMgrexeKB2852386-83d7a1ae

这个脚本是做什么的?

简单来说,脚本的作用如下:

1)安装 Desktop Experience (如果以前未安装),然后重新启动。

2)设置适当的注册表项来自动清理。该脚本不仅可以清理之前的 Windows Update 文件,还可以清理 Service Pack 文件。

3)利用脚本启动清理。

4)如果 Desktop Experience 不是以前安装的,脚本会卸载它。

5)执行最终重启。

更多信息请看以下内容。

该脚本可在服务器的任何目录中运行。它有两个参数:LogPath 和 NoReboot(一个开关)。LogPath 允许用户指定一个日志位置,或者在没有指定的情况下,脚本会在执行的目录中默认创建一个日志。NoReboot 允许用户不重启,但之后将需要管理员手动重启。

注意:请检查日志文件以确保验证过程成功完成并且无需手动交互。如果脚本成功完成,日志则以 CleanMgr complete 作为结束。

脚本包含几个阶段,使用注册表项来跟踪进程。初步运行后,将自身作为计划任务嵌入,并以本地系统运行。最后阶段是删除任务。

根据挂起的重新启动,我们发现这一阶段可能会产生几次重启。所以如果服务器重启了几次,无需担心。

其他选项

除了这一更新中包含的清理机制,如果使用的是 SP1 并且没有清理过,那么我强烈建议通过运行以下命令来进行清理:

dism /online /cleanup-image /spsuperseded

或者

如果已经安装了 Desktop Experience 并因此有了 Disk Cleanup 实用工具,可以选择图中的选项:

指定 /spsuperceded 开关或选择删除 Service Pack 备份文件,这一操作将移除卸载 Service Pack 的功能。如果以前没有这样做过,那么这会释放一些空间。

此更新的起源 (提示:Windows Server 2012 R2)

我提到了很多次,这是一个 back port。什么意思呢?也就是说这项功能已经被加入后来的操作系统中。在本例中,操作系统是 Windows Server 2012 R2。我们不仅要有自动清理早期版本中 Windows Update 文件的几个机制,还要有准确确定组件存储(即 WinSxS 目录)大小的能力。

在 Windows Server 2012 R2 中准确确定组件存储大小的命令为:

Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore

运行该命令,分析组件存储,以此来确定其大小并建议是否需要清理。请注意,下图屏幕中 Windows Explorer 列出了组件存储的报告大小和实际大小:

组件存储从一开始就比 Windows Server 2008 R2 的小。这不是因为使用按需功能删除了角色和功能,而是 Windows Server 2012 R2 的默认设置。这是 Windows Server 2012 R2 的又一次胜利!

看一下 5.12 GB 的细节。Shared with Windows 帐户占用 3.83 GB。Shared with Windows 指的是 WinSxS 目录和 Windows 文件位置之间硬链接文件的大小。这些硬链接表面看起来占用了空间,但实际上没有,可以将其从组件存储大小中减去。因此,组件存储的实际大小包括 Backups、Disabled Features plus Cache 和 Temporary Data 等内容,即 1.28 GB。

回到清理功能。

从上面的截图中可以看到,它建议清理组件存储。在 Windows Server 2012 R2 中,可以通过运行以下命令手动清理组件存储:

Dism.exe /online /Cleanup-Image /StartComponentCleanup

该命令做了些什么?运行命令时,Windows 清理了先前版本中更新的组件。也就是说,它执行的正是 Windows Server 2008 R2 SP1 所更新的功能。删除了先前版本中利用 Windows Updates 更新的文件。

运行 /StartCompomentCleanup 之后,再一次分析大小,可以看到:

没有显著差异。这很大程度上是因为一直在运行着清理命令。相同的命令可作为计划任务每 30 天运行一次,时间限制为 1 小时。

但是在计划任务中,任务在更新组件安装完成后,将至少等待 30 天才卸载先前组件。这个计划任务在 Task Scheduler Library\Microsoft\Windows\Servicing\StartComponentCleanup 目录的 Task Scheduler 下:

 

更多信息请参考:  https://technet.microsoft.com/en-us/library/dn251565.aspx

如果熟悉了清理模式,并且想执行深度清理,可以使用 /resetbase 和 /startcomponentcleanup 命令删除每个组件在组件存储中的替代版本:

Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase

这将移除卸载更新的能力。

不要忘记完全删除所有的角色和功能,这也可以增加空间。关于 Features on Demand  的详细内容请参见我的另一篇博文:https://blogs.technet.com/b/askpfeplat/archive/2013/02/24/how-to-reduce-the-size-of-the-winsxs-directory-and-free-up-disk-space-on-windows-server-2012-using-features-on-demand.aspx

下表显示了不同操作系统是在何时引入 Cleanup 和 WinSxS 功能的:

操作系统

压缩未

使用的WinSxS文件

清理先前 Windows Update 文件

自动清理先前 Windows Update 文件

清理所有组件

按需功能

Windows Server 2008 R2

With KB2852386

Windows Server 2012

With KB2821895

x

x

x

Windows Server 2012 R2

x

x

x

x

x

想要了解更多相关信息?

请参见 AskCore 团队博客发表的系列文章:关于 Windows Server 2012 R2 服务改进的深入研究:

Windows Servicing 新增功能:第 1 部分

Windows Servicing 新增功能:Windows Footprint 的削减:第 2 部分

Windows Servicing 新增功能:服务堆栈的改进:第 3 部分

更多关于 Desktop Experience Feature 的介绍

Desktop Experience Feature 包括以下组件和功能:

* Windows Media Player

* Desktop themes

* Video for Windows (AVI support)

* Windows SideShow

* Windows Defender

* Disk Cleanup

* Sync Center

* Sound Recorder

* Character Map

* Snipping Tool

* Ink Support

当 Windows Defender 服务在重启后的运行中发生异常时,以上大部分组件不会自动打开。您可能想停止服务并在重启后禁用。不是所有第三方反病毒软件都与 Windows Defender 冲突,但有些还是不兼容的。

~ Charity Shelbourne 和 Tom Moser,Spring Cleaning Servers,1998

2014 年 5 月 15 日更新

我们都知道有一种方法可以将适当的 Disk Cleanup/CleanMgr 文件复制到适当位置,从而避免安装 Desktop Experience。如果这是一种经过测试并且受支持的方法,那么我们肯定会在这篇博文中详细介绍并使用这种方法来自动清理。然而,已经很早就确定这种方法是不受支持的。如果您想要这么做,请自行尝试,但风险自负。