2010년 4월 29일 목요일

윈도우 7의 Differencing VHD 기능을 활용해보자


VHD의 종류에는 크게 3가지가 있습니다.

 

Fixed - 고정 크기 디스크. 한번 만들면 그 크기가 고정되는 형태입니다.

Expandable - 동적 확장 디스크. 사용량에 따라 그 크기가 점점 증가하는 유동적인 형태입니다.

Differencing - 부모 VHD 파일과의 차이점만 기록되는 형태입니다.

 

지난번에 포스팅했던 윈도우 7의 VHD 부팅기능을 활용해보자 글에서 wing4bee님께서 알려주신 내용인데, 언제 한번 내용을 알아봐야겠다고 생각만 했다가 이번에 XP 모드 관련 글을 포스팅하면서 XP 모드가 바로 이 Differencing VHD 방식을 사용하고 있다는 것을 알게 되었습니다.

 

Differencing VHD를 활용하면 저처럼 VHD 부팅기능을 사용하시는 분들에겐 매우 큰 도움이 될 것입니다. 왜냐하면 저같은 경우 거의 하루에 한번 꼴로 VHD 파일을 복원합니다. 그냥 뭔가 새로운 프로그램이 나오면 한번 설치해보게 되고 계속 사용할 생각이 없다면 언인스톨 하는게 아니라 그냥 VHD 파일을 복원시켜버리죠. 현재 저는 윈도우 7 64비트 얼티밋 버전을 사용하고 있으며, 대략 9GB 정도의 VHD 파일을 최적셋팅 원본 상태로 사용하고 있습니다. 그런데 매일같이 이 9GB VHD 파일을 PE나 다른 OS로 부팅한 다음 복원시키는 일은 여간 귀찮은게 아닙니다. 대략 3~4분 정도 걸리는 작업인데 이 시간을 줄여보고 싶어서 Differencing VHD 방식을 고려하게 되었습니다. 저는 아크로니스 트루이미지를 사용하지 않지만 트루이미지의 증/차분 백업과 약간 비슷한 개념이라고 생각하시면 될 것 같습니다.

 

만약 제가 현재 사용중인 9GB의 VHD 파일을 부모 파일로 지정해두고 자식 VHD 파일을 새로 생성해서 앞으로는 그걸로 부팅하게 된다면 어떻게 될까요? 참고로 방금 제 컴퓨터에서 직접 만들어본 결과... 바로 생성된 자식 VHD 파일을 BCD에 등록시킨 다음 크기를 보니... 40MB 밖에 되지 않습니다. 즉 앞으로 저는 이 40MB 짜리 파일만 교체해주면 다시 최적상태로 돌아올 수 있습니다. 9GB 복사하던 일을 앞으로는 40MB만 복사하면 되니 가히 혁신적인 기능이라 하지 않을 수 없습니다.

 

 

 

이제 개념설명은 그만하고 실전에 들어가보겠습니다.

먼저 VHD에 윈도우 7을 설치합니다.

참고 : 윈도우 7 VHD 만들어서 설치하기

 

설치를 다 하셨다면 이제 각종 프로그램을 설치하고 최적 셋팅을 합니다. 물론 윈도우만 설치된 상태에서 바로 자식 VHD를 생성하셔도 되겠죠. 이건 취향에 달린 문제니까... 저는 최적화 셋팅을 다 마친 다음 현재 사용중인 9GB 부모 VHD 파일을 기준으로 자식 VHD를 생성하겠습니다.

 

이제 PE로 부팅합니다. 윈도우 7 DVD로 부팅하셔도 되고, F8 복구모드로 들어가셔도 되고, 최근에 소개해드린 PE를 멀티부팅 메뉴에 등록하기 글을 참조하셔도 됩니다. 어떤 방법을 활용하시든 윈도우 7 PE로만 부팅하시면 됩니다. PE로 부팅하셔서 명령 프롬프트를 띄우신 다음 (설치 화면에서 Shift + F10)

 

