Servicing Stack (2) 부제: 커져만 가는 WinSxS 폴더 사이즈를 줄여보자!

이번 포스팅은 Servicing과 WinSxS 두 번째 이야기 입니다. 이번 포스팅에서는 Servicing에 대해서 설명 드리고 시간이 갈수록 WinSxS 폴더의 크기가 커지는 이유와 그 해결 방법을 말씀 드리겠습니다.

Servicing이란? Windows Vista 이전에는 보안 업데이트나 BugFix를 위해 시스템을 업데이트를 하면 INF 기반으로 exe나 dll 같은 시스템 파일 이나 레지스트리 값들을 각 파일 단위로 업데이트 하였습니다, 그러나 Vista에서 부터는 Servicing이라는 새로운 Component 관리 메커니즘을 통해 파일, 레지스트리 값, 서비스, Generic Command, Dependencies, Category를 묶어 하나의 Component 단위로 관리합니다, 그리고 이런 여러 Component들을 하나로 묶은 것을 Deployment라고 하며, 또 이 여러 Deployment들을 하나로 묶은 것을 Package라고 합니다. 윈도우 업데이트가 이뤄질 때는 각각의 Component 단위로 이뤄지는 것이 아니라 Package 단위로 이뤄집니다. 그리고 WinSxS 폴더는 이 Component를 모아 저장해둔 공간이므로 Component Store라고 부릅니다.

Servicing이 적용된 Vista 이후는 Windows가 처음 설치 될 때 윈도우 설치 CD에 들어 있는 모든 시스템 파일들을 Component Store(WinSxS 폴더)에 넣고 설치 작업을 진행합니다, 그래서 새로운 기능을 설치 하거나 SFC(System File Checker)를 실행 할 때 이전 버전 같이 윈도우 설치 CD를 넣으라는 메시지 박스가 나타나지 않습니다. 처음 Windows를 설치 할 때나 혹은 시스템 업데이트를 할 때 WinSxS 폴더에서 필요한 Component를 Windows 시스템 폴더(예. C:\Windows)에 연결되도록 하드링크를 만들어 시스템이나 사용자가 액세스 가능한 상태를 Projection이라고 하며 반대로 파일이 WinSxS 폴더에 저장되어 있기는 하지만 사용하지 않는(하드링크가 되어 있지 않는) 상태를 Stage라고 합니다. 이런 식으로 OS Component를 관리하는 메커니즘을 Servicing 이라고 합니다.

Servicing은 아래와 같은 구조를 가지고 있습니다.

clip_image002

[그림 1] Servicing 구조. (이 외에도 여러 구성들이 있지만 이해를 돕기 위해 단순화 하였습니다)

Windows Update 통해서나 MSU와 같은 업데이트 파일을 이용해 시스템을 업데이트 할 때 CBS(Component Based Servicing)는 우선 해당 Package가 현재 Windows에 설치되어야 할 Package인 지를 판단 합니다. 만약 CBS가 설치되어야 할 Package라고 판단하면 아래 CSI(Component Servicing Infrastructure)에게 넘겨 CSI에 의해 Package가 설치 됩니다.

*윈도우 서비스 관리자에서 보이는 Windows Module Installer 혹은 작업 관리자에서 볼 수 있는trustedinstaller.exe 프로세스가 CBS의 역할을 합니다.

왜 WinSxS 폴더의 크기는 끊임 없이 커져만 가는 걸까요? 앞 1탄에서 WinSxS 폴더에 있는 파일에 Windows 폴더에서 액세스 가능한 하드링크가 생성된 것이며 WinSxS 폴더에 있는 파일이 Windows 폴더에 있는 파일들과 중복되는 것이 아니라고 말씀 드렸습니다. 그렇다면 WinSxS폴더에 있는 하나의 파일이 Windows 폴더의 파일로 1:1로 매치 된다는 의미 인데 아래 그림 2를 보시면 Win32k.sys의 경우 여러 버전 별로 각각 존재하는 것을 볼 수 있습니다.

Servicing은 새로운 Update가 있으면 새로운 업데이트를 다운로드 한 뒤 이전 버전의 Component는 그대로 Component Store(WinSxS 폴더)에 남겨둔 채 다운로드 받은 새로운 Component를 사용(Projection)합니다. 아래 그림2 에서 보시는 것과 같이 만약 동일한 Component로 새로운 Update가 나오면 새 Update가 나올 때 마다 WinSxS에 Component들이 쌓이게 됩니다.

