본문 바로가기

백업과 복원, 복제/GSS - Ghost 11.5.1

[GSS - Ghost] -fdsp, -fdsz : 고스트를 통한 디스크 복사시 디스크 서명의 변화와 대처법

-fdsz : 고스트로 디스크 복사시 디스크 서명은?

* 예제는 32비트 고스트를 통해 작업하였습니다. 16비트, 64비트 고스트도 명령은 동일합니다.
* 16비트 고스트 = Ghost.exe  * 32비트 고스트 = Ghost32.exe  * 64비트 고스트 = Ghost64.exe


디스크에는 디스크 서명(Disk Signature) 이라는 것이 존재하고 있죠. 디스크 서명이 정확하게 무엇인지 모르시는 분들은 아래의 글을 먼저 참고하시길 바랍니다.



아무튼 디스크 서명은 해당 디스크를 구별하는 일종의 아이디로 디스크 초기화 당시 랜덤하게 부여된 고유한 값을 가지고 있습니다. 그렇다면 고스트에서 디스크 복사 작업을 진행할 때 대상 디스크의 서명은 어떻게 될까요? 일단 예제로 아래의 [디스크 4 -> 디스크 5] (고스트 기준 디스크 5 -> 디스크 6) 로 복사를 진행해보죠.

원본이 될 디스크 4 와 디스크 5 - 윈도우 기준


작업 전 살펴 본 디스크 4 와 디스크 5 의 서명은 아래와 같습니다.

디스크 4 - [7E1A246D], 디스크 5 - [6E100C52]


이 상태에서 고스트를 통해 [디스크 4 -> 디스크 5] 로 복사 작업을 진행하였습니다.

ghost32 -clone,mode=copy,src=5,dst=6 -sure -fx


* 참고로 스크린 샷은 윈도우에서 고스트 디스크 복사 작업의 특성상 오프라인 상태여서 확인이 안 되지만 실제론 복사가 완료된 상태입니다. 온라인으로 연결하면 정상적으로 표시됩니다.


복사가 모두 완료된 후 오프라인 상태에서(* 중요) 곧바로 대상 디스크의 디스크 서명을 살펴 본 모습입니다.

복사가 이루어진 대상 디스크의 서명이 [00000000] 으로 초기화된 모습.

여기에서 아셔야 할 것이 디스크가 오프라인 상태라도 디스크 서명은 정상적으로 출력이 됩니다. 즉, 해당 디스크가 오프라인 상태라서 디스크 서명이 저렇게 출력된 것이 아니라는 이야기죠. 확실하게 대상 디스크의 서명이 초기화된 것입니다.


이렇게 서명이 초기화된 디스크는 온라인 상태로 전환되면 윈도우에 의해 리셋되어 다시 랜덤하게 새로운 디스크 서명을 부여받습니다. 아래와 같이 말이죠.


온라인 전환으로 디스크의 서명이 새롭게 [2D7CAAAAA] 로 리셋된 모습.


즉, 대상 디스크의 서명은 초기화와 리셋 과정을 거쳐 [6E100C52] -> [2D7CAAAAA] 로 변화한 것입니다. 이게 고스트를 통한 디스크 복사 작업시 대상 디스크의 서명에 일어나는 변화의 모습입니다.

* 참고로 이와 같이 대상 디스크의 스위치를 리셋하는 것은 -fdsz 스위치가 담당합니다. 하지만 해당 스위치는 복사 작업의 기본값이기 때문에 자동으로 적용된 것입니다.







-fdsp : 고스트로 디스크 복사시 디스크 서명까지 복사하기

고스트로 디스크를 복사시 원한다면 원본 디스크의 서명까지 그대로 복제할 수 있습니다. 그것은 -fdsp 스위치를 추가하여 작업하시면 됩니다. 그러면 원본 디스크의 서명까지 함께 복제가 이루어집니다.

ghost32 -clone,mode=copy,src=5,dst=6 -sure -fx -fdsp