1. DISKPART로 들어갑니다.

- diskpart

 

2. 자식 VHD 파일을 생성해줍니다.

- create vdisk file=c:\win7-diff.vhd parent=c:\win7.vhd

(자식 VHD 파일 이름은 각자 원하는 이름으로, 부모 VHD 파일 위치는 정확히 지정해주세요.)

※ 자식 VHD 파일과 부모 VHD 파일은 반드시 동일한 파티션에 존재해야 합니다.

 

3. 자식 VHD 파일을 마운트합니다.

- attach vdisk

 

4. 방금 자식 VHD 파일이 어느 드라이브에 마운트 되었는지 확인해줍니다.

- list vol

 

5. 확인이 되었다면 이제 DISKPART를 종료합니다.

- exit

 

6. 이제 자식 VHD 파일을 BCD에 부팅 등록시켜 줍니다.

- bcdboot f:\windows /s c: /l ko-kr

(F 드라이브는 5번 단계에서 확인했던 VHD 파일이 마운트된 드라이브를 지칭합니다. C 드라이브는 부팅파일이 존재하는 시스템 파티션을 의미합니다.)

 

7. 자식 VHD 파일을 이제 다른 곳에 백업합니다. 저는 40MB 정도 나왔는데 이걸 지금 백업해둬야 최소화된 백업 원본을 소유하게 되겠죠?

- copy c:\win7-diff.vhd d:

(백업을 꼭 해야하는건 아니지만 매번 자식 VHD를 똑같은 이름으로 새로 만드는 것 보다는 백업해둔 파일을 교체하는 편이 훨씬 간단하기 때문에 저는 파일을 백업해둡니다.)

 

 

 

이게 끝입니다. 이제 재부팅 해보시면 자식 VHD로 부팅이 될 것입니다. 다만 기존 부모 VHD 엔트리와 이번에 새로 만든 자식 VHD 엔트리가 공존하게 되는데 기존 부모 VHD 엔트리는 삭제해주시면 됩니다. 엔트리 편집으로 가장 편한 방법은 msconfig 들어가서 부팅 탭에서 사용하지 않는 부모 VHD 부팅 메뉴를 삭제하시면 됩니다.

 

 

 

 

저는 이제부터 기존에 9GB 교체하던 작업을 앞으로는 40MB만 교체하면 됩니다. 제가 쓰고있는 부모 VHD와 백업해둔 자식 VHD 파일입니다.

 

 

 

 

(추가1)

아 중요한걸 빠뜨렸네요. 바로 자식 VHD의 변화분을 부모 VHD에 적용시키는 것입니다. 이렇게 자식 VHD로 부팅해서 사용하다보면 새로 추가된 프로그램이나 윈도우 설정이 마음에 들어서 이걸 부모 VHD에 적용시키고 싶어질 경우가 발생할 것입니다. 이럴 때는 부모 VHD 파일 자체를 변경시키는게 좋겠죠?

 

마찬가지로 PE로 부팅한 다음 CMD 창에서

 

1. DISKPART로 들어갑니다.

- diskpart

 

2. 자식 VHD 파일을 선택합니다.

- sel vdisk file=c:\win7-diff.vhd

 

3. 부모 VHD 파일에 자식 VHD 파일을 병합시켜줍니다.

- merge vdisk depth=1

 

4. DISKPART를 종료합니다.

- exit

 


 

 

 

(추가2)

자식파일 크기가 40MB로 된건 bcdboot 작업 때문에 attach를 한번 해줬기 때문에 그런 것 같습니다. 어차피 BCD엔 동일 이름으로 등록되어 있으니 자식 파일 삭제하고 다시 동일 이름으로 만들어주고 attach를 하지 않으니 100KB로 생성되었습니다. 저는 이제 교체할 때 100KB 파일만 바꾸면 됩니다. 어차피 40MB나 100KB나 바꾸는데 1초 걸리는건 똑같지만 그래도 용량을 절감하게 되었네요. ^^

 

 

 

 

