제목만 봐도 재미없게 느껴지시죠? 타블로 사건 때문에 너무 지쳐서 아무 컴퓨터 관련 글 하나 메인에 올려놓고 좀 쉬려고 합니다. 오늘부터 월드컵 축제도 시작되었으니까요. ^^
 
우선 중수 이상 분들은 저의 글보다 상킴님의 글을 먼저 읽어보세요. 상킴님은 MS 직원이시고 자세한 이론적 설명이 잘 되어 있습니다.

http://blogs.technet.com/b/sankim/archive/2009/07/27/servicing-stack-winsxs.aspx
http://blogs.technet.com/b/sankim/archive/2009/08/17/servicing-stack-2-winsxs.aspx


저는 초보 분들을 위해 좀 쉬운 내용으로 설명드리겠습니다.

제목에 이미 의도가 나와있지만 결론부터 말씀드리자면 WinSxS 폴더는 굳이 옮길 필요가 없다는 것입니다. 이 폴더가 뭔지 잘 모르는 분들이 대부분이실 것 같은데 그냥 이런 것도 있구나 하고 가볍게 읽어주세요.


윈도우 7 32비트 순수 버전을 VMware에 설치한 상태로 C 드라이브의 용량과 Windows 폴더의 용량을 비교해봤습니다.




뭔가 이상한 점을 발견하셨나요? C 드라이브의 현재 사용중인 용량은 6.31GB입니다. 그런데 Windows 폴더의 크기는 7.01GB입니다. 뭔가 앞뒤가 좀 안 맞지요? 배보다 배꼽이 더 큰 상황인데 말이 좀 안 되는 것 같습니다. 게다가 현재 C 드라이브에는 1GB짜리 페이징 파일도 들어있습니다. 그걸 감안하면 결국 Windows 폴더가 1.7GB 정도 용량이 오버된 상태라고 봐야겠죠. 게다가 프로그램 폴더나 사용자 계정 폴더 등 Windows 외의 폴더도 있으니... 뭔가 잘못된 것 같습니다.

왜 이런 증상이 일어날까요? 물론 범인은 WinSxS 폴더인데 우선 이 폴더 크기를 한번 보겠습니다.



무려 용량이 3.75GB나 되는군요. 하지만 이건 순수 윈도우 상태라 그런 것이고 프로그램을 많이 설치하거나 윈도우 업데이트를 많이 하면 이 폴더의 덩치는 훨씬 더 커집니다. 게다가 이건 32비트라 용량이 작은 편이고 64비트의 경우 용량이 더 큽니다.

그래서 사람들이 생각한게 이 덩치큰 폴더를 삭제하거나 다른 파티션으로 옮기는 것이었습니다. 일단 삭제는 절대로 하면 안 됩니다. 아니 삭제해도 아무런 문제가 없을 수는 있지만 그건 특별한 경우이고 윈도우 업데이트에 실패한다든지, 프로그램이 오작동 한다든지 분명 안정성이 떨어지게 되어 있습니다. 영어로 되어있지만 상킴님 글과 비슷하긴 한데 궁금하시면 아래 글도 한번 읽어보세요.

http://www.winvistaclub.com/f16.html

그러니까 한마디로 표현하자면,  WinSxS 폴더의 역할은 같은 DLL 파일이라도 버전이 다양하게 존재하는데 각 프로그램마다 요구하는 버전이 다 다르기 때문에 프로그램 호환성을 유지하기 위해 각 버전별 DLL 파일을 다 보관하고 있는 도서관 같은 개념입니다.

그리고 윈도우 업데이트의 경우 시스템 파일이 교체되었다. => 만약 그 업데이트를 삭제한다면? 예전 시스템 파일로 돌려야겠지요. 하지만 예전 시스템 파일로 돌리려면 예전 시스템 파일을 가지고 있어야 합니다. 따라서 새로운 업데이트를 설치하게 되면 원래 있던 버전의 시스템 파일은 삭제되는 것이 아니고 그대로 저 도서관에 존재하면서, 새로운 파일만 추가로 도서관에 입고되는 것입니다. 그러다보니 사용하면 사용할 수록 도서관의 덩치가 점점 더 커지는 것입니다.

일단 삭제는 하면 안 된다고 말씀드렸고, 이걸 옮기는 방법이 있는가? 물론 있습니다. 하지만 굳이 옮길 필요가 없습니다. 나중에 서비스팩 자꾸 나오면 덩치가 많이 커지기 때문에 그때는 어떨지 모르겠지만 지금 상태에선 그다지 실익이 없습니다.

왜 실익이 없는지 설명을 드리겠습니다. 우선 WinSxS 폴더에 들어있는 파일은 대부분 하드링크입니다. 먼저 하드링크에 대해 이해를 해봅시다. 그림판 신공으로 설명드리겠습니다.