게다가 배포되는 Package안에는 각 서비스팩 버전 별로 각기 다른 버전의 Component가 들어 있어 그 크기는 더욱 커져만 갑니다. 예를 들어 A라는 업데이트가 하나 있다면, Package 안에는 Windows Vista RTM 버전, SP1 버전, SP2 버전에 맞는 업데이트 세가지를 모두 담고 있습니다. 즉 업데이트 A를 설치 하면 WinSxS에 RTM, SP1, SP2버전의 파일들을 모두 WinSxS 폴더에 저장해 두고 현재 윈도우 서비스팩 버전에 맞는 Component를 Projection 시키고 나머지 파일들은 Stage 합니다. 그래서 새로운 업데이트가 나올수록 WinSxS 폴더의 크기는 커져가는 것입니다.

clip_image004

[그림 2] WinSxS 폴더에 있는 여러 버전의 Win32k.sys

그럼 왜 이런 구조가 필요한 걸 까요? Servicing이 지난 버전 혹은 상위 서비스팩 버전의 Component 들까지 저장하고 있는 구조는 언뜻 보면 불합리해 보일 수도 있습니다만 이러한 메커니즘은 어떠한 상황에서도 시스템이 최신의 Component를 유지 할 수 있도록 할 수 있습니다.

예를 들어 만약 Windows XP에서 설치 되어 있는 업데이트 B를 제거 한다면 해당 업데이트가 설치 되기 이전의 상태로만 돌아 갈 것 입니다, 그러나 이전으로 돌아간 상태가 최신 상태라는 보장은 없습니다(왜냐 하면 현 버전과 이전 버전 중간에 무수히 많은 버전들이 나왔을 수 있으므로). 그러나 Servicing 구조는 지금까지 모든 Component에 대한 업데이트를 각 버전 별로 모두 가지고 있으므로 현재 상태에서 Stage되어 있는 최신의 Component만 Projection 시키면 됩니다. 또 다른 예로 Windows Vista SP1인 상태에서 만약 SP1을 제거한다면 이전 같으면 RTM 상태에서 또다시 Windows Update를 통해 최신의 버전으로 무수히 많은 업데이트를 해야 했겠지만 Servicing에서는 자신이 Component Store(WinSxS폴더)에 저장된 RTM Component중에 가장 최신의 Component로 Projection 시키게 됩니다.

그렇다면 시간이 갈수록 커질 수 밖에 없는 WinSxS 폴더의 공간을 줄일 수 있는 방법은 무엇이 있을까요? 웹을 검색해보면 WinSxS를 통째로 삭제하는 방법들을 볼 수 있습니다, 물론 삭제 한다고 지금 당장은 시스템에 문제가 생기지 않겠지만 Windows의 신뢰성에 문제를 일으킬 수 있는 문제이므로 WinSxS를 직접 삭제하시는 것은 피해주시기 바랍니다. 여러분들께서 WinSxS 폴더의 크기를 줄이는 가장 안전하고 효과적인 방법은 VSP1CLN.exe혹은 COMPCLN.exe를 실행 하는 것 입니다. 이 두 명령은 현재 컴퓨터에 설치된 서비스팩 이전의 Component들을 WinSxS 폴더에서 안정적으로 삭제합니다. 즉 현재 컴퓨터에 설치된 서비스팩 이전 버전의 Stage된 파일들을 제거해 디스크 공간 확보할 수 있는 방법입니다. 단 이 명령을 실행하면 서비스 팩을 제거 할 수 있는 옵션도 사라지고 해당 서비스팩 이전 상태로는 돌아 갈 수 없습니다.

* Windows Vista Service Pack 1이 설치된 컴퓨터에서는 VSP1CLN.exe를 실행 합니다. (Windows Server 2008의 경우는 기본적으로 SP1을 포함하므로 VSP1CLN.exe는 사용하지 않습니다)

*Windows Vista Service Pack 2, Windows Server 2008이 설치된 컴퓨터에서는 COMPCLN.exe를 실행 합니다.

그럼 VSP1CLN.exe의 실행 예를 보도록 하겠습니다. 아래 그림은 “My Notes to Myself and Others…”에서 가져 왔습니다.

실행 전)

clip_image006

VSP1CLN.exe 실행)

clip_image008

실행 후)

clip_image010

하드디스크의 여유 공간이 약 800MB가 늘어난 것을 볼 수 있습니다. J

오늘 포스팅은 여기까지 입니다, 글로 설명 드리기에는 참 복잡(?)한 내용이라 얼마나 이해하시는데 도움을 드렸는지 모르겠습니다. 그럼 더운 여름 건강히 보내시고 다음 포스팅에서 뵙도록 하겠습니다~