노무현 대통령 배너
BLOG main image
왕미친놈의 왕미친세상입니다. 미친 소리는 써도 되지만, 근거 없는 소리는 쓰면 안 됩니다.


팁텍

처음 올리는 팁이다. 그런데 처음부터 황당한 팁이다. 또한 전혀 효과가 없을 수도 있다. 왜? 압축이지만 압축이 아니기 때문이다. 다만 이 팁을 잘 쓰면 확실히 용량을 줄일 수 있다.

  • 참고 : 이 글에서 다루는 비주얼 스튜디오 익스프레스(Visual Studio Express)의 최신 버전은 Visual Studio 2008 Express 이며, 마이크로소프트 MSDN 홈페이지에서 무료로 구할 수 있다. 이 비주얼 스튜디오 익스프레스는 비주얼 스튜디오의 축약 버전이라서 기능에 제한이 있고, 상업용 프로그램 제작에도 제약을 가지고 있다. 하지만 당장 쓸 만한 프로그래밍 툴 및 프로그래밍 통합 환경(IDE)을 구할 수 없다면, 이것도 좋은 대안이 될 수 있다.

팁의 발견

오랜만에 비주얼 스튜디오 2005 익스프레스(Visual Studio 2005 Express)를 설치하려고 하드디스크에 잠들어 있던 iso 파일을 뒤졌다. 그런데 막상 이미지를 살펴보니 너무 중복 파일이 많았다. 일단 하위 폴더인 WCU를 옮겨 보니~ 아뿔싸! 먼저 설치하지 않는 한 옮기게 되면 설치 도중 오류가 발생한다. ㅡㅡ; 쳇!

이 경우 이미지 안에 있는 WCU 폴더에서 먼저 설치한 뒤에 본 프로그램을 설치하면 되지만, 폴더를 옮긴 뒤에 항상 기억할 수 있다는 보장이 없었다.

또한 비슷비슷한 이미지가 모두 다섯 개였다. VB.iso, VC.iso, VCS.iso, VJS.iso, VWD.iso. 참고로 비주얼 스튜디오 익스프레스는 무료이며. ^^a 이미지 파일 내부 경로의 구조는 위와 같다(이때 VB 폴더는 없지만, 압축을 풀었을 때는 저와 같이 된다.). 이때 WCU 폴더가 다른 이미지 파일에도 거의 똑같이 존재한다.

이때 생각난 것이 바로 마이크로소프트에서 배포하는 oscdimg 프로그램이다. 이 프로그램은 마이크로소프트에서 CD 이미지를 만들 수 있게 제공하는 프로그램이다. 최신 버전은 2.54로 알려져 있다. 주로 쓰이는 버전은 oscdimg의 바로 앞 버전인 CDIMAGE v2.47이다. CDIMAGE v2.47 다음 버전이 oscdimg인데, 기능이 많이 줄어들었다. 그러다가 2.54 버전에서는 CDIMAGE에서 지원하던 기능을 모두 지원하도록 바뀌었다.