참고로 이 작업은 디스크 복사 후 원본 디스크를 제거하고 대상 디스크만 사용할 때, 또는 원본 디스크의 서명을 바꿀 예정일 때만 적용하셔야 합니다. 왜냐하면 한 시스템내에서 동일한 디스크 서명을 가진 디스크가 동시에 존재할 수 없기 때문이죠. 이런 경우 디스크 서명 충돌이 발생하게 되고 나중에 연결된 디스크를 강제로 온라인 상태로 전환하면 해당 디스크의 서명이 리셋되어 버립니다. 그건 디스크 서명 충돌 문제 해결하기 - DiskPart, MBRWiz, GDisk 글에서 설명을 드렸죠.

그래서 위와 같이 윈도우에서(윈도우 PE 포함) 고스트를 통해 디스크 서명까지 포함하여 디스크 복사를 진행한 경우 복사 완료 후 대상 디스크를 온라인 상태로 전환하시면 안 됩니다. 그러면 윈도우가 디스크 서명 충돌 문제를 해결하고자 기껏 열심히 복제한 대상 디스크의 서명을 다시 리셋시켜 버리기 때문이죠.



그래서 이렇게 복사 작업을 마친 후 원본 디스크를 제거할 것이라면 이제 시스템을 종료한 후 원본 디스크를 제거하시면 되고, 원본 디스크도 계속 사용하실 거라면 원본 디스크의 서명을 변경해주는 작업을 진행하시면 됩니다.

원본 디스크의 서명 변경 작업은 DiskPart 를 통해 수동으로 새로운 서명을 지정해주거나, MBRWiz 와 같은 써드 파티 프로그램을 통해 리셋하거나, 아니면 고스트와 함께 제공되는 GDisk 를 이용하여 초기화하시면 되겠죠. 이러한 작업들은 마찬가지로 디스크 서명 충돌 문제 해결하기 - DiskPart, MBRWiz, GDisk 글에 설명이 되어 있습니다.

참고로 윈도우 7 의 부트 매니저인 BOOTMGR 은 디스크 서명에 영향을 받죠. 그럼 사용 중인 윈도우 디스크를 바꾸기 위해 고스트를 통해 윈도우가 포함된 디스크를 복사한 후 해당 디스크로 부팅하면 어떻게 될까요? 디스크 서명이 바뀌고 BOOTMGR 은 디스크의 서명이 바뀌면 디스크를 찾지 못하는데 말이죠.

걱정하실 것이 없는 게 고스트의 최신 버전을 사용하면 그런 경우라도 윈도우는 정상적으로 부팅됩니다.(11.x 기준) 이는 고스트가 이것을 자동으로 처리해주기 때문이죠. 그리하여 윈도우의 부팅만을 위하여 -fdsp 스위치를 굳이 사용하실 필요는 없습니다. 하지만 윈도우 비스타 이후의 운영체제를 지원하지 않는 8.x 버전대의 고스트에서는 부팅에 실패하게 됩니다. 이건 아래의 글을 참고하시길 바랍니다.

[GSS - Ghost] 고스트와 윈도우 - 부티용 윈도우 7 디스클르 복사, 복원한 후 0xc000000e 부팅 오류가 발생하는 경우





고스트로 디스크 복사시 대상 디스크의 서명을 그대로 유지하려면?

애석하게도 이건 제가 알기론 고스트 자체만으로는 딱히 방법이 없는 것으로 알고 있습니다. 그래서 이럴 땐 먼저 고스트 작업 전 대상 디스크의 서명을 확인하고, 복사 작업 후 다시 디스크 서명을 원래대로 되돌려주는 것 외에는 방법이 없을 듯 합니다. 이를 간단하게 DiskPart 를 통해 작업을 한다면 아래와 같이 할 수 있겠죠.

01. 고스트 복사 전 대상 디스크의 서명 확인 (이 때 디스크 번호는 본인에게 맞게)

diskpart
select disk=5
uniqueid disk
exit



02. 고스트 복사 작업 진행

ghost32 ......


03. 고스트 복사 후 대상 디스크의 서명 변경 및 온라인 전환 (이 때 서명은 앞에서 미리 확인한 서명)