(추가3)

자식 VHD 생성 작업은 PE로 부팅해야 하는게 맞습니다. 부모 VHD로 부팅한 상태에서 바로 자식 VHD를 생성해주려고 시도해보니 사용중이라는 이유로 거절당했습니다.

 


VHD 파일 자동교체 부팅메뉴 등록하기


제 블로그에 있는 글 몇가지를 조합하시면 구성이 가능한데 요청하신 분들이 계셔서 따로 포스팅합니다.

 

관련 글

 

 

먼저 VHD 파일을 교체하는 스크립트를 만들어보겠습니다. 우선 제가 쓰고있는 VHD 파일을 보여드리겠습니다.

 

 

 

저는 현재 SSD 드라이브에 VHD 라는 폴더를 하나 만들어놓고 그 안에 3개의 VHD 파일을 두고 있습니다.

  • win7x86.vhd - 부모 VHD
  • child.vhd - 자식 VHD
  • clean.vhd - 자식 VHD를 처음 생성하자마자 백업해두었던 87kb짜리 깨끗한 자식 VHD

 

따라서 PE로 부팅하여

 

copy /y c:\vhd\clean.vhd c:\vhd\child.vhd

 

이렇게 명령어를 입력하면 자식 VHD 파일이 깨끗한 파일로 복원됩니다.

 

그런데 위 화면에서는 현재 SSD가 D 드라이브이지만 PE로 부팅하면 C 드라이브가 되기 때문에 저렇게 입력합니다만, 문제는 이게 가끔 바뀐다는 것입니다. 무슨 말이냐면 삼성 1TB 하드의 첫번째 파티션인 E 드라이브가 갑자기 PE에서 C로 되고 SSD는 D로 되는 그런 현상이 일어나는 것입니다. 예전에 Differencing VHD 파일 활용하기 전에 통파일을 수동으로 교체할 때 이런 드라이브 문자 혼동 때문에 사용하던 VHD를 최적화 VHD에 덮어씌운 경험이 몇번이나 있었습니다. 그럴 때마다 저는 눈물을 머금고 윈도우를 새로 설치했죠.

 

따라서 PE에서 드라이브 문자가 변경되는 현상에 관계없이 알아서 파일을 찾아서 교체하도록 해주기 위해서는 FOR 구문을 이용하시는게 좋습니다. 드라이브 문자가 어떻게 뒤바뀌더라도 상관없이 찾아서 바꿔주도록 하기 위함입니다.

 

아래는 예제입니다. 제가 처한 환경에서는 이렇게 활용합니다.

 

@echo off

for %%A in (C: D: E:) do if exist %%A\vhd\clean.vhd copy /y %%A\vhd\clean.vhd %%A\vhd\child.vhd

exit

 

간단하죠?

 

위 스크립트를 CMD 파일로 저장해서 실행하면 C ~ E 드라이브 중에 VHD 라는 폴더를 가지고 있고 그 안에 clean.vhd 파일이 존재한다면 그걸 동일 폴더에 있는 child.vhd 라는 파일로 강제 복사하게 됩니다. 저는 드라이브가 총 3개라서 저렇게 입력했는데 만약 드라이브가 많으시면 F: G: H: 이렇게 첫번째 괄호 안에 더 추가해주시면 됩니다.

 

이 FOR 구문을 이용하면 활용할 수 있는 것들이 무궁무진합니다. 아무튼 위 스크립트를 메모장에서 작성한 다음 CMD로 저장해주시고 Bat To Exe Converter - 배치파일을 exe로 변환해주는 툴 을 사용하여 exe로 컴파일합니다. 파일 이름은 setup.exe로 저장합니다.

 

 

 