설명서는 마이크로소프트 테크넷에서 구할 수 있으며,( http://technet.microsoft.com/ko-kr/library/cc749036.aspx ) oscdimg v2.54용이다.

프로그램 설명

oscdimg의 기본 사용법은 다음과 같다.

OSCDIMG [선택사항] 작업대상(원본) 만들파일

실제로 적용하면 다음과 같다.

OSCDIMG -L볼륨명 -H -M -X -O -N "작업대상(원본)" "만들파일.ISO"

사용자가 지정해야 하는 부분은 굵은 글씨로 하겠다.

처음부터 차례대로 설명하자면 다음과 같다. 선택사항 -L과 -X를 제외한 나머지는 반드시 지정해야 한다. -X는 반드시는 아니지만 대부분의 압축파일이 지원하고 있으므로 지정하는 편이 낫다.

  • -L : 볼륨 레이블을 지정합니다. l과 labelname 사이에 공백을 넣지 않습니다. 예: -lMYLABEL

  • -H : 숨김 속성을 가진 디렉터리와 파일을 포함합니다.

  • -M : 이미지의 최대 크기 제한을 무시합니다. 곧 이미지의 크기가 681,984,000바이트보다 크더라도 무시하고 진행합니다.

  • -X : 이미지의 AutoCRC 값을 계산하고 인코딩합니다.

  • -O : MD5 해시 알고리즘으로 파일을 비교해 중복 파일을 한 번만 인코딩하여 저장소를 최적화합니다.

  • -N : (도스의 8.3 이름보다) 긴 파일 이름을 사용합니다.

매개변수 가운데 원본폴더와 만들파일 이름은 만약에 대비하여 위와 같이 따옴표로 묶는 편이 낫다.

적용

이 팁을 생각하게 된 원인은 의외로 단순했다. 이 기술은 수많은 WOW CD에 담긴 파일을 처리하는 방법이다. 그것을 자주 보았지만, 전혀 느끼지 못했다.

그러다가 Visual.Studio.2005.Express.Edition.en.iso (651,726,848 바이트)라는 파일을 보게 되었다. 분명 한국어판에는 저런 CD를 지원하지 않는데, 영어판에는 지원이 되고 있었고, 어떤 이유에서인지 인터넷에 풀려 있었다. 물론 저기에 담긴 파일은 모두 무료 버전으로 비주얼 스튜디오 2005보다 기능의 제약이 많다. 내가 앞서 예를 든 .ISO 파일은 대부분 한글판으로 저렇게 전체를 묶은 CD 이미지를 구할 수 없었다.

아무튼 저런 CD가 나에게 있었으면 좋겠다고 생각하고, 압축을 풀었는데 용량이 2,369,667,072 바이트로 처음보다 3.5배로 늘어나 버렸다. 그것을 본 그때 "이 방법"도 저장 용량을 줄이는 좋은 방법이라는 생각이 머릿속을 스치고 지나갔다.

이 방법은 중복 파일이 많으면 많을수록 효과가 좋다. oscdimg 프로그램은 압축을 해 주는 프로그램이 아니라, 단순히 파일을 묶어서 CD 마스터링 이미지를 만들어주는 프로그램일 뿐이기 때문이다.

  • 참고 : 이때 이런 유틸을 패키징 유틸리티라고 부르는데, 도스와 윈도에서는 대부분의 압축 프로그램이 패키징 기능을 제공하고 있다. 그러나 유닉스 계열에서는 압축 프로그램과 패키징 프로그램이 따로 나뉜 경우가 많다. 대표적인 경우가 바로 tar, deb, rpm 등이다. 특히 tar는 압축 없이 파일을 그냥 묶어만 주는 특이한 프로그램으로, 초기 유닉스에서부터 현존하는 여러 유닉스와 리눅스 등에서도 널리 쓰이는 유틸리티이기도 하다. 유닉스에서는 강력한 파이프라인 기능을 바탕으로 패키징 기능과 압축 기능을 나누어서 사용할 수 있다. 그러나 도스에서는 파이프라인이 64킬로바이트 한계를 지녔기 때문에 파이프라인을 이용하여 크기가 큰 파일이나 파일 수가 많은 디렉터리를 다룰 수 없었다. 결국 압축 파일이 패키징 기능도 갖추어야만 했다. 이런 이유로 이 글에서는 패키징 기능도 압축이라고 설명하겠다.

압축 풀기

우선 Visual.Studio.2005.Express.Edition.en.iso 파일과 VB.iso, VC.iso, VCS.iso, VJS.iso, VWD.iso 파일들을 자신이 만든 임시 폴더에 압축을 풀어 놓자. 편의상 Visual.Studio.2005.Express.Edition.en.iso 파일의 압축을 풀어 VSEN 폴더에 집어넣고, VB.iso, VC.iso, VCS.iso, VJS.iso, VWD.iso 한글판 비주얼 스튜디오 익스프레스 파일들은 각각 파일 이름대로 VB, VC, VCS, VJS, VWD라고 폴더를 만들었다.

참고로 압축을 풀기 전의 용량은 다음과 같다.

  • VB.iso : 555,814,912 바이트
    VC.iso : 587,999,232 바이트
    VCS.iso : 552,095,744 바이트
    VJS.iso : 459,505,664 바이트
    VWD.iso : 562,378,752 바이트
  • 소계 : 2,717,794,304 바이트
  • Visual.Studio.2005.Express.Edition.en.iso : 651,726,848 바이트 (2,369,667,072 바이트 내장)

그렇게 압축을 풀었더니 다음과 같은 폴더 구성을 지니게 되었다.

 

위의 두 그림은 VSKO의 하위 폴더의 수가 2개 모자라서 아래로 내려오게 수정한 것을 제외하면 동일하다. 아, 대/소문자가 다르다고? 윈도에서는 파일 이름과 폴더 이름에서 대/소문자를 쓸 수 있지만, 겉보기로만 다를 뿐 윈도에서 다룰 때는 같다고 인식하므로 문제 없다. 위에는 나타나지 않았지만, VSEN 폴더에는 SQL2005EE.EXE (56,105,688바이트) 파일이 존재했다. 이것은 SQL2005 Express Edition 파일이다. 아무튼 SQL2005 익스프레스 에디션은 내가 가지고 있지 않았기 때문에 이것을 그대로 남기기로 했다. 그밖에 VSEN 폴더에는 익스프레스 에디션 전체 설치를 위한 설치 프로그램이 있었는데, 그것도 그대로 이용하기로 했다.

복사 작업

복사 작업 1

그 뒤 한글판 비주얼스튜디오의 파일을 VSEN 폴더에서 찾아 이름이 같은 폴더끼리 복사해 넣는다. 이때 같은 이름을 가진 파일은 무조건 덮어쓰기를 하였다. 이는 파일 날짜가 한글판이 좀 더 늦었고, 날짜가 늦다는 말은 무언가 기능 추가가 있었을 수도 있기 때문이다. 거기다가 한글판이나 영문판에만 있는 파일도 있는 등의 이유로 전체 용량이 늘어나서 2,786,927,907 바이트가 되었다.

복사 작업 2

그 뒤 WCU 및 그 하위 폴더의 용량과 파일을 비교해야 한다. 폴더 비교에는 WinMerge v2.10.4.0 Unicode 버전을 이용했다. 다만 이 파일 비교 작업은 수작업으로 할 필요 없이 oscdimg 프로그램에 -O 옵션을 주어 처리하면 된다. 이 작업을 굳이 하는 이유는 가끔 하위 버전이 섞이는 때가 있기 때문이다.

각 폴더의 용량은 다음과 같다.

  • VSKO\VB\wcu - 504,992,856 바이트
  • VSKO\VC\wcu - 504,992,856 바이트
  • VSKO\VCS\wcu - 504,992,856 바이트
  • VSKO\VJS\wcu - 410,896,792 바이트 (jsharpredistcore 폴더를 제외하면, 407,100,120 바이트)
  • VSKO\VWD\wcu - 504,992,856 바이트

위에서 VJS\wcu 폴더의 크기는 폴더의 수가 하나 더 많음에도 지나치게 작았다. 이는 dotNetFramework 폴더에 언어팩 파일이 없었고, 그밖에 몇몇 파일에서 차이가 났다. 더구나 MSDN의 축약 버전인 MSDNExpress 파일에서 차이가 심하게 났다.

  • VSKO\VB\wcu\MSDNExpress - 319,828,160 바이트
  • VSKO\VJS\wcu\MSDNExpress - 234,788,544 바이트

나머지 폴더도 확인해 보니 일부 파일 날짜가 다르기는 했다. 결국 VJS 폴더를 제외하면 모두 같은 파일이었다. 또한 VJS 폴더의 MSDNExpress 폴더는 영문판의 것과 같았다는 데에도 덮어쓰는 이유가 있었다.

이와 같은 결과를 바탕으로 VSKO\VB\wcu 폴더의 파일을 VSKO\VJS\wcu 폴더에 복사하여 덮어쓰기로 했다. 복사 전 용량은 2.59GB (2,786,927,907 바이트 )로 표시되었고, 복사 후 용량은 2.68GB (2,884,820,643 바이트)로 표시되었다.

주의 : 이 수작업 복사는 매우 위험하다. 이번 작업에서는 확실히 영문판과 한국어판의 차이를 알고 있었기 때문에 복사해 넣어도 무리가 없었다. 그러나 일반적으로 이렇게 작업하면 나중에 설치 작업이 제대로 이루어지지 않을 수도 있다. 그러므로 확실히 알지 못한다면 이 "복사 작업 2"는 하지 않기를 바란다.

압축 작업

그 뒤 명령줄에서 다음과 같이 입력하여 폴더를 ISO 파일로 바꾸었다. 이때 작업할 대상은 F:\Temp\VSKO 폴더이고, 만들 파일은 F:\Temp\VS2005EK.ISO 파일이다.

OSCDIMG -LVS2005KO -H -M -X -O -N "F:\Temp\VSKO" "F:\Temp\VS2005EK.ISO"

참고로 복사 작업 2를 하지 않고 작업하면 1.02GB (1,096,298,496 바이트)로 표시되며, 복사 작업 2를 하고 작업하면 783MB (821,385,216 바이트)로 표시되었다. 압축 전에는 복사 작업 2를 거쳤을 때 용량이 더 컸지만, 압축한 뒤에는 오히려 복사 작업 2를 거치면 더 용량이 적어진다. 이 압축이 동일한 파일만을 대상으로 삼아 처리하기 때문이다.

이 파일을 다시 압축하면 좀 더 용량을 줄일 수 있다. 그것은 여러분의 선택의 몫이다. 또한 UltraISO 프로그램 등을 이용하면 ISO 파일 자체를 압축한 형태로 지원해 준다(그때 확장자는 .isz로 바뀐다.).

원리

이러한 파일 처리 방식도 압축 기법일까? 당연히 압축 기법이다.

압축에 대한 컴퓨터 알고리듬을 배울 때 맨 처음에 등장하는 알고리듬이 바로 반복 길이 부호화(RLE, Run-length encoding) 알고리듬이다. 예를 들면 다음과 같다.

원문 : FFFFFFFFAAACCCCCCCUUBBBBKXXXXXXXXXDDDDD (39바이트)
압축문 : F8A3C7U2B4K1X9D5 (16바이트)

위와 같이 반복되는 문자의 길이를 수치화하여 전체 코드를 줄이는 방법이다. 곧 반복 되는 문자를 [문자 + 갯수]의 형태로 치환하여 전체 길이를 줄이려는 압축 방법이 반복 길이 부호화 방법의 핵심이다. 다만 간혹 오히려 길이가 늘기도 하는데, 위에서는 K의 경우가 그것에 해당한다.

그런데 oscdimg 파일이 시도하는 방법은 반복 길이 부호화 방법과 원리상 동일하나 그 구현이 조금 다르다. 반복 길이 부호화에서는 파일 내부를 대상으로 삼지만, oscdimg는 디렉터리(폴더) 내부를 내상으로 삼는다. 반복 길이 부호화에서는 파일 내부에서 같은 문자 또는 문자열을 발견하여 치환하지만, oscdimg는 디렉터리 내부에서 MD5 값이 같은 파일을 대상으로 삼는다. 이때 MD5 값은 파일이 같은지를 검증하는 방식 가운데 하나로서 그 값이 같으면 설령 파일 이름이나 만든 날짜가 다르더라도 그 내용이 같게 된다. 반대로 MD5 값이 다른 파일은 설령 파일 이름과 만든 날짜가 모두 같더라도 서로 다른 파일이다. (물론 그에 앞서 파일 크기가 같아야 한다.)

이러한 과정을 거치는 이유는 파일 내부에서는 같은 문자는 같은 비트의 배열로 나타나지만, 디렉터리에서는 파일 이름이나 파일 크기가 같음이 곧 파일 내용이 같다는 뜻은 아니라는 데에서 파일의 실제 내용이 같은지를 알아낼 방법으로써 MD5라는 방법을 사용하고 있다고 보면 된다.

아무튼 mscdimg의 방식은 파일은 그대로 두고 그 갯수를 세는 방식이 아니라, 나올 때마다 그 파일이 위치한 색인 위치를 기억시켜 처음 발견된 곳(또는 저장소에서 따로 지정된 곳)을 참조하게 만들고 있다. 반복 길이 부호화 방식이 중복되는 문자(또는 비트 배열)가 많을수록 압축률이 높아지듯이, 이 방식은 중복되는 파일이 많아지면 전체 용량이 줄어들게 된다.

이번 경우에는 VB, VC, VCS, VJS, VWD 폴더에 WCU 라는 하위 폴더가 거의 동일하게 존재했기 때문에 상당한 용량을 줄일 수 있었다. 또한 앞서 복사 작업 2를 거친 쪽이 압축 전 용량은 더 많았지만, 압축 후 용량은 저 적어진 까닭도 중복 파일이 더 많아졌기 때문이다.

다운로드

  • oscdimg 다운로드 : readme.txt 파일을 읽어보고 자신에게 맞는 프로그램을 쓰면 된다.
  • MD5 값 : 6a27dd39c64f8a8035d4d164c2f439a5
  • CRC32 값 : D57A0CE3

관련 문서

이 글은 스프링노트에서 작성되었습니다.

글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

카테고리

분류 전체보기 (1005)
스크립트 (22)
벌레와 팁 (126)
소프트웨어 (240)
하드웨어 (6)
이야기 (24)
말의 나무 (506)
미쳐보자 (22)
일기 (48)
아이폰 (10)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

글 보관함