출처 : http://snoopybox.co.kr/1222

관련 글

 

 

먼저 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초로 해두었는데 너무 짧다 싶으시면 수정해주세요.


 
posted by ZeroZZaNG™