만약 위 경우처럼 같은 드라이브 내에 있는 깨끗한 자식 VHD로 기존 자식 VHD를 교체하는 작업이라면 저렇게 간단하게 해결이 되겠지만, 다른 드라이브에 있는 파일을 옮겨오는 경우에는, 즉 Differncing VHD 사용하지 않으시고 네이티브 사용하시는 분들은 보통 백업파일 덩치가 10GB 정도 되니까 다른 파티션에 백업파일을 보관하실텐데, 그걸 스크립트로 만드려면 약간 길어집니다.

 

아래는 예제입니다. E 드라이브 BACKUP 폴더에 있는 win7x86.vhd 파일을 D 드라이브 VHD 폴더 안에 복사하는 작업입니다.

 

@echo off
for %%A in (C: D: E:) do (
    if exist %%A\vhd\win7x86.vhd (
        for %%B in (C: D: E:) do (
            if exist %%B\backup\win7x86.vhd copy /y %%B\backup\win7x86.vhd %%A\vhd\win7x86.vhd
        )
    )
)
exit

 

저렇게 이중으로 처리하지 않고 더 간단하게 할 수 있다면 고수님들께서 방법을 알려주시기 바랍니다.

 

 

 

이제 boot.wim 파일을 편집합니다. 그동안 GImagex는 많이 다루었으니까 이번에는 윈도우 7 내장 기능인 DISM으로 해보겠습니다.

 

먼저 윈도우 7 32비트 설치 원본 SOURCES 폴더에 들어있는 boot.wim 파일을 꺼내오세요. 저는 이 파일을 E 드라이브에 복사해두겠습니다.

 

그런 다음 마운트를 위한 임시폴더 하나를 만들어줍니다. 저는 E 드라이브에 MOUNT 라는 폴더를 하나 만들겠습니다.

 

boot.wim 파일을 복사해오셨고, 마운트할 임시폴더를 생성하셨다면 이제 관리자 권한으로 명령 프롬프트를 띄우신 다음 아래와 같이 입력합니다.

 

dism /mount-wim /wimfile:e:\boot.wim /index:2 /mountdir:e:\mount

 

boot.wim 파일의 위치와 마운트할 임시폴더의 위치는 각자 환경에 맞게 입력하세요. 이렇게 입력을 하셨다면 이제 마운트한 임시폴더로 가보세요. 그럼 윈도우처럼 생긴 파일들이 있을겁니다.

 

 

 

윈도우 7 DVD로 부팅을 하시면 이 boot.wim 파일이 램디스크(?)에 탑제되고 저기 보이는 setup.exe 파일이 자동으로 실행됩니다. 그래서 윈도우 설치화면이 바로 뜨는 것입니다. 우리가 해야 할 일은 저기 보이는 setup.exe 파일 대신에 VHD 파일을 자동교체하도록 만들어둔 setup.exe 파일을 집어넣는 것입니다. 그러면 저 파일로 부팅했을 때 윈도우 설치가 자동실행되지 않고 VHD 파일이 자동교체 되겠지요. 교체가 끝나면 알아서 재부팅까지 해줍니다. 참 편리하지요.

 

파일을 교체하셨다면 이제 윈도우 탐색기를 닫아주세요. 만약 탐색기를 닫지 않고 마운트된 폴더가 열려있는 상태라면 아래 작업시에 오류가 발생할 것입니다. 따라서 반드시 마운트된 폴더가 탐색기에서 열려있다면 탐색기를 닫아주시기 바랍니다.

 

dism /unmount-wim /mountdir:e:\mount /commit

 

이렇게 만든 boot.wim 파일은 이제 나만의 VHD 파일 교체용 PE가 된 것입니다.

 

 

 

이제 이 boot.wim 파일을 멀티부팅 메뉴에 등록시킬 차례입니다. 먼저 boot.sdi 파일이 필요합니다. 이 파일은 C:\Windows\Boot\DVD\PCAT 폴더 안에 들어있으며 윈도우 7 DVD 의 BOOT 폴더 안에도 들어있습니다. 이 파일을 복사해오신 다음 위에서 만든 boot.wim 파일과 동일한 위치에 두세요. 저는 D 드라이브 BOOT 폴더 안에 넣어두었습니다. 그런데 저는 기본 PE 부팅도 멀티부팅 메뉴에 두었기 때문에 위에서 만든 VHD 교체용 파일은 구분해주기 위해서 copy.wim 이라고 이름을 변경해둔 상태입니다.

 

 

 

 

