Servicing Stack (1) 부제: WinSxS 폴더를 이해하다

인터넷을 떠돌다가 우연히 Windows Vista와 7의 WinSxS(C:\Windows\WinSxS) 폴더에 대한 글들을 보았습니다, 대부분의 질문이 “하드 디스크가 부족해서 확인해 보니까 WinSxS 폴더가 엄청 디스크를 차지 하더라고요, 이걸 어떻게 지우죠?” 라는 질문으로 시작해서 답변으로는 WinSxS 폴더의 삭제 방법을 알려주는 글들이 많았습니다.

디스크 용량에 상당히 민감할 수 밖에 없는 일반 데스크톱 사용자 윈도우 탐색기를 통해 보이는 WinSxS 폴더의 GB급의 크기는 큰 부담일 것 입니다만 뭔지도 모르고 무턱대고 삭제하는건 상당히 위험하겠죠? 그래서 이번 포스팅에서는 WinSxS 폴더의 정체를 밝히고 실질적으로 WinSxS를 관리하는 ‘Servicing Stack’이라는 개념을 알아보고 WinSxS의 사이즈를 안정적으로 줄 일 수 있는 방법도 소개 하도록 하겠습니다.

오늘은 첫 번째 시간으로 WinSxS를 이해하기 위한 핵심인 하드 링크(Hard link)에 대해서 설명 드리겠습니다. 우선은 WinSxS는 머리에서 잠시 내려 놓으시고 먼저 하드 링크를 이해하는데 힘써주십시오. (그리 어렵지 않습니다..)

하드링크(Hard Link)란? 정의: 파일의 디렉토리 엔트리(Directory entry)를 칭하며 모든 파일은 하나 이상의 하드링크를 가진다.

흠.. 좀 이해하기 어렵죠? 조금 풀어서 설명 드리면 디스크 상의 파일 모든 파일은 사용자 혹은 시스템이 액세스 하기 위한 경로(폴더와 파일명) 정보인 디렉토리 엔트리(Directory entire)를 가지는데 이를 하드링크라고 부릅니다. 예를 들어 디스크 위에 A라는 파일이 있는데 이것에 접근 하려면 C:\temp\01.txt라는 경로가 필요한데 이 경로정보를 하드링크라고 부릅니다. 하나의 파일은 한 개 이상의 하드링크를 가지며 A 라는 파일이 있을 때 C:\temp\01.txt와 C:\sankim\02.txt라는 하드링크 두개를 가질 수 있습니다. 이 두 개는 경로나 파일 이름은 다르지만 결국은 하나의 같은 파일 A가 되는 것입니다.

그래도 아직 설명이 드라이(Dry)한 게 가슴에 와 닿지 않죠? 아래 예제와 함께 하드링크를 설명 드리겠습니다.

디스크 상에 A라는 파일이 있고 경로는 C:\temp\01.txt 입니다, 즉 사용자(혹은 시스템이나 응용프로그램)는 C:\temp\01.txt라는 경로(Path)를 통해서 파일 A에 액세스 할 수 있습니다. C:\temp\01.txt라는 디렉토리 엔트리는 파일 A에 액세스 하기 위한 일종의 링크로 생각 할 수 있고 그래서 하드링크라고 부릅니다. *보통 우리가 파일을 휴지통에서 삭제(Delete)하는 것은 이 하드링크를 제거하는 것입니다.

clip_image002

*중요: 위 갈색 네모에 있는 C:\temp\01.txt는 파일이 아닙니다, 실제 파일은 ‘파일 A’이고 갈색 네모 박스는 사용자나 시스템이 ‘파일 A’에 액세스 할 수 있도록 해주는 경로 정보입니다*

여기서 만약 사용자 혹은 시스템이 파일 A에 접근하기 위한 경로를 C:\temp\01.txt 뿐만 아니라 다른 이름으로도 액세스해야 할 필요가 있다면 또 다른 하드링크를 생성해 하나의 파일에 두 개 이상의 경로를 만들 수 있습니다. 파일 A에 하드 링크로 또 다른 경로 C:\sankim\02.txt를 추가 한다면 아래와 같은 구조를 가지게 됩니다.

clip_image004

