我为客户运行一个(远程托管的)虚拟服务器,该服务器使用 Windows 2008 Server。最初,它有 10 GB 的空间。在几周的时间里 - 在此期间没有什么除了使用基于 Web 的票务系统进行正常工作外,Windows 开始大量填充其臭名昭著的“winsxs”目录,最终硬盘已满,我们不得不订购另外 5 GB。现在,三周后,这 5 GB 也被 winsxs 占用,我又无法在机器上工作了。Winsxs 现在有 8 GB 大,其余的 windows 目录有 5 GB。
我在网上找到了各种资料,描述了同样的问题。显然,Windows 2008 会存储它在正常更新过程中下载的所有 DLL 的所有语言版本。删除那里的内容被描述为极其危险,因为它包含重要组件。我还没有找到任何工具或说明来识别和删除不再需要的文件。
我该怎么办?这是正常现象吗?如果是,其他同样空间有限的服务器如何管理?我可以关闭或打开什么吗?
在预定义的服务器角色中,只有“文件服务”(或无论英文中叫什么,它都是瑞士服务器)被激活。此外,我还安装了 Apache、mySQL 和 Subversion。自动更新已激活。
编辑:问题仍然存在。
注意:我知道 WinSXS 目录主要由符号链接组成,并且用户看到它的大小后经常会惊慌失措。尽管如此,在 15 GB 的空间中,有 1.5 MB 被程序和数据占用,并且没有什么还剩下。我很高兴我甚至可以访问那台该死的机器。*我已经释放了 1 GB 的数据,这些数据在 24 小时内就被 Windows 填满了。这就像在恐怖电影里一样。我尝试过:
- 安装 SP2(附带 compcln.exe)不是一个选择,因为磁盘空间甚至不够。
- 机器上没有 vsp1clean.exe,可能是因为 SP1 已经合并到系统中。事实上,任何地方都不存在名为 *cln.exe 的文件。
- 有不卷影副本。卷影副本未处于活动状态。
- 据我所知,没有活动的系统还原点。
- 唯一激活的服务器角色是“文件服务器”。
- 标准的“清理”功能(右键单击 C: 驱动器)给我带来了令人困惑的 2 MB 垃圾内容和临时 Internet 文件。
- 对我来说,使用“cleanup winsxs”脚本不是一个选择,它们看起来都太可疑了。我找不到 Microsoft 直接解决此问题的任何内容。
答案1
WinSxS 目录占用的空间远不及 Explorer 报告的空间,因为它使用指向物理文件而非实际文件的硬链接。Explorer 只是在报告硬链接的大小时存在问题。
这篇文章磁盘空间(此处引用 http://aspoc.net/archives/2008/11/20/winsxs-disk-space-and-windows-7/) 对 WinSxS 目录进行了很好的解释。
至于您的实际磁盘使用问题 - 您可以尝试运行 COMPCLN.EXE 以查看是否可以清理任何旧的服务包和热修复文件,这应该会很有帮助。我还会查看任何日志目录以查看是否还有其他事情发生。
答案2
我和你的情况一样。我有 5 个全新的 2008 VM,并且在过去一年中,我发现它们需要的磁盘空间越来越多。让我用 windrstat 来说明一下。
以下是全新 2008 服务器:
3.8 GB winsxs 目录
下面是一个屏幕截图生产 2008 服务器:
5.4GB winsxs 目录
最后是屏幕截图全新2008R2服务器: 5.4GB winsxs 目录
据我所知,没有办法截断 winsxs 目录。WinSxS 代表 Windows Side-by-Side。为了减少 DLL hell(即依赖项)的影响,Microsoft 决定将系统中安装的每个 DLL 的每个版本都保存在 winsxs 目录中。
我认为这意味着两件事:
虽然 winsxs 中有一些硬链接,但唯一的硬链接应该是当前 DLL 的硬链接。换句话说,系统中活动的当前 DLL 被硬链接回此 winsxs 文件夹。
所有以前版本的 DLL 仍然可用,并备份在 winsxs 目录中。正如您在所有示例中所看到的,如果 winsxs 目录确实是“大部分是硬链接”,那么它就不可能占用当前磁盘使用量的 50% 以上。现在,即使 winsxs 目录确实是“大部分是硬链接”,50% 的使用率也意味着您的整个 C: 驱动器都硬链接回 winsxs 目录。
我什么方法都试过了。删除旧文件、卸载补丁、删除“$”补丁目录。什么方法都试过了。
最后,我把所有服务器上的 C: 分区都扩大到了 30GB。这只是一个临时解决方案,因为 winsxs 目录会继续增长。不过好消息是,最新版本的 NTFS 允许您在不重启的情况下扩大分区。多么方便啊。
WinSxS 不仅仅是一个烦人的目录,它还是所有 Windows 开发人员的新方法。WinSxS 不会很快消失。开发人员正在使用 WinSxS 并依赖它,直到出现新的 DLL 归档或依赖性解析方法。
我觉得,对于每个新的 Windows 2008/7/Vista 系统,30GB 的 C: 空间差不多就够了。(就目前而言)有足够的空间来存放补丁、日志和一些应用程序。
我迫不及待地希望有人能解决这一切,并开始使用以下方法重新激活补丁前的 DLL:流氓清单,成为攻击/利用载体。
答案3
根据我的经验,15 GB 不够,特别是如果它是一台有某些活动的 64 位机器......
扩展 VPS 磁盘和系统分区应该很容易,无需重新安装任何东西,不管它有多贵。为现代 Windows Server VPS 提供不到 60GB 的系统磁盘似乎从一开始就没有经过深思熟虑,即使 ~30GB 可以满足一段时间的需求 :7
选择 32 位安装会减少一些开销,而选择 Server Core 则会减少很多开销。我的 32 位 Server 2008 Core 文件服务器运行 svnserve、dfs、打印服务等,并定期更新,大约 5 GB……而我的 64 位 Server 2008 Standard 为 Web 应用程序(使用 IIS 的 asp.net 和 php)提供服务,目前占用 30 GB。当然,这两个指标不包括数据存储/分区,只有 Windows 系统,这两个指标都只是示例,我有 64 位 Server 2008 系统磁盘,目前占用 10 到 35 GB 的空间。
您安装的每个工具、升级或应用程序都会增大 winsxs 目录,并且卸载东西并不总是对 winsxs 产生任何影响,因为系统可能认为这些依赖项被其他工具使用。
答案4
如果可能的话,您可以尝试将 WinSXS 移动到另一个分区作为解决方法。据我所知,没有任何方法可以删除 WinSXS 的内容。这个可爱的小东西是 Vista/Win2008 操作的核心,所以...我没听说过有什么比将它移动到另一个分区更好的方法。
以下是介绍如何操作的博客链接:点击
我建议你在尝试此过程之前对整个 C: 分区进行完整备份(最好是备份一个映像)。请注意,我只在 Vista 上尝试过此操作,而没有在 Win2008 Server 上尝试过。