하드디스크 안에는 진짜 파일이 존재합니다. 그런데 그 진짜 파일은 이름을 가지고 있죠. 그 이름표를 저렇게 표현했는데 저 이름표가 바로 하드링크입니다. 즉 윈도우에서 111.txt 라는 이름을 찾으면 진짜 파일로 연결해주는 다리 역할을 해주는게 하드링크입니다. 일반적으로 파일을 삭제한다고 하면 진짜 파일을 삭제하는 것이 아니고 저 하드링크를 제거해버리는 것입니다. 이름표가 없으면 더이상 저 파일에 접근하지 못하겠지요. 이게 적절한 비유일지 모르겠는데 DNS랑 비슷한 개념이라 보시면 될 것 같습니다.

하드링크는 여러개 생성할 수 있습니다.


이렇게 하나의 진짜 파일에 2개의 하드링크가 존재하는 경우 실제로 디스크 내에서 공간은 하나만 차지하는데 이름표만 2개가 생성된 것입니다. 그래서 111.txt와 222.txt로 윈도우 상에 파일이 2개 보이니까 용량도 2배 먹을 것 같지만 그렇지 않습니다. 진짜 파일의 크기로만 존재합니다. 아 물론 윈도우 탐색기 상에서 해당 폴더의 용량을 보면 두 파일이 중복 카운팅 됩니다. 하지만 디스크 전체 용량을 계산할 때는 중복 계산되지 않습니다.

만약 111.txt를 제거하면 어떻게 될까요? 아무런 문제 없습니다. 222.txt라는 이름표가 남아있기 때문에 진짜 파일에는 그대로 접근할 수 있습니다.

대충 개념이 이해되셨나요? 제가 왜 WinSxS 폴더를 옮길 필요가 없다고 말씀드렸냐면 대부분의 파일들은 하드링크로 존재하기 때문입니다. 즉 실제로 WinSxS 폴더에는 파일이 들어있지 않습니다. 대부분 Windows\System32 폴더 안에 들어있을겁니다. 윈도우 7 32비트 순수 상태로 테스트를 해보니 3.75GB의 WinSxS 폴더 중에 실제로 진짜 파일은 400mb 정도밖에 되지 않았고 나머지 파일들은 전부 뻥쟁이 하드링크 들이었습니다. 따라서 저 폴더를 다른 곳으로 옮긴다고 한들 C 드라이브에서 확보할 수 있는 용량은 400mb 밖에 안 된다는 것입니다.

아 물론 여기서 약간의 개념혼동이 생길 수 있습니다. 사실 제가 뻥쟁이 하드링크라고 표현했지만 원칙적으로 111.txt가 진짜인지 222.txt가 진짜인지 그런건 따질 수 없습니다. 둘다 하드링크이니까 동등한 자격이 있는 것이죠. 그래서 따지고보면 System32 폴더에 있는 파일들이 오리지날이고 WinSxS 폴더에 있는 파일들은 뻥쟁이라고 표현하는 것은 어찌보면 잘못된 표현입니다. 하지만 윈도우에서 기본적으로 파일을 찾을 때는 System32 폴더의 하드링크를 사용하기 때문에 그쪽이 웬지 더 오리지날 같다는 느낌을 주기는 합니다. 어차피 파일, 폴더, 확장자에 대해 깊이있게 들어가면 우리가 평소 생각하는 개념 자체가 무너지기 때문에 그런 복잡한 생각은 하지 맙시다.


그런데 윈도우 업데이트를 많이 하고 나중에 서비스팩이 자꾸 나오면 어떻게 되는가? 그때는 이야기가 좀 달라집니다. 자꾸 동일한 파일이면서 빌드만 다른 파일들이 WinSxS에 쌓이게 되면 덩치가 매우 커질텐데 그렇게 된 경우 실제로 하드링크의 비율이 줄어들게 되겠지요. 그림으로 표현하자면 이렇습니다.


저 DLL 파일들이 전부 다 이름은 똑같은데 빌드만 다른 DLL 파일이라고 하겠습니다. 업데이트를 자주 하다보니 계속해서 빌드가 올라간 경우 DLL 5세대가 최신이라 할 때 실제로 System32 폴더 안에는 DLL 5세대만 존재하고 WinSxS 폴더 안에는 1세대부터 5세대까지 다 들어있는데 그중 5세대만 뻥쟁이 하드링크이고 나머지 1~4세대는 진짜 파일들입니다. 이렇게 현재 사용되고 있는 DLL 5세대는 Projection 상태라 표현하고 나머지 놀고있는 1~4세대 파일들은 Stage 상태라 표현합니다. 그런데 이런 Stage 상태의 파일들이 자꾸 쌓이게 되면 WinSxS 폴더의 크기는 겉잡을 수 없을 만큼 커지겠지요. 제가 윈도우 업데이트를 하나도 안 하는 이유가 바로 이것 때문입니다. WinSxS 폴더 덩치 키우는게 싫어서 그럽니다. ㅠㅠ