이 파일을 멀티부팅 메뉴에 등록시키기 위해서는 우선 명령 프롬프트를 관리자 권한으로 띄우신 다음

 

bcdedit /create {ramdiskoptions}
bcdedit /set {ramdiskoptions} ramdisksdidevice partition=D:
bcdedit /set {ramdiskoptions} ramdisksdipath \boot\boot.sdi
bcdedit /create /d "VHD 파일 교체하기" /application OSLOADER


두번째 줄 끝에는 boot.sdi 파일을 복사해두신 드라이브명을 입력해주시고

세번째 줄 끝에는 boot.sdi 파일의 위치를 적어주시면 됩니다.

네번째 줄 중간에는 멀티부팅 메뉴에 등록시킬 이름을 적어주시면 됩니다.

 

만약 예전에 램디스크 옵션 메뉴를 제가 첨부해드렸던 스크립트로 등록시켰다면 이름을 뭘로 지정하더라도 무조건 램디스크 옵션이라고 나올겁니다. 그 문제를 수정하시려면 아래와 같이 입력해주세요.

 

bcdedit /deletevalue {ramdiskoptions} description

 

그러면 이제 램디스크 옵션이 아닌 네번째 줄에서 지정해주셨던 진짜 이름이 멀티부팅 메뉴에 나올 것입니다.

 

또한 기존에 이미 PE를 멀티부팅 메뉴에 등록해서 사용하고 계신 분들이라면 처음 세줄은 필요가 없습니다. 처음 세줄은 이미 만들어져 있는 것이니까 마지막 네번째 줄만 입력하셔서 OSLOADER 항목만 새로 한개 만들어주시면 됩니다.

 

아무튼 위 명령어들을 통해 새로운 VHD 파일 교체하기 항목을 만드셨다면 식별자 GUID가 반환되는데 저는 아래와 같이 나왔습니다.

 

{ae48570b-e279-11de-97e7-a1cf7efb0803}

 

위 문자열은 각자 다르게 나올 것입니다. 따라서 위 문자열을 잘 복사해두신 다음 이어서 계속 진행합니다.

(아래 두번째 줄과 세번째 줄은 같은 한 줄입니다. 블로그 가로 길이 때문에 두줄로 표시되었습니다.)

 

bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} device ramdisk=[D:]\boot\copy.wim,{ramdiskoptions}
bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} osdevice ramdisk=[D:]\boot\copy.wim,{ramdiskoptions}
bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} path \windows\system32\winload.exe
bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} systemroot \windows
bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} winpe yes
bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} detecthal yes
bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} ems yes
bcdedit /displayorder {ae48570b-e279-11de-97e7-a1cf7efb0803} /addlast
bcdedit /timeout 3

 

좀 어려우신가요? 아니면 어렵지는 않지만 타이핑이 귀찮으신 것일 수도...

첫번째 두줄에서는 뒷부분에 VHD 파일 교체용 PE의 위치를 지정해주시면 됩니다. 저는 D 드라이브 BOOT 폴더에 copy.wim 이라는 이름으로 넣어두었기 때문에 저렇게 입력했습니다.

 

이렇게 한번 자세히 설명드려야 스스로 응용하실 수 있을 것 같아서 스크립트로 만들지 않고 수동으로 알려드렸습니다.

 

이렇게 해주시면 이제 멀티부팅 화면에 우리가 만들었던 VHD 파일 자동교체 하는 메뉴가 등장할 것입니다. 메뉴 고르는 시간은 3초로 해두었는데 너무 짧다 싶으시면 수정해주세요.

 

혹시 이해가 잘 안 되시거나 궁금하신 내용이 있다면 질문 남겨주시기 바랍니다.