이러면 사용자(시스템 혹은 응용프로그램 포함)는 C:\temp\01.txt이건 C:\sankim\02.txt이건 동일하게 파일 A에 액세스 할 수 있습니다. 다시 한번 강조하지만 여기서 중요한 건 두 개의 파일이 생성되는 것이 아니라 디스크 위에 파일은 그대로고 그 파일에 액세스 할 수 있는 경로 정보인 디렉토리 엔트리가 하나 더 추가 되었다는 것입니다.

만약 여기서 C:\temp\01.txt를 삭제하면 어떻게 될까요? 그래도 사용자는 아래 그림과 같이 C:\sankim\02.txt를 통해 파일 A에 액세스 할 수 있습니다. 왜냐 하면 파일 A에 액세스 할 수 있는 C:\temp\01.txt라는 경로 없어진 것뿐이고 다른 경로는 남아 있기 때문입니다.

clip_image006

사용자가 하드링크를 만들려면 Mklink.exe라는 도구를 할 수 있는데요, 그럼 다중 하드링크를 제 Windows 7 컴퓨터에서 만들어 보도록 하겠습니다. 하드링크 생성을 위해 아래와 같이 “mklink.exe /H”를 이용해 C:\sankim이라는 폴더에 02.txt라는 Hard link를 만듭니다. *여기서 /H 옵션을 빼면 심볼릭 링크 (Symbolic link)가 만들어 집니다, 심볼릭 링크는 나중에 설명 드리겠습니다.

clip_image008

위와 같이 하드링크를 만든 뒤 01.txt에서 아무 텍스트를 넣고 02.txt를 열어 보면 01.txt와 동일한 내용임을 확인 할 수 있습니다, 또 반대로 02.txt에서 텍스트를 변경해도 01.txt에서도 동일하게 텍스트가 변경된 것을 확인 할 수 있습니다. 이것은 두 경로가 경로 정보만 다를 뿐 동일한 파일이라는 증거가 됩니다.

그럼 01.txt를 삭제했을 때 어떤 현상이 나타나는지 확인해 보도록 하겠습니다.

clip_image010

C:\temp\01.txt를 삭제 했지만 여전히 C:\sankim\02.txt를 통해서 파일에 액세스가 가능함을 확인 할 수 있습니다. 이제 하드링크가 이해가 되시죠?

지금까지 열심히 하드링크를 설명 드렸는데 하드링크하고 WinSxS가 무슨 관계냐고요? WinSxS 폴더를 열어서 확인해 보면 안에 있는 파일들이 모두 Windows(일반적으로 C:\windows)폴더에 있는 파일과 동일한 파일인 것을 확인 할 수 있습니다. 이것은 최초 시스템 파일들(Windows 폴더에 있는 파일들)은 원래는 WinSxS에 기본 경로가 있었고 윈도우가 설치 되면서 Windows 폴더에 하드링크를 생성한 것 입니다. 그래서 시스템이나 사용자는 Windows\system32에 연결된 하드링크 된 파일을 이용하는 것입니다. 아래 그림에서처럼 같이 “fsutil hardlink list”로 확인하면 세가지 파일 모두 Windows/system32와 WinSxs에 하드링크 되어 있는 것을 확인 할 수 있습니다.

clip_image012

아래 ‘WinSxS 하드링크 예’그림에서와 같이 Windows 폴더가 원본 파일인 것 같지만 사실은 원래Windows\WinSxS에 처음 하드링크된 파일들이고 Windows에 있는 파일들은 WinSxS에 있는 파일들을 하드링크를 생성해 사용하는 것입니다.

clip_image014

그러므로 어차피 경로가 다르게 보일 뿐이지 동일한 하나의 파일이므로 WinSxS가 있다고 해서 중복된 파일인해 디스크 공간을 더 차지하는 것은 아닙니다.

자~ 그럼 WinSxS가 있다고 해서 디스크 공간을 소비하는 것은 아니라는 것을 하드링크를 통해 이해하게 되었습니다. 하지만 그와 별개로 시간이 지날수록 WinSxS의 크기는 점점 커져만 가는데요.. 왜 그런 걸까요? 그것은 Windows Vista, Server 2008에서부터 새로 적용된 Servicing 이라는 OS Component를 관리하는 매커니즘 때문입니다. 다음 시간에는 새로운 Servicing에 대해서 말씀드리도록 하도록 하겠습니다.