diskpart
select disk=5
uniqueid disk id=6E100C52
online disk
exit




뭐 크게 어려운 작업은 없죠? 이런 식으로 작업하시면 됩니다. 이번 글은 여기까지 입니다. ^^




배치 파일 예제

위의 디스크 복사 후 원래의 서명으로 되돌리는 것을 간단하게 배치 파일화하면 아래와 같이 만들 수 있겠네요.


@echo off
setlocal enabledelayedexpansion
pushd %~dp0

rem 사용자 설정, 고스트 디스크 복사 작업의 원본과 대상을 설정. 디스크 번호는 고스트 기준.
rem src = 고스트 원본, dst = 고스트 대상.


set src=5
set dst=6



rem 현재 배치 파일을 실행한 윈도우의 버전을 확인하여 XP 라면 이를 알리고 종료.

for /F "tokens=4" %%a in ('ver') do (
set wv=%%a
)

for /F "tokens=1 delims=." %%a in ("%wv%") do (
set wv1=%%a
)

if /i not "%wv1%" == "6" goto Win_Fail


rem 배치 파일이 관리자 권한으로 실행되지 않았다면 이를 알리고 종료.

bcdedit > nul
if /i not "%errorlevel%" == "0" goto Admin_Fail


rem 위에서 사용자가 설정한 고스트 대상을 통해 DiskPart 의 디스크 번호를 설정.
rem DiskPart 는 0 번부터 시작, 고스트는 1 번부터 시작이니 1 을 빼면 DiskPart 의 번호가 나옴.


set /a dps=%src%-1
set /a dpd=%dst%-1


rem 대상 디스크의 원래 디스크 서명을 추출하여 sign 변수로 설정.

echo select disk=%dpd% > dtemp.txt
echo uniqueid disk >> dtemp.txt
echo exit >> dtemp.txt

diskpart /s dtemp.txt > id1.txt

for /F "tokens=3" %%a in ('findstr "디스크 ID" id1.txt') do (
set sign1=%%a
)

del id1.txt /q


rem 고스트 디스크 복사 작업 시작.
rem 핑거 프린트가 남지 않길 원하면 마지막에 -fnf 스위치를 추가하시면 됩니다.


ghost32 -clone,mode=copy,src=%src%,dst=%dst% -sure -fx


rem 대상 디스크를 온라인으로 전환 후 잠시 기다렸다가 디스크 서명을 원래대로 되돌림.

echo select disk=%dpd% > dtemp.txt
echo online disk >> dtemp.txt
echo exit >> dtemp.txt

diskpart /s dtemp.txt > nul

choice /n /t 1 /d y > nul

echo select disk=%dpd% > dtemp.txt
echo uniqueid disk id=%sign1% noerr >> dtemp.txt
echo exit >> dtemp.txt

diskpart /s dtemp.txt > nul

choice /n /t 1 /d y > nul

echo select disk=%dpd% > dtemp.txt
echo uniqueid disk >> dtemp.txt
echo exit >> dtemp.txt

diskpart /s dtemp.txt > id2.txt

del dtemp.txt /q


rem 디스크 서명이 원래대로 유지되었는지 확인. 변경되었다면 원래의 서명을 텍스트로 저장.

for /F "tokens=3" %%a in ('findstr "디스크 ID" id2.txt') do (
set sign2=%%a
)

del id2.txt /q

cls
echo.

if /i "%sign1%" == "%sign2%" (
echo 디스크 서명이 작업 전 %sign1% -^> 작업 후 %sign2% 로 정상적으로 유지되었습니다.
) else (
echo 디스크 서명이 작업 전 %sign1% -^> 작업 후 %sign2% 로 변경되었습니다.
echo 원래의 디스크 서명을 sign.txt 로 저장하였으니 수동으로 변경하시길 바랍니다.
echo %sign1% > sign.txt
)

pause
goto End


rem 작업 종료.

:End
endlocal
exit


rem 관리자 권한으로 실행되지 않았을 경우 이를 알리고 작업 종료.