사실 제가 이 아래로 글을 더 길게 적었는데요, 그냥 다 지웠습니다. 글이 너무 길어지면 읽어보기 싫어지니까요. 원래는 제가 사용자 계정 폴더를 다른 곳으로 옮기는 문제에 대해 포스팅하려 했습니다. 그래서 mklink에 대해 알아보고 하드링크와 심볼릭, 정션 등에 대해 좀 알아봤습니다. 그런데 사용자 계정 폴더 옮기는 문제는 단순하지가 않아 보이더군요. 일단 몇가지만 설명드리자면

Documents and Settings => Users 폴더의 정션
Users\All Users => ProgramData 폴더의 심볼릭
Users\Default User => Users\Default 폴더의 정션

근데 또 ProgramData 폴더 안으로 들어가보면 온갖 위치의 정션으로 구성되어 있습니다. 즉 이게 얽히고설켜있는 문제입니다. 그래서 단순히 D에 복사하는 것도 잘 안 됩니다. 또 해보면 링크 개념들은 같이 따라가지 않는 것 같더군요. 그래서 혹시나 불안정하게 옮겨둔 폴더에 정션만 걸어주는 방법을 선택했을 때 만에 하나 문제가 발생하게 될까바 함부로 소개해드리지 못했습니다.


말이 많았는데 아무튼 결론적으로 WinSxS 폴더는 그냥 C 드라이브에 두고 사용하자는게 제 생각입니다. 어차피 나중에 SP1 나오면 컴포넌트 클린업 도구가 포함되지 않을까 싶고, 그때 가선 그걸로 가끔씩 청소해주면 되니까 SP1 나오면 보고 다시 포스팅을 하든지 하겠습니다.



========== 내용 추가 ==========

이왕 시작한거 심볼릭 링크랑 정션에 대해서도 알아보겠습니다. 제가 잘못 이해하고 있을지도 모르니 고수님들 틀린 내용 있다면 지적 부탁드립니다.

심볼릭 링크는 하드 링크와 달리 그냥 바로가기의 개념입니다. 리디렉션이라고 해야할까요? 그래서 하드 링크처럼 진짜 물리적인 파일의 위치를 가리키는 것이 아니라 하드 링크 자체를 지향하는 것 같습니다.


따라서 빨간색 111.txt 파일을 삭제하게 되면 심볼릭 링크인 파란색 111.txt 파일은 무용지물이 됩니다. 진짜 파일과는 직접적으로 연결이 되어 있지 않으니까요. 그러니까 진짜 이건 단순하게 리디렉션 해주는 바로가기 개념으로 생각하시면 됩니다. 윈도우에서 사용하는 바로가기 파일은 lnk 라는 확장자를 가지지만 이 심볼릭 링크는 원본 파일과 확장자까지 같은 이름으로 해도 되기 때문에 그 점에서는 바로가기와 차이가 있습니다. 하지만 특성 자체는 바로가기와 거의 같습니다.

만약 심볼릭에 심볼릭이 걸린 경우 어떻게 될까요?


이 경우 파란색 심볼릭 링크가 지워지면 보라색 심볼릭 링크는 무용지물이 되어버립니다. 즉 심볼릭 링크는 단순히 바로가기 개념이라고 이해하시면 됩니다.


Junction은 확실하게 잘 모르겠습니다. 일단 특성은 심볼릭 링크와 거의 같습니다. 폴더 교차점을 만드는 것인데 대충 검색해본 결과 정션이 구형이고 심볼릭이 신형이라 합니다. 그래서 심볼릭이 조금 더 좋다고 하네요. 정션은 XP에서도 사용 가능하지만 심볼릭은 비스타부터 사용된 개념이라고 합니다. 따라서 폴더 링크를 만드는 경우 정션보다는 심볼릭으로 만드는게 더 좋을 것 같습니다.


그래서 사용자 계정이나 WinSxS 폴더를 옮긴다는 말은 우선 해당 폴더를 다른 파티션으로 복사한 다음 PE로 부팅해서 원래 C에 있던 폴더는 삭제하고 그 자리에 심볼릭 링크를 만들어주면 된다는 것입니다. 다만 제가 이렇게 해서 실사용을 해보지는 않았기 때문에 어떠한 문제점이 발생할지는 모릅니다. 폴더를 복사하거나 이동시킬 때 그 안에 들어있던 링크 개념들은 같이 따라가지 않더라구요. 이게 문제를 일으킬 소지가 있기 때문에 함부로 옮기기는 좀 그렇습니다.