系统盘飘红是服务器上最常见的告警之一,也是最容易被乱操作的地方:有人直接搜到某个 C:\Windows\SoftwareDistribution 就删,有人看到 Installer 目录大得离谱想清空,还有人把整个 WinSxS 文件夹直接 rd /s——这些操作轻则让 Windows Update 失效,重则系统直接崩。
这篇分成三条线:怎么精准找出占空间的东西(不用装第三方软件也能做)、哪些能安全清理、哪些绝对不能碰(含每条命令的风险说明)、以及怎么把云盘或本地盘扩到正确的大小(DiskPart、扩展卷、跨区卷的选择与其风险)。目标是让你既能马上腾出几十 GB,又不至于把机器弄坏。
第一步:先看清空间是怎么被吃掉的
不要凭感觉。先用一行命令确认各卷的余量:
Get-Volume | Where-Object DriveLetter | Select-Object DriveLetter, FileSystemLabel,
@{n='容量GB';e={[math]::Round($_.Size/1GB,1)}},
@{n='剩余GB';e={[math]::Round($_.SizeRemaining/1GB,1)}} |
Format-Table -AutoSize
# 快速列出一级和二级目录大小
Get-ChildItem C:\ -Directory -Force -ErrorAction SilentlyContinue |
ForEach-Object {
$s = (Get-ChildItem $_.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum
[PSCustomObject]@{目录=$_.FullName; 大小MB=[math]::Round($s/1MB,1)}
} | Sort-Object 大小MB -Descending | Select-Object -First 20 | Format-Table -AutoSize
图形化工具有两个经典选择,都是免费软件:WinDirStat 会把目录渲染成彩色矩形图(Treemap),一眼看出是哪个文件;TreeSize Free 更偏表格+树形,能导出 CSV。它们对 NTFS 权限敏感目录(如 System Volume Information)会跳过,属于正常现象,用管理员身份运行能看得多一些。
| 工具 | 优势 | 适用 |
|---|---|---|
| WinDirStat | 可视化矩形图,最直观 | 找单个超大文件、日志、备份文件 |
| TreeSize Free | 表格+树形,可导出,支持 UNC 网络路径 | 找出增长中的目录、做对比 |
| PowerShell 脚本 | 无安装、可计划任务、适合 Server Core | 定期巡检、出报表 |
服务器端常见的空间大户,按出现频率排:
| 目录 / 文件 | 典型大小 | 能否清理 |
|---|---|---|
C:\Windows\WinSxS |
5-15 GB | 不能手动删,用 DISM 组件清理 |
C:\Windows\Installer |
2-10 GB | 不能直接删,会导致卸载/修复失败 |
C:\Windows\SoftwareDistribution\Download |
0.5-8 GB | 可安全清理 |
C:\inetpub\logs\LogFiles |
视站点量,可到几十 GB | 可清理并配日志轮转 |
C:\hiberfil.sys |
物理内存的 40% 左右 | 服务器场景可关闭休眠 |
C:\pagefile.sys |
内存 1.5 倍 | 不建议设为 0,可调整大小 |
C:\Users\<用户>\AppData\Local\Temp |
视情况 | 可清理 |
C:\$Recycle.Bin |
视情况 | 可清理 |
| 旧版 Windows(Windows.old) | 15-25 GB | 升级后确认无需回退可删 |
CBS 日志 C:\Windows\Logs\CBS |
打补丁失败时可暴涨 | 可清理,非凡情况也无害 |
先用 fsutil volume diskfree C: 或者上面的 Get-Volume 确认基线,清理完再对比,别凭感觉判断有没有效果。
第二步:能立刻安全执行的清理
磁盘清理 cleanmgr
系统自带的清洁工具,功能比想象中强,且基本不会删错东西。注意桌面体验版本才GUI可用,Server Core 没有:
cleanmgr /sageset:1 :: 首次运行,勾选要清理的项目(如 Windows Update 清理、临时文件、回收站)
cleanmgr /sagerun:1 :: 按上面保存的配置执行,适合脚本化
:: 直接指定驱动器
cleanmgr /d C:
sageset 会让你在一堆复选框里选,其中"以前的 Windows 安装(Windows.old)"和"Windows Update 清理"这两项往往能一次性释放十几 GB。注意选中 Windows.old 意味着不能再回退到旧系统。
清理 Windows Update 缓存
这是最安全、收益最直接的一项。更新失败、安装卡住时清理它也常常有效:
Stop-Service wuauserv, bits -Force
Remove-Item 'C:\Windows\SoftwareDistribution\Download\*' -Recurse -Force -ErrorAction SilentlyContinue
Start-Service wuauserv, bits
# 也可以用 cleanmgr 配合这件事做更彻底的清理
net stop wuauserv
net start wuauserv
DISM 组件清理(针对 WinSxS)
WinSxS 目录绝对不能直接删除。它是组件存储区,存放着系统文件多版本,卸载补丁、启用功能、修复系统都依赖它。正确的压缩方式是通过 DISM:
:: 强烈建议:只做组件压缩,安全
Dism.exe /Online /Cleanup-Image /StartComponentCleanup
:: 更激进:删除所有被替代组件的备份(不可逆,卸载旧更新可能失败)
Dism.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase
:: 查看组件存储大小
Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore
| 命令 | 释放空间 | 风险 |
|---|---|---|
/StartComponentCleanup |
几 GB | 低,推荐定期执行 |
/ResetBase |
可能多几 GB | 高:已安装的更新无法卸载,执行后系统在 Installed Updates 里不再保留旧版本 |
/AnalyzeComponentStore |
不清理,只出报告 | 无 |
/ResetBase 建议只在确认系统稳定、短期不会卸载补丁时执行,且最好在系统上线前对 C 盘只做只读快照,有需要能还原。
关掉休眠文件
服务器基本不需要休眠,hiberfil.sys 通常等于物理内存的 40%(约 40% 用于休眠),直接禁用能立刻释放几个 GB:
powercfg -h off :: 删除 hiberfil.sys 并禁用休眠
powercfg -a :: 查看当前可用的休眠/待机状态
注意:禁用休眠后"快速启动"功能也失效,并且某些笔记本唤醒策略会被改变。服务器上这两个东西本来也不常用,可以放心关。
临时文件、回收站与 IIS 日志
# 用户临时目录(跳过正在使用的文件)
Remove-Item 'C:\Windows\Temp\*' -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "C:\Users\*\AppData\Local\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue
# 清空所有用户的回收站
Clear-RecycleBin -Force -ErrorAction SilentlyContinue
# IIS 日志:保留 30 天,删除更早的
$cutoff = (Get-Date).AddDays(-30)
Get-ChildItem 'C:\inetpub\logs\LogFiles' -Recurse -File -Filter *.log |
Where-Object { $_.LastWriteTime -lt $cutoff } | Remove-Item -Force
上面的 IIS 清理最好是定期脚本,建议配个计划任务每周跑一次。更根本的办法是在 IIS 管理器里启用日志滚动并限制日志文件数量,或者在 applicationHost.xml 里改 directory 把日志目录迁到 D 盘。
风险提示:清理前务必确认当前没有备份、还原、更新操作正在进行。生产服务器上执行批量删除,建议先用
-WhatIf参数跑一遍看命中清单,确认无误再去掉参数执行。涉及到 C:\Windows 下的文件,务必先创建快照。
第三步:扩容——先决定改云盘还是加盘
清理只能治标。空间长期紧张时应该扩容。云硬盘扩容的一般流程(主流云厂商大同小异):先在控制台把磁盘容量调大 → 在操作系统里扩展分区。两步缺一不可,很多人只做了第一步,然后不知道为什么系统里还是老大小。
风险提示:扩容前必须对整块磁盘做快照。扩容在绝大多数情况下是安全的,但如果操作过程中断电、或遇到已有分区表损坏的情况,数据可能丢失。快照是最后一道防线,花不了几分钟。
系统里的操作,图形路径是 diskmgmt.msc → 右键 C 盘 → 扩展卷;前提是未分配空间必须紧挨着目标分区的右侧。最常见的情况是 C 盘和未分配空间之间夹着一个"恢复分区",这时候图形界面的"扩展卷"是灰的,需要用 diskpart 或挪走恢复分区。
diskpart 方式:
diskpart
list disk
select disk 0
list volume
select volume 2 :: 选中要扩展的卷(C 盘),根据 list volume 的输出确认
extend size=10240 :: 扩展 10 GB(单位 MB);不写 size 则用尽全部相邻空闲
extend filesystem :: 部分场景需要
list volume
exit
风险提示:
extend会做在线文件系统扩展,理论上不丢数据,但强烈建议执行前完成备份。select volume一定要用list volume的输出核对,选错卷会把相邻卷的空间并到错误的分区上。
如果未分配空间不相邻,有两种处理办法:
| 方案 | 做法 | 风险与限制 |
|---|---|---|
| 用磁盘管理工具挪动分区 | diskpart 不支持直接移动,需第三方分区工具 | 移动分区耗时长,断电风险高 |
| 跨区卷 / 跨磁盘扩展 | diskmgmt 里右键 → 扩展卷 → 选另一块磁盘的空闲空间 | 变成动态磁盘,可靠性下降,不推荐 |
| 再加一块数据盘(推荐) | 云控制台购买新盘 → 联机 → 初始化 → 分配盘符 | 无风险,迁移数据后重新挂载 |
跨区卷要重点提醒:把 C 盘做成跨区卷意味着它横跨两块物理磁盘,任意一块损坏都会导致整个卷不可用,数据几乎不可恢复。系统盘千万不要这么做。正确做法是加一块盘挂到某个空目录(如 D:\Data 或直接用 D:),再把数据迁过去。
新加盘初始化:
diskpart
list disk
select disk 1
online disk :: 若显示脱机
attributes disk clear readonly
convert gpt :: 新盘建议 GPT
create partition primary
format quick fs=ntfs label=Data
assign letter=D
exit
# PowerShell 等价写法(更适合脚本)
Get-Disk | Where-Object PartitionStyle -eq 'RAW' | Initialize-Disk -PartitionStyle GPT
New-Partition -DiskNumber 1 -UseMaximumSize -DriveLetter D | Format-Volume -FileSystem NTFS -NewFileSystemLabel Data -Confirm:$false
还有一种常被忽略的"免费空间":压缩旧文件。对日志归档、dump 这类不常访问的大文件启用 NTFS 压缩,通常能省 40%-70%:
compact /c /s:D:\Archive :: 压缩整个目录并保留文件夹属性
compact /c /exe:ntfs D:\Archive\*.log
# 查看压缩状态
compact /q D:\Archive
注意:压缩会增加 CPU 开销,且压缩后文件仍然同样的读写接口,但数据库文件 / 页面文件不适合压缩。只对本机归档类目压缩。
最后是行动之前把这三个检查做完:有无可用快照、当前卷的健康状态、有没有正在跑的备份。
Get-Volume | Select-Object DriveLetter, HealthStatus, SizeRemaining
Get-PhysicalDisk | Select-Object FriendlyName, HealthStatus, MediaType
vssadmin list shadows :: 查看卷影副本,避免清理动作破坏备份链
常见问题
Q:WinSxS 占了 15 GB,能不能直接删?
不能。它不是一次性补丁目录,而是组件存储。用 Dism /Online /Cleanup-Image /StartComponentCleanup 才是正确做法,/ResetBase 虽然能清得更干净但会让更新无法卸载。
Q:云控制台已经把磁盘从 100 GB 扩到 200 GB,系统里还是 100 GB?
容量变更只改变了底层虚拟磁盘大小,分区和文件系统没变。如果相邻的可用空间存在,在 diskmgmt.msc 里右键该卷 → 扩展卷,或用 diskpart extend。看到"扩展卷"是灰的,说明中间隔了恢复分区等不可移动对象。
Q:什么时候该选择加一块数据盘而不是扩展现有盘?
空间增长来自业务数据(IIS 站点、数据库文件、上传目录)时,加数据盘更清晰,日后还可以单独做快照、单独扩容;只是系统盘被补丁塞满时,扩展现有盘更简单。系统盘做跨区卷是最不推荐的方案。
Q:cleanmgr 执行完没什么变化?
大概率是没有勾选"Windows Update 清理"和"以前的 Windows 安装"。因为这些项需要在管理员权限下运行才会显示。用 cleanmgr /sageset:1 显式勾选后重新执行。
Q:删除了几个大文件,可用空间没变?
检查回收站是否清空、是否有进程仍然持有已删文件的句柄、或者该文件是否只是某个卷影副本的一部分。可以用 vssadmin list shadowstorage 查看卷影副本占用。
总结
- 先看
Get-Volume/ TreeSize / WinDirStat 定位占用,别凭感觉删; NTFS 权限敏感目录要管理员权限。 - 安全清理优先级:cleanmgr → Windows Update 缓存 → DISM 组件清理 → 关休眠 → 临时文件与 IIS 日志;
WinSxS和Installer不能手动删。 DISM /ResetBase不可用收益换不可逆风险:更新无法卸载,生产环境要谨慎。- 扩容是"控制台扩容 + 系统内扩展"两步;
extend前必须确认相邻空闲空间存在,系统盘绝对不要做跨区卷。 - 所有涉及磁盘结构的操作前先做快照,
select disk/select volume用输出核对盘号,这是避免灾难性错误的最后一道防线。
企业QQ咨询




