คำตอบสั้น ๆ: ไดรฟ์ C เต็มบน Windows Server เพราะ WinSxS ใหญ่ขึ้นเรื่อย ๆ วัดขนาดจริงด้วย DISM ล้าง component store อย่างถูกวิธี ล้าง cache อัปเดตและ log โดยไม่ลบไฟล์ระบบ
คู่มือนี้อธิบาย WinSxS ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
WinSxS (C:\Windows\WinSxS) คือ component store ของ Windows ที่เก็บไฟล์ของระบบทุกเวอร์ชันที่ติดตั้งผ่านอัปเดต เพื่อให้ Windows ซ่อมไฟล์ที่เสีย เปิดฟีเจอร์เพิ่ม และถอนอัปเดตได้ บน Windows Server ที่เปิดมาหลายปี โฟลเดอร์ WinSxS จะดูใหญ่ขึ้นทุกเดือนจนไดรฟ์ C เหลือที่ว่างไม่กี่ GB ผู้ดูแลจำนวนมากจึงคิดจะลบไฟล์ในโฟลเดอร์นี้เอง ซึ่งเป็นสิ่งที่ห้ามทำเด็ดขาด เพราะเครื่องอาจบูตไม่ขึ้นหรืออัปเดตไม่ได้อีกเลย
คู่มือนี้เหมาะกับผู้ดูแล Windows Server 2016, 2019, 2022 และ 2025 บนคลาวด์ที่ไดรฟ์ C ใกล้เต็ม หรือเจอการแจ้งเตือนพื้นที่ต่ำ เมื่อทำครบ คุณจะรู้ว่าพื้นที่หายไปที่ไหนจริง ล้าง WinSxS ด้วยเครื่องมือของ Microsoft ล้าง cache อัปเดต log และไฟล์ชั่วคราวอย่างปลอดภัย และตัดสินใจได้ว่าควรล้างต่อหรือควรขยายดิสก์
สิ่งที่ต้องเตรียม
- บัญชีในกลุ่ม Administrators และ PowerShell แบบ Run as administrator
- snapshot ของเครื่องหรือการสำรองข้อมูลล่าสุดที่กู้คืนได้ ก่อนลบไฟล์ใด ๆ บนไดรฟ์ระบบ
- ช่วงเวลาที่ไม่มีการติดตั้งอัปเดตค้างอยู่ ถ้า Windows Update ขึ้นว่า Restart required ให้รีสตาร์ตให้เสร็จก่อน เพราะ DISM จะล้างได้น้อยลงเมื่อมีงานอัปเดตค้าง
- พื้นที่ว่างบนไดรฟ์ C อย่างน้อย 1 ถึง 2 GB เพื่อให้ DISM ทำงานได้ ถ้าเหลือน้อยกว่านี้ ให้ทำขั้นตอนที่ 4 และ 5 ก่อน
ขั้นตอนที่ 1: หาว่าอะไรกินพื้นที่ไดรฟ์ C จริง
อย่าเพิ่งโทษ WinSxS จนกว่าจะเห็นตัวเลข ตรวจพื้นที่ว่างและโฟลเดอร์ระดับบนที่ใหญ่ที่สุดด้วยคำสั่งนี้ คำสั่งอาจใช้เวลาหลายนาทีบนดิสก์ที่มีไฟล์มาก
Get-PSDrive C | Select-Object Used, Free
Get-ChildItem C:\ -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object {
$sum = (Get-ChildItem $_.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum
[pscustomobject]@{ Folder = $_.FullName; GB = [math]::Round($sum / 1GB, 2) }
} | Sort-Object GB -Descending | Select-Object -First 10
ผลที่เจอบ่อยบนเซิร์ฟเวอร์จริงคือ C:\Windows ใหญ่ที่สุด ตามด้วย C:\inetpub ของเว็บเซิร์ฟเวอร์ที่ log สะสม โฟลเดอร์ของ SQL Server ที่เก็บไฟล์ backup ไว้บนไดรฟ์ C และ C:\Users ที่มีไฟล์ดาวน์โหลดของผู้ดูแล ถ้าโฟลเดอร์ใหญ่ที่สุดไม่ใช่ C:\Windows ให้แก้ที่ต้นเหตุนั้นก่อน การล้าง WinSxS อย่างเดียวจะไม่พอ
ตัวเลขของ C:\Windows ที่ได้จากคำสั่งด้านบนหรือจาก File Explorer จะสูงกว่าความจริง เพราะไฟล์ใน WinSxS ส่วนใหญ่เป็น hard link ที่ใช้ร่วมกับ C:\Windows\System32 ไฟล์ชุดเดียวถูกนับสองครั้ง ขนาดจริงต้องวัดด้วย DISM ในขั้นตอนถัดไป
ขั้นตอนที่ 2: วัดขนาดจริงของ WinSxS ด้วย DISM
Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore
อ่านผลทีละบรรทัด
- Actual Size of Component Store คือขนาดจริงของ WinSxS หลังหักไฟล์ที่ใช้ร่วมกัน
- Shared with Windows คือไฟล์ที่ระบบใช้อยู่ ล้างไม่ได้และไม่ควรพยายามล้าง
- Backups and Disabled Features คือไฟล์เวอร์ชันเก่าที่ถูกแทนที่ด้วยอัปเดตใหม่ และ payload ของฟีเจอร์ที่ไม่ได้เปิด ส่วนนี้คือส่วนที่ล้างได้
- Component Store Cleanup Recommended ถ้าเป็น Yes แปลว่าล้างแล้วจะได้พื้นที่คืนจริง ถ้าเป็น No การล้างจะได้คืนน้อยมาก
ขั้นตอนที่ 3: ล้าง WinSxS ด้วย StartComponentCleanup
คำสั่งนี้ลบเวอร์ชันเก่าของ component ที่ถูกแทนที่แล้ว เป็นวิธีที่ Microsoft แนะนำ ใช้เวลาตั้งแต่ไม่กี่นาทีจนถึงชั่วโมงกว่าบนเครื่องที่ไม่เคยล้าง อย่าปิดหน้าต่างหรือรีสตาร์ตระหว่างทำงาน แม้แถบความคืบหน้าจะค้างที่ตัวเลขเดิมนาน
Dism.exe /Online /Cleanup-Image /StartComponentCleanup
Windows มีงานตั้งเวลาชื่อ StartComponentCleanup ที่ล้าง WinSxS ให้เองตอนเครื่องว่าง แต่งานนี้รอให้อัปเดตติดตั้งมาแล้วอย่างน้อย 30 วันก่อนจึงลบเวอร์ชันเก่า และหยุดเมื่อครบเวลาที่กำหนด เครื่องที่ทำงานตลอดเวลาจึงล้างไม่ทันการสะสม ถ้าต้องการสั่งงานเดียวกันนี้ทันที
schtasks.exe /Run /TN "\Microsoft\Windows\Servicing\StartComponentCleanup"
เมื่อไรควรใช้ /ResetBase
การเติม /ResetBase จะลบเวอร์ชันเก่าของทุก component ที่ถูกแทนที่ทันที ได้พื้นที่คืนมากขึ้น แต่หลังจากนั้นจะถอนอัปเดตที่ติดตั้งไปแล้วไม่ได้ ใช้เฉพาะเมื่อเครื่องทำงานกับอัปเดตล่าสุดได้ปกติมาหลายสัปดาห์แล้ว และมี snapshot ที่ถอยกลับได้
Dism.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase
หลังล้างเสร็จ ให้รัน AnalyzeComponentStore อีกครั้ง ค่า Backups and Disabled Features ควรลดลงอย่างเห็นได้ชัด และ Cleanup Recommended ควรเป็น No
ขั้นตอนที่ 4: ล้าง cache ของ Windows Update และไฟล์ชั่วคราว
ไฟล์อัปเดตที่ดาวน์โหลดมาแล้วค้างอยู่ใน C:\Windows\SoftwareDistribution\Download ไม่ใช่ส่วนของ WinSxS และลบได้อย่างปลอดภัยเมื่อไม่มีอัปเดตกำลังติดตั้ง ถ้ายังต้องใช้ Windows Update จะดาวน์โหลดใหม่เอง
Stop-Service wuauserv, bits -Force
Remove-Item C:\Windows\SoftwareDistribution\Download\* -Recurse -Force
Start-Service wuauserv, bits
ต่อด้วยไฟล์ชั่วคราวของระบบที่เก่ากว่า 7 วัน ไฟล์ที่โปรแกรมเปิดใช้อยู่จะลบไม่ได้และถูกข้ามไปเอง
Get-ChildItem C:\Windows\Temp -Recurse -File -Force -ErrorAction SilentlyContinue |
Where-Object LastWriteTime -lt (Get-Date).AddDays(-7) |
Remove-Item -Force -ErrorAction SilentlyContinue
อีกเครื่องมือที่ปลอดภัยคือ Disk Cleanup พิมพ์ cleanmgr เลือกไดรฟ์ C คลิก Clean up system files แล้วติ๊ก Windows Update Cleanup, Temporary files และ System error memory dump files ถ้าเครื่องเพิ่งอัปเกรด Windows Server จะมีรายการ Previous Windows installation(s) ซึ่งคือโฟลเดอร์ Windows.old ที่มักใหญ่หลายสิบ GB ลบได้เมื่อมั่นใจว่าระบบใหม่ทำงานปกติแล้ว