背景
- 我们的服务器是 Server 2016 Version 1607
- 我们的服务器是在不同的时间创建的,有些已经运行了几个月,有些则运行了几年
- 我们通过 SCCM 部署补丁
问题
在我们为 Windows Server 2016 虚拟机应用最新和最好的补丁程序的维护窗口期间,我们注意到偶尔(随着时间的推移更频繁地),Cumulative Update
(CU)补丁程序最终要么卡住,要么需要数小时才能应用。我们认为,这些长时间的原因是服务器上被取代的更新的存在和数量。
所以这就留下了一个问题——为什么这些被取代的更新会累积而不被清理?我们如何清理它们?
TL:博士
简而言之,被取代的更新是由 Windows 拥有的计划任务失败引起的。此计划任务负责清理被取代的更新。要解决此问题,您可以运行
Dism.exe
命令手动清理这些被取代的更新。这允许在维护窗口期间进行更快、更可靠的修补。在此处查找有关这些计划任务和Dism.exe
命令的更多信息。事件日志中被取代的更新
所以首先让我们谈谈我们如何知道有 CU 和其他更新正在清理并延迟补丁安装。对于刚开始研究 Windows Server 上的修补程序的人,有一个称为 Windows 事件查看器日志
Setup
,其中包含与修补程序安装相关的事件。在此事件查看器日志中,我们可以看到一个事件,表明 KB 被标记为已被取代并且将被删除。下面是这样一个事件的样子。当我们在维护窗口期间开始修补时,这些事件总是会发生。这意味着我们花在补丁上的大部分时间实际上都花在了处理这些被取代的更新上,导致我们的补丁花费的时间比我们计划的要长得多。
那么为什么这些被取代的更新仍然存在并且只在修补期间被清理呢?
Windows 任务计划程序
StartComponentCleanup
在研究这个问题时,我看到了一篇文章,详细介绍了 Windows 内置的清理过时组件的功能。事实证明,这正是我想要的。本文讨论的清理是清理旧组件,这与删除被取代的更新相关。
清理 WinSxS 文件夹 - 任务计划程序
本文提供有关内置任务计划程序任务的信息:
Library\Microsoft\Windows\Servicing\StartComponentCleanup
在我们的服务器上查看此任务后,我发现此任务的许多实例要么无法运行,要么在它能够完成之前被停止。我认为这是由于上述 Microsoft 摘录中讨论的时间限制造成的,并且我相信此任务在我们的许多服务器上失败是我们遇到被取代更新过剩的原因。当此任务无法运行时,无法定期清理被取代的更新。
安装程序
然后前面提到的文章继续讨论
Dism.exe
可用于执行此手动清理的命令。清理 WinSxS 文件夹 - Dism.exe
实际上,您可以运行与计划任务运行相同的命令来清理过时的组件,尽管不受计划任务施加的限制。
我发现首先运行带有标志的
Dism.exe
命令是有益的。AnalyzeComponentStore
这将返回是否有任何过时的组件以及您是否应该运行清理命令。Dism.exe /online /Cleanup-Image /AnalyzeComponentStore
如果您在结果中看到这一点:
Component Store Cleanup Recommended : Yes
那么您可能可以使用以下命令继续进行组件清理。请注意,这可能需要相当长的时间才能运行。Dism.exe /online /Cleanup-Image /StartComponentCleanup
运行这个命令正是我想要的!运行此命令将启动 Windows 删除被取代更新的过程(如下面的屏幕截图所示)。这很重要,因为它使我们能够在维护窗口之前主动删除被取代的更新。这使我们的维护窗口更加可预测,超出窗口或卡住的可能性更小。
结论
简而言之,被取代的更新是由 Windows 拥有的计划任务失败引起的。此计划任务负责清理被取代的更新。要解决此问题,您可以运行
Dism.exe
命令手动清理这些被取代的更新。这允许在维护窗口期间进行更快、更可靠的修补。有关修补 Windows Server 版本 1607 的奖励信息
下面是一篇讨论微软用来修补操作系统的机制的文章。它提供了有关如何以及为什么 1607 版本的 Windows 需要比其他版本更长的时间来修补的信息。如果你在这个版本上,它可能值得一看。
如何提高 Windows 累积更新安装时间