:Admin_Fail
echo.
echo 배치 파일이 관리자 권한으로 실행되지 않았습니다. 마우스 오른쪽 버튼으로 클릭하여 관리자 권한으로 실행하세요.
echo.
pause
goto End

rem 윈도우 XP 환경에서 실행된 경우 이를 알리고 작업 종료.

:Win_Fail
echo.
echo 이 배치 파일은 윈도우 비스타(PE 포함) 이후의 환경에서만 사용할 수 있습니다.
echo.
pause
goto end

* 빨간색으로 표시한 srcdst 는 포함된 명령들을 직접 수정할 필요없이 대상을 용이하게 바꿀 수 있도록 하기 위해 변수로 뺀 것입니다. 제가 이런 구조를 좋아해서요. ^^;

* DiskPart 스크립트에서는 디스크 온라인 전환 작업과 디스크 서명 변경 작업을 한 번에 진행하는 경우 디스크 서명 변경 작업이 씹히기 때문에 이를 나눈 후 그 사이에 Choice 를 통해 약간의 텀을 주어야 합니다. 그래도 혹시 몰라 마지막에 고스트 복사 작업 전과 작업 후의 서명 변화를 비교하는 작업을 추가하였습니다.

* 작업은 디스크 서명의 수정을 지원하는 윈도우 비스타 이상의 버전이 필요하므로(PE 포함) 윈도우 XP 에서 배치 파일이 실행된 경우 자동으로 종료하도록 만들었습니다. 윈도우 XP 에서 사용할 경우 DiskPart 가 아닌 MBRWiz 와 같은 다른 프로그램을 사용하여 배치 파일을 만들어야 겠죠.

* PE 환경에서 사용하려는 경우 findstr.exe 와 findstr.exe.mui 파일을 고스트, 배치 파일과 함께 미리 준비하거나 PE 환경에 포함시켜야 합니다.

* 참고로 이 배치 파일은 한글 윈도우(한글 윈도우 PE) 환경만을 고려하여 작성한 것입니다.


간단하게 이런 식으로 배치 파일을 짜면 되지 않을까 생각합니다. 그런데 디스크 복사 작업을 진행하면서 원본과 동일하게 만드는 것은 필요할 지 모르겠지만, 사실 대상 디스크의 서명을 유지하는 것은 거의 필요치 않을 거라 생각합니다. 그래서 위의 배치 파일은 해당 작업에 대해 배치 파일을 짜려면 이런 식으로 구성할 수 있다는 일종의 예제로만 보시면 될 듯 합니다. 여러가지 배치 파일들을 뜯어보다 보면 자기에게 필요한 부분을 찾아낼 수 있게 될 테니요. 

이제 위의 배치 파일에서 좀 부족한 부분들을 당장 생각해보자면, 곧바로 작업하면 위험성이 있기 때문에 설정된 원본 SRC 와 대상 DST 를 출력해준 후 실제로 작업을 진행할 것인지를 묻는 과정을 추가할 수 있겠고,

echo 디스크 %dps%(고스트 디스크 %src%) 를 디스크 %dpd% (고스트 디스크 %dst%) 로 복사합니다.
echo.
set /p YN=실제로 작업을 진행하시겠습니까? (Y/N) :
if /i "%YN%" == "Y" goto Start
if /i "%YN%" == "N" goto End


아니라면 SRC 와 DST 를 사용자에게 직접 입력받는 것을 생각해 볼 수 있겠네요. 이 때는 먼저 현재 디스크의 목록을 출력해주면 좋겠죠.

echo 디스크 복사의 원본과 대상을 설정합니다.
echo.
set /p src=원본 디스크 번호(고스트 기준) :
set /p dst=대상 디스크 번호(고스트 기준) :


뭐 이런 식으로 하면 될 것 같습니다. 저도 뭐 배치 파일 작성 실력이 기초적인 수준이라 많은 분들께 배우고자 하는 분들께 도움이 될 정도는 아니지만 어느 정도 참고는 될 수 있을거라 생각합니다. 종종 이런 식으로 배치 파일을 작성해 보도록 하죠. 진짜로 여기까지 입니다. ^^