자식 디스크(VHD) 생성하는 Create Vdisk 의 Parent 매개 변수
부모 VHD 가상 디스크 = 부모 가상 디스크 = 부모 디스크 = 부모 VHD = 부모
자식 VHD 가상 디스크 = 자식 가상 디스크 = 자식 디스크 = 자식 VHD = 자식
모두 부모(자식) VHD 가상 디스크를 줄인 말들입니다. 무의식 중에 혼용하여 사용할 수 있으니 이부분은 염두해두세요. ^^; 단! VHD 파일과 같이 표현한 때는 해당 가상 디스크에 해당하는 .vhd 파일 자체를 지칭한 것입니다.
또한 다른 글에서는 모두 VHD 가상 디스크를 시스템에 연결(Attach Vdisk) 한다고 표현하였지만, 이 글에서는 부모의 데이터가 자식에게 연결(Linked)되는 것과 헷갈릴 소지가 있기에, Attach Vdisk 를 시스템에 장착으로 다르게 표현하였습니다.
자식 VHD 가상 디스크 = 자식 가상 디스크 = 자식 디스크 = 자식 VHD = 자식
모두 부모(자식) VHD 가상 디스크를 줄인 말들입니다. 무의식 중에 혼용하여 사용할 수 있으니 이부분은 염두해두세요. ^^; 단! VHD 파일과 같이 표현한 때는 해당 가상 디스크에 해당하는 .vhd 파일 자체를 지칭한 것입니다.
또한 다른 글에서는 모두 VHD 가상 디스크를 시스템에 연결(Attach Vdisk) 한다고 표현하였지만, 이 글에서는 부모의 데이터가 자식에게 연결(Linked)되는 것과 헷갈릴 소지가 있기에, Attach Vdisk 를 시스템에 장착으로 다르게 표현하였습니다.
1. 명령의 이해
자식 디스크(자식 VHD)를 생성하는 명령은 일반 VHD 가상 디스크를 생성할 때와 같은 Create Vdisk 이고, 여기에 Parent 매개 변수만 추가하면 됩니다.
Create Vdisk File="D:\Child.vhd" Parent="D:\Example.vhd"
File=[생성할 자식 VHD]
Parent=[연결할 부모 VHD]
Parent=[연결할 부모 VHD]
이 때 자식 디스크의 특성상 Maximum 과 Type 매개 변수는 사용되지 않습니다. 또한 연결할 부모 VHD 는 반드시 시스템과 분리되어 사용 중이지 않은 상태여야 합니다. 이것만 주의하시면 됩니다.
그리하여 D:\Example.vhd 를 부모로 하는 D:\Child.vhd 자식 디스크를 생성하고, 바로 장착하여 사용하고자 한다면 전체적으로 아래와 같은 형식으로 명령이 이루어지는 것이죠. [D:\Example.vhd 가 현재 장착되어 사용 중이라는 가정 하에]
diskpart
select vdisk file="D:\Example.vhd"
detach vdisk
create vdisk file="D:\Child.vhd" parent="D:\Example.vhd"
attach vdisk
detach vdisk
create vdisk file="D:\Child.vhd" parent="D:\Example.vhd"
attach vdisk
2. 자식 VHD 를 생성할 때 주의할 점
부모가 될 VHD 에 일반적인 데이터만 담겨 있고, 자식도 그러한 용도로 사용할 것이라면, 자식 VHD 를 부모 VHD 와 다른 볼륨(다른 파티션, 드라이브)에 만들 수 있고 그대로 사용하는데에도 아무런 문제가 없습니다.
하지만 부모가 될 VHD 에 윈도우가 설치되어 있고, 자식도 마찬가지로 부팅용으로 사용할 것이라면, 자식 VHD 를 반드시 부모 VHD 와 동일한 볼륨(동일한 파티션, 드라이브)에 생성해야 합니다. 그렇지 않고 부모 VHD 와 자식 VHD 가 다른 볼륨에 위치해 있다면 자식 VHD 로의 부팅은 실패하게 됩니다. 이것만 기억하시면 되겠네요.
그러니 부팅용 자식 VHD 를 생성할 땐 부모 VHD 와 동일한 경로 위치에 생성해주는 것이 여러모로 편리합니다.
3. 자식 VHD 를 제거하는 방법
만약 현재 자식 VHD 를 시스템에 장착하여 사용 중이라면 이를 분리하고 그냥 자식 VHD 파일을 삭제하면 됩니다.
diskpart
select vdisk file="D:\Child.vhd"
detach vdisk
exit
del D:\Child.vhd /qdetach vdisk
exit
사용 중이라면 분리하고 삭제! 이게 끝이에요. 자식 VHD 와 관련된 명령에 대한 설명은 끝! 더 해드리고 싶어도 더 드릴 말이 없네요. 여기까지!
하고 끝내고 싶지만... 자식 VHD 를 정말로 제대로 활용하기 위해선 부모 - 자식 디스크의 관계와 이 둘이 어떠한 원리로 움직이는지 그것을 이해해야만 하죠. 사실 명령은 이처럼 간단하지만 이걸 어떻게 활용할 지 몰라 우왕자왕하시는 분들이 많으시죠. 그래서!
자식 VHD 가 무엇인지 이것이 어떻게 움직이는 것인지 VHD 의 관리라는 관점에서 제 스타일대로 한 번 정리를 해보도록 하죠. 물론 이것만으로 자식 VHD 의 활용까지 100% 완벽하게 이해가 되진 않겠지만 그래도 최선을 다하도록 하겠습니다. ^^ [오랜만인데요? 윈티티의 추억이 떠오르려는 이 알 수 없는 기분은...]
부모 - 자식 디스크란 무엇인가?
자식 VHD 디스크란 VHD 가상 디스크에서 차이점 보관용 디스크를 의미하는 다른 말입니다. 이 차이점 보관이라는 말이 중요한데요. 이걸 먼저 이야기로 풀어보도록 하죠. 제 주특기가 그림보다는 주둥이로 나불거리면서 터는 거니까요. [아놔 이 주체할 수 없는 고급스러운 표현력...]
먼저 어떤 ① VHD 가상 디스크가 있습니다. 이제 이 ① VHD 가상 디스크에 연결된 비어있는 ② VHD 가상 디스크를 만듭니다. 우선 이걸 명심하세요. ② 가상 디스크에는 현재 실제 데이터는 없고 비어있습니다. 하지만 ① 가상 디스크에 연결하여 만들어진다고 했습니다. 이게 무슨 의미냐? ① 가상 디스크의 모든 데이터를 링크로 연결시킨다는 의미입니다. 즉, ① 가상 디스크에서 데이터를 복사해서 가져오는게 아니라 ① 가상 디스크의 내용을 자신에게 단순히 링크를 통해서 연결만 시켜놓는 것이죠.
① 가상 디스크 데이터 ----[링크 연결]----> ② 가상 디스크
우선 이 링크 연결이라는 게 어떤 식으로 이어지냐면 ② 가상 디스크가 생성된 후 최초로 시스템에 장착될 때, 그 때 자신에게 연결될 ① 가상 디스크에 현재 저장되어 있는 모든 데이터들을 확인한 후, 그 데이터들에 대한 링크를 생성하여 자신의 특별한 공간에 저장하는 겁니다. 즉, 최초로 연결된 ② 가상 디스크에는 현재 실제 데이터는 없고 ① 가상 디스크의 데이터에 대한 링크 정보만 저장되어 있는 거죠. 이러한 링크 정보는 매우 소용량입니다. 그래서 ② 가상 디스크 파일은 처음엔 매우 작은 크기를 가지게 되는 거죠.
② 가상 디스크 장착 -> 우선 ① 의 데이터에 대한 링크만 저장, 링크 정보는 실제 데이터에 비해 매우 소용량
아무튼 이렇게 ① 과 ② 가 서로 연결이 되었습니다. 그럼 이제 이 상태에서 ② 가상 디스크를 시스템에 장착하여 사용을 하면? ② 가상 디스크는 저장된 링크 정보를 통해 자신 뿐만 아니라 연결된 ① 가상 디스크의 내용까지 즉, [① 가상 디스크의 모든 데이터 + ② 가상 디스크의 모든 데이터] 이렇게 하여 우리에게 보여 줍니다. 쉽게 ① + ② 두 가상 디스크의 데이터들을 모두 합해서 보여주는 거죠. 즉, 우리가 보는 ② 가상 디스크의 데이터는 실상 ① 과 ② 라는 두 가상 디스크의 데이터들을 모두 더한 그 결과물이라는 겁니다.
② 가상 디스크를 장착했을 때 보여지는 데이터 => ① 가상 디스크 데이터 + ② 가상 디스크 데이터
이러한 이유로 처음에 강조했듯이 ② 가상 디스크는 현재 실제 데이터는 없이 비어있는 것이지만 ① 가상 디스크의 모든 데이터에 대한 링크 정보가 저장되어 있고, 이를 통해 ① 가상 디스크와 동일한 내용을 보여주게 되는 것이죠. 여기까지 이해하시겠나요?
그럼 이제 두 가상 디스크 사이의 데이터 연결 상태를 잘 생각해보세요. ① 이 ② 에게 데이터를 제공하고 있는 모습이죠? ② 가 ① 의 데이터를 링크로 가져와서 실상 현재 자기에게는 그런 데이터가 없는데도 마치 자기에게도 그런 데이터가 있는 것처럼 보여주는 거니까요. 즉, 이를 다르게 표현하면 ② 가상 디스크는 ① 가상 디스크의 데이터를 원본으로 삼고 있다고 말할 수 있습니다. ① 이 원본이고 ② 가 링크 연결본인 거죠. 그래서 ② 가상 디스크는 ① 가상 디스크 아래에서 움직인다고 볼 수 있죠. [② 가상 디스크는 ① 가상 디스크의 데이터를 필요로 하기(가져오기) 때문에]
그래서 ① 가상 디스크는 원본 디스크이자 상위 디스크, ② 가상 디스크는 링크 연결본 디스크이자 하위 디스크가 되는 겁니다. 상하 관계가 형성되는 것이죠. 근데 제가 최대한 쉬운 단어들로만 설명을 했는데요. 실제론 차이점 보관 - Differencing 이런 어려운 말들이 튀어나오는 게 문제입니다. Differencing 이라고 하면 차등이라는 말인데, 언뜻 들어선 어렵고 이해가 잘 안 되잖아요? 그래서 이를 이해하기 쉽게 표현하기 위해 우리가 흔히 사용하는 부모 - 자식이라는 친숙한 용어를 사용하여 원본인 ① 가상 디스크를 부모 디스크, 링크 연결본인 ② 가상 디스크를 자식 디스크라고 부릅니다. ① 이 ② 를 낳았다. ① 에서 ② 가 파생되어 나왔다. ② 가 ① 에 상속된다. 뭐 요런 식이면 좀 더 쉽게 접근이 가능하잖아요. [참고로 이건 제가 임의로 그렇게 부르는게 아니라 윈도우에서 공식적으로 그렇게 부르는 겁니다.]
① 가상 디스크 -> 원본, 상위, 부모 디스크
② 가상 디스크 -> 링크 연결본, 하위, 자식 디스크
아무튼 현재까지 설명한 내용만 정리하자면 부모 ① 가상 디스크와 연결하여 이제 막 생성한 자식 ② 가상 디스크는 현재 시점에서 비어있고, 이런 자식 ② 가상 디스크를 장착하여 사용할 때 보여지는 모든 내용은 원래 부모 ① 가상 디스크의 것이라는 겁니다.
[부모 ① 가상 디스크 - 자식 ② 가상 디스크] 의 시작은 이와 같습니다. 여기까지 이해하시겠나요? 이해하셨으리라 믿고 다음으로 넘어가죠.
이렇게 ① 과 ② 사이에 부모 - 자식 관계가 성립된 이후 실제로 사용을 할 땐 보통 부모인 ① 가상 디스크가 아닌 자식인 ② 가상 디스크를 시스템에 장착하여 사용합니다. [반드시 그래야 하는 것은 아니지만 일단 이게 기본]
이제 굉장히 중요합니다. 이렇게 자식 ② 가상 디스크가 장착되어 사용될 때, 자식 ② 가상 디스크와 링크로 연결된 부모 ① 가상 디스크의 데이터는 절대로 변하지 않습니다. 부모 ① 가상 디스크는 그냥 자식 ② 가상 디스크에 단순히 연결만 되어 자신의 데이터를 제공만 해 줄 뿐이죠. 이러한 상태에서 자식 ② 가상 디스크에 데이터의 기록과 삭제가 이루어지면 이는 현재 시스템에 장착된 자식 ② 가상 디스크에만 저장됩니다. 이는 다른 말로 원본인 부모와 발생한 차이점만 자식에 저장된다 라고 표현할 수 있습니다.
이러한 것을 Difference - 차등(차이점)이라고 표현합니다. 그래서 자식 디스크를 부모 디스크의 차이점 보관용 디스크(Differencing VHD) 라고 말하는 것입니다. 아무튼 이러한 데이터 저장 과정을 좀 더 자세하게 이야기하면 아래와 같습니다.
② 가상 디스크가 연결된 상태에서 ① 가상 디스크에는 없던 새로운 데이터를 저장하면? 해당 데이터는 그대로 ② 가상 디스크에 저장됩니다. [데이터의 추가]
① 가상 디스크에 저장되어 있는, 그래서 링크로 연결하여 ② 가상 디스크에서도 사용 중이던 데이터를 ② 가상 디스크에서 삭제하면? 실제 ① 에 저장되어 있는 데이터는 건드리지 않고 최초 연결시 ② 에 저장해둔 해당 데이터에 대한 링크 정보만 삭제 즉, 해당 데이터와의 링크 연결만 끊어 결과적으론 마치 해당 파일이 삭제된 것처럼 처리합니다. [데이터의 삭제]
이렇듯 모든 데이터의 저장과 삭제가 자식인 ② 에서만 이루어지죠? 이처럼 자식인 ② 가상 디스크에서 무슨 짓을 하더라도 원본이자 부모인 ① 가상 디스크에는 절대 어떠한 변화도 없습니다. 그리고 이는 부모인 ① 가상 디스크의 데이터는 그 만큼 안전하다고 할 수 있는 겁니다.
② 가상 디스크에 데이터는 이런 식으로 처리가 되고, 최종적으로 우리가 이를 사용할 땐 앞서 설명했던 것과 같이 [부모 ① 가상 디스크 데이터 + 자식 ② 가상 디스크 데이터] 하여 이 둘을 하나의 데이터로 만든 그 결합물을 우리가 사용하는 것입니다.
정리하자면 원본 데이터가 저장된 ① 가상 디스크, 그와의 차이점이 저장된 ② 가상 디스크, 실제로 사용되는 건 이 둘의 내용을 모두 더한 것, 그리하여 원래는 데이터가 원본과 차이점 이렇게 두 개로 나뉘어 각각의 가상 디스크에 따로 저장되어 있지만, 실제로 사용할 땐 이 둘이 더해져서 마치 하나의 가상 디스크를 사용하는 것과 같은 효과를 내는 게 바로 [부모 VHD - 자식 VHD] 인 것입니다.
지금까지 이야기한 내용을 모두 종합하여 그림으로 표현하면 아래와 같습니다.
어떻습니까? 이게 바로 VHD 가상 디스크에서 이야기하는 [부모 - 자식] 입니다. 간단... 한가요? 흐음... 최대한 쉽게 설명을 한다고 했는데... 처음 보면 좀 어려울 수 있는데 실상 이해하고 나면 굉장히 간단한 겁니다. ^^ 그리고 그림 설명에서 말투 죄송합니다. -_-;
부모 - 자식 디스크의 특성, 자식 디스크는 왜 사용되는가?
근데 사실 위에서 설명한 내용만 가지고는 자식 디스크를 왜 사용하는 것인지 언뜻 이해가 되지 않을 수도 있습니다. 그렇다면 자식 VHD 를 설정하여 사용하는 이유는 무엇일까요? 왜 많은 분들이 자식 디스크를 사용하는 것일까요? 이것은 부모 - 자식 디스크의 특성을 이해하시면 쉽게 아실 수 있습니다.
일단 자식 디스크가 생성될 때에는 다음과 같은 특성을 가지게 됩니다.
1. 자식 디스크의 최대 크기는 부모 디스크와 동일하다.
2. 자식 디스크는 부모 디스크의 형식과 상관없이 무조건 동적 확장 방식으로(Expandable) 생성 된다.
2. 자식 디스크는 부모 디스크의 형식과 상관없이 무조건 동적 확장 방식으로(Expandable) 생성 된다.
즉, 부모 디스크의 최대 크기는 10GB 인데 자식 디스크의 최대 크기는 20GB 이런 건 안 된다는 거죠. 그래서 자식 디스크에서 가상 디스크의 크기를 확장하는 Expand 명령도 사용이 안 되는 겁니다. 부모 디스크의 크기를 변경하면 자식도 사용할 수 없게 되고요. 이거 잊지마세요. 그리고 자식 VHD 는 VHD 파일의 크기가 안에 담긴 데이터의 크기만큼 점점 늘어나는 동적 확장 형식으로만(Expandable) 생성 됩니다.
이런 특성들로 자식 VHD 를 생성할 땐 Type 과 Maximum 매개 변수가 사용되지 않습니다. 오직, 부모로 연결시킬 VHD 가 무엇인지 Parent 만 설정해주면 되죠. 그래서 처음에 알아 본 명령에서 Maximum 과 Type 매개 변수가 없었던 겁니다. 간단하죠?
이제 다음의 정리를 보시죠.
1. 자식 디스크를 생성, 연결, 삭제하여도 부모 디스크의 속성 및 데이터엔 어떠한 변화도 일어나지 않는다.
2. 자식 디스크는 언제든지 필요없으면 해당 VHD 파일을 삭제하는 것만으로 간단히 없앨 수 있다.
3. 원하면 언제든지 다시 자식 디스크를 만들 수 있다.
2. 자식 디스크는 언제든지 필요없으면 해당 VHD 파일을 삭제하는 것만으로 간단히 없앨 수 있다.
3. 원하면 언제든지 다시 자식 디스크를 만들 수 있다.
부모 - 자식의 연결에 관한 모든 정보는 자식에만 저장됩니다. 즉, 자식을 생성해도 부모 VHD 에는 어떠한 변화도 생기지 않는 거죠. 그리고 앞서 미리 설명한대로 자식 디스크를 시스템에 장착하여 사용하더라도 부모 디스크엔 어떠한 영향도 미치지 않습니다. 마지막으로 부모엔 자식에 대해 뭔가 저장된 게 아무 것도 없으니, 자식을 삭제하여 제거해도 마찬가지로 부모에는 아무런 영향이 없습니다.
정리하면 부모 VHD 는 자식이 없던 상태나, 자식을 생성하여 그걸로 사용 중인 상태나, 자식을 삭제하여 제거된 상태나, 모두 아무런 변화없이 똑같은 겁니다. [부모를 따로 장착하여 사용하지 않는다면]
그래서 자식 VHD 를 생성하고, 이를 통해 사용하다, 자식 VHD 를 제거해버렸다는 것은, 다시 원래의 부모 VHD 의 데이터만 남는다는 것이고, 여기에 다시 자식 VHD 를 생성하여 사용하면, 다시 원본 그대로 부모 VHD 의 데이터를 지킬 수 있는 것이죠. 이러한 일련의 작업을 흔히 자식 VHD 의 초기화라고 부릅니다.
[자식 VHD 초기화] = [자식 VHD 삭제 -> 자식 VHD 재생성]
이와 같이 자식 디스크를 제거하고 다시 생성하는 자식 VHD 의 초기화 작업은 매우 쉽습니다. 그냥 자식 VHD 파일을 삭제하고 처음 만들 때와 똑같이 다시 만들기만 하면 되거든요. 즉, 자식 VHD 를 생성할 줄만 하면 [글의 처음에 배운 그 명령] 초기화 작업은 아주 간단하게 처리할 수 있는 거죠.
자~ 그럼 이제 지금까지 이야기한 내용들을 정리하여 다시 한 번 이야기를 해보도록 하겠습니다.
특정 VHD 가상 디스크에 지워지거나 변경되면 안 되는 중요한 데이터를 원하는 만큼 담은 후, 이를 부모로 하는 자식 VHD 를 생성하고, 이를 장착하여 사용합니다. 그럼 부모 VHD 의 내용은 절대 변하지 않으니, 부모 VHD 에 저장된 데이터 만큼은 안전하게 지킬 수 있습니다. [자식에서는 무슨 짓을 해도 부모에겐 전혀 영향이 안 가니]
이제 이런 식으로 자식 디스크를 사용하다, 잘못된 작업으로 자식 디스크에 어떤 문제가 생겼다거나, 무언가 내용이 마음에 안든다면? 고민할 것 없이 자식 VHD 를 제거해버리고, 다시 새로이 만드는 즉, 자식 VHD 를 초기화하는 거죠.
자식 VHD 그 동안 수고했어! 이제 넌 필요 없으니까 꺼져~ 새걸로 다시 만들어서 쓸꺼야~ 냐하하~
이러한 자식 VHD 의 초기화를 통해 언제나 원할 때마다 처음의 데이터 상태로(부모의 상태로) 되돌아가는 효과를 얻을 수 있습니다. 그것도 매우 빠르게! 간단하죠? 이러한 자식 VHD 초기화의 특성은 순간 복구 프로그램에 비유할 수 있고, 이것은 자식 디스크를 사용하는 핵심 이유 중에 하나가 됩니다.
그렇다면 이렇게 지워지거나 변경되면 안 되는 중요한 데이터엔 무엇이 있을까요? 가장 대표적인 걸 꼽자면 바로 윈도우를 생각할 수 있겠죠. 그래서 VHD 가상 디스크에 윈도우를 설치한 후, 딱 자신이 원하는 만큼만 프로그램 설치와 셋팅 등을 모두 마치고 원하는 상태가 되었을 때, 그때 그 시점에 자식을 만드는 겁니다. 그런 후 만들어진 자식 VHD 로 부팅하여 윈도우를 사용하면, 따로 윈도우를 백업하지 않아도 부모 VHD 에 저장된 내용은 언제나 안전하게 보호되는 것이죠. 즉, 따로 윈도우를 백업하지 않아도 안전하게 지킬 수 있는 보호막 효과를 얻을 수 있는 겁니다.
그리고 앞서 말한 것과 같이 자식 VHD 를 원할 때마다 삭제 -> 재생성하는 초기화 방법을 사용하면, 언제든지 윈도우를 자식을 만들었던 그 시점 그 상태 그대로, 그러니까 딱 부모 VHD 에 저장된 그 상태 그대로 윈도우를 되돌릴 수 있는 것이죠. 즉, 윈도우가 예전 상태로 아주 빠르게 복원(초기화)되는 겁니다.
이게 대표적인 자식 디스크의 활용처입니다. 그리고 제가 제작한 VARS VShot 의 클리닝 스타일이 바로 이러한 자식 VHD 초기화 방식을 사용하고 있습니다.
이제 마지막으로 다음의 정리를 보시죠.
1. 하나의 부모 VHD 는 여러 개의 자식 VHD 를 동시에 가질 수 있고 이는 동시에 이용될 수 있다.
2. 자식 VHD 는 다시 하위에 자신의 자식 VHD 를 둘 수 있다. [부모 -> 자식(부모) -> 손자(자식)]
2. 자식 VHD 는 다시 하위에 자신의 자식 VHD 를 둘 수 있다. [부모 -> 자식(부모) -> 손자(자식)]
이러한 부모 - 자식 VHD 관계 설정의 특성으로 하나의 VHD (1) 를 통해 아래와 같은 구조도 만들 수 있는 거죠.
이미지 출처 - 스누피 박스(http://snoopybox.co.kr/1293)
즉, 2 도 1 의 자식, 3 도 1의 자식, 4 도 1 의 자식이죠. 그리고 이 셋에는 모두 다른 데이터를 넣을 수 있습니다. 그리고 셋 모두를 동시에 사용할 수도 있습니다. [물론 동시에 사용하는 것보다는 하나씩 돌아가며 따로 사용하는 게 보통이고, 주로 사용되는 윈도우 부팅에서는 동시에 부팅이 안 되니 그렇게 사용할 수 없지만 어쨌든 원래는 동시에 사용할 수 있습니다.] 즉, 원본 (최상위 부모) 디스크 하나로 여러 가지 전혀 다른 모습의 데이터 구성을 꾸밀 수도 있는 겁니다. 아래와 같이 말이죠.
지금 그림으로 본 내용은 좀 다르게 응용을 할 수도 있는데요. 자식 VHD 를 종류별로 교체 + 바로 앞에서 이야기한 자식 VHD 초기화 + 윈도우 부팅 항목 로테이션 = 항상 깨끗한 윈도우 유지, 이런 식으로 응용을 할 수도 있습니다. 즉, 자식 VHD 를 교체하는데 항상 깨끗한 자식 VHD 로 교체하는 방식을 사용하는 것이죠. 그것이 바로 VARS VShot 의 자동 클리닝 스타일입니다. 간단하죠?
다음으로 부모 - 자식 관계를 단계적으로 이어나가면 즉, 그림에서 1 - 2 - 5 - 8 로 이어지는 것과 같은 계층 구조도 만들 수 있습니다. [물론 윈도우 부팅에서는 이런 깊은 단계의 계층 구조를 가지는 경우 프로그램에 문제가 생기는 경우도 있기 때문에 주의를 해야 합니다.] 잘만 활용하면 아주 재미있는 결과를 이끌어낼 수 있겠죠?
잠시 다른 이야기이지만 이것은 VHD 뿐만 아니라 다른 가상 디스크들에서도 거의 대부분 지원이 되는 내용입니다. 특히나 이러한 구조를 아주 효율적으로 활용하고 있는 가상 디스크가 있는데요. 그게 VMware Workstation 의 VMDK 가상 디스크입니다. 바로 스냅샷(Snapshot) 이라는 기능을 통해서 말이죠.
물론 스냅샷 기능은 가상 디스크에만 국한된 것이 아닌 가상 머신 전체를 아우르는 포괄적인 기능이지만, 어쨌든 스냅샷 기능을 사용하게 되면, 해당 가상 머신에 포함된 VMDK 가상 디스크도 지금까지 이야기한 것과 같은 Difference 즉, 부모 - 자식 관계를 통해 단계적으로 분기되게 됩니다.
지금 이야기하고 있는 윈도우의 VHD 가상 디스크의 부모 - 자식 관계의 특성과 같은 거죠. 즉, VHD 나 VMDK 나 똑같은 겁니다. VMware 를 잘 아시는 분이라면 이렇게 연관지어서 생각하시면 쉬우실 듯 하네요. 모르신다면 그냥 참고로 알아두시고요. ^^ [VHD 이야기하는데 VMDK 가 튀어나와서 죄송합니다. ^^;; 근데 어차피 같은 거니까요~]
자식 디스크를 사용하면서 주의해야 할 점
제가 지금까지 자식 디스크에 대해서 설명을 하면서 글이나 그림을 통해 여러 가지 이야기를 했는데요. 그 중에서 몇가지는 잊지 말고 기억하고 있으라고 한 내용들 있죠? 그걸 이야기해보도록 하겠습니다. 다음의 정리를 보시죠.
1. 자식 디스크는 처음 연결될 때 부모 디스크의 모든 데이터를 파악하여 링크 정보를 저장한다.
2. 이러한 링크 정보는 최초에 한 번 저장되면 이후 다시 저장되거나 하지 않는다.
2. 이러한 링크 정보는 최초에 한 번 저장되면 이후 다시 저장되거나 하지 않는다.
즉, 자식 VHD 는 부모의 데이터를 연결하기 위해 부모의 데이터에 대한 링크 정보를 저장하는데, 그건 자식 VHD 가 처음으로 시스템에 장착될 때, 오직 그때 한 번 뿐입니다. 분리되었다가 다시 장착될 때 또 다시 부모 VHD 의 데이터를 읽어서 링크를 수정하거나 그런 것 없습니다. 인생에 수정이 어딨어요? 인생 어차피 한 번 뿐이에요! 아무튼 이거 다시 기억하세요.
근데 자식 VHD 가 있다고 하여 부모 VHD 는 아예 사용할 수 없는 게 아니죠. 원하면 부모 VHD 도 언제든지 시스템에 장착하여 사용할 수 있습니다. [물론 먼저 자식 VHD 를 시스템에서 분리해야 하지만] 자식이 있든 말든 그건 상관이 없습니다. 부모에는 자식에 대한 어떤 정보도 저장되지 않으니까요. 부모가 장착되어 사용될 때 자식은 전혀 관계가 없는 거죠. 오직 자식을 사용할 때에만 부모가 연결되는 겁니다. 부모를 사용한다고 자식이 연결되거나 그런 건 아니란 거죠. 무슨 말인지 아시겠죠?
자~ 이 두 가지 내용을 종합하면 한 가지 문제가 생깁니다. 자식을 가진 부모 VHD 가 시스템에 장착되어 사용되는 것까지는 좋다 이거에요. 근데 부모 VHD 의 데이터에 어떤 변화가 생기면? 만약 부모 VHD 의 어떤 데이터가 사라지면?
다시 한 번 잘 생각해 보세요. 자식 VHD 에 저장되어 있는 부모 데이터에 대한 링크 정보는 해당 자식 VHD 가 처음에 연결될 때 저장된 그 상태 그대로 라고 했죠. 이 링크 정보는 절대 변하지 않아요. 근데 다시 자식 VHD 를 장착해놓고 보니 부모의 데이터가 사라졌네? 이런 상태에서 해당 데이터에 접근했을 땐?
아무튼 이런 식인 거죠. 자식 VHD 는 부모의 데이터에 변화가 있기 전, 그러니까 예전의 링크 정보를 가지고 있기 때문에 해당 데이터가 있는 것으로 표시되지만, 실상 해당 데이터를 사용하려고 하면 아래와 같이 오류가 작렬하게 되는 겁니다.
그래서 이런 경우엔 깔끔하게 자식을 버리고 다시 만들어야 합니다. 만약 해당 부모 VHD 아래에 계층 구조로 자식 VHD 들이 여러 개 있었다면? 해당 자식 VHD 들을 전부 버려야 하는 거죠.
이미지 출처 - 스누피 박스(http://snoopybox.co.kr/1293)
즉, 이런 경우 최상위인 1 의 데이터에 어떤 변화가 발생하면 연쇄적으로 2~8 까지 모든 자식 VHD 들이 영향을 받게 되고, 이는 2~8 까지 모든 자식 VHD 들을 전부 버려야 한다는 의미가 됩니다. 뭐 빠지게 열심히 구축해 놓은거 한 번에 다 날아가버리는 꼴이죠.
이 내용을 확실하게 체험할 수 있는 부분이 바로 VHD 에 윈도우를 설치하고 자식 VHD 를 부팅용으로 사용할 때죠. 자식 VHD 로 부팅하여 잘 사용하고 있다가, 어느 날 필 받아서 부모 VHD 로 부팅하였다면? 지금까지 설명한 이유로 이전에 사용하던 자식 VHD 들은 전부 버리고, 다시 모두 새로 만들어줘야 하는 겁니다. 하나라면 다행이지만 그게 여러 개이면? 재앙이 시작되는 거죠.
"아니 난 아무 짓도 안 하고 그냥 단순히 잠깐 부팅만 하고 바로 껐는데? 그것도 문제가 되나?"
이 순간 디스크의 데이터들엔 사실 엄청난 변화가 일어나고 있는 것이다. 이러한 변화는 자식 VHD 에겐 재앙이다.
윈도우가 한 번 부팅될 땐 알게 모르게 수많은 파일들을 읽고 다시 쓰게 됩니다. 즉, 별거 안 하는 것처럼 보이지만 실상 부팅을 진행하였다는 그 한 가지 사실만으로도 데이터에 엄청난 변화가 생기는 것이죠. 고로 윈도우가 설치된 부모 VHD 로 부팅을 진행했다면 부모 VHD 에 엄청난 변화가 생겼다는 것이고, 이는 곧 이전에 만들어서 사용 중이던 자식 VHD 들은 모두 더이상 사용할 수 없음을 의미하게 되는 겁니다.
그리고 이렇게 부모 VHD 로 부팅하고 난 후 곧바로 자식 VHD 로 부팅하려고 하면 실제로도 정상적으로 부팅이 안 됩니다. [운 좋게 부팅이 되도 어디선가 필히 문제가 발생합니다. 근데 난 절대 부팅 안 되더라...]
그래서 이러한 이유로 모든 자식 VHD 를 윈도우의 부팅에 활용하는 팁들에는 공통적으로 부모 VHD 로 부팅하였을 때 이전까지 사용하던 자식 VHD 를 삭제하고 다시 새로 교체하는 (주로 미리 준비해 둔 깨끗한 자식 VHD 로 재빠르게 교체) 작업이 동반되는 것입니다. 이는 제가 제작한 VARS VShot 에서도 마찬가지입니다. [오늘 VARS VShot 많이 나오네...]
이런 작업들이 괜히 들어가는 게 아니다.
이점 자식 VHD 를 윈도우의 부팅에 활용하는 경우에 굉장히 중요한 내용이니 필히 기억을 하시길 바랍니다.
깨끗한 자식 VHD 파일이란?
이젠 이 글도 거의 끝이 보이는군요. 제가 기억해두라고 했던 내용이 한 가지 더 있었죠. 다음의 정리를 보시죠.
1. 이제 막 생성된 자식 VHD 파일에는 오직 부모가 누구인지만 저장되어 있다. [아직 부모와 데이터 연결 X]
2. 자식 디스크는 처음 연결될 때 부모 디스크의 모든 데이터를 파악하여 링크 정보를 저장한다.
2. 자식 디스크는 처음 연결될 때 부모 디스크의 모든 데이터를 파악하여 링크 정보를 저장한다.
그럼 실제로 자식 VHD 파일 하나를 생성해 보도록 하죠. 먼저 자식 VHD 를 생성하겠습니다.
create vdisk file="D:\Child.vhd" parent="D:\Example.vhd"
생성된 자식 VHD 의 크기가 어떤가요? 68.5KB 로 매우 소용량이죠? [이 용량은 조금씩 다를 수 있습니다.] 이제 이 상태에서 생성한 자식 VHD 를 시스템에 장착하도록 하겠습니다.
Attach Vdisk
장착하는 순간 8.06MB 로 크기가 늘어났습니다. 이 약 8MB 의 정도의 데이터가 바로 원본인 D:\Example.vhd 의 데이터에 대한 링크 정보인 것입니다. 간단하죠?
그러니까 이제 막 생성한 자식 VHD 파일은 아직 부모 VHD 의 데이터에 대한 링크 정보는 없고, 단순히 누가 자신의 부모인지 그 사실만 기록되어 있는 상태인거죠. 즉, 아직은 부모 VHD 와 연결되지 않은 상태라는 겁니다. 이러한 상태의 자식 VHD 파일을 흔히 깨끗한 자식 VHD 라고 부릅니다.
깨끗한 자식 VHD 에는 어떤 VHD 파일이 자신의 부모인지 그 사실만 기록되어 있다.
이러한 깨끗한 자식 VHD 파일을 따로 복사해두면 나중에 부모 VHD 의 데이터에 변화가 생겨서 자식 VHD 를 새로 생성해야 할 상황이 생겼을 때 유용하게 활용할 수 있습니다. 자식 VHD 를 삭제하고 다시 생성할 필요없이 그냥 미리 복사해 둔 녀석을 복사해와서 덮어쓰면 되니까요. 즉, 원래 아래와 같이 해야 할 작업을
del D:\Child.vhd /q
diskpart
diskpart
create vdisk file="D:\Child.vhd" parent="D:\Example.vhd"
exit
exit
아래와 같이 하나의 명령으로 줄일 수 있는 것이죠. [이 때 Clean.vhd 는 미리 깨끗한 자식 VHD 파일을 복사해둔 것]
copy /y D:\Clean.vhd D:\Child.vhd
그래서 자식 VHD 를 윈도우의 부팅에 활용할 땐 미리 이런 깨끗한 자식 VHD 파일을 복사해두고, 자식 VHD 를 초기화(삭제 -> 재생성) 해야 할 모든 상황에서 활용하는 게 보통입니다. 이와 같이 미리 복사해둔 깨끗한 자식 VHD 파일은 자식 VHD 의 초기화 작업을 단순화 시킬 수 있고, 또한 부모 VHD 의 데이터가 변화된(부모 VHD 로 부팅한) 상황에도 모두 대처할 수 있기 때문이죠. 그게 아니라면 모든 자식 VHD 의 초기화 작업 때마다 매번 처음 알아본 명령과 같이 먼저 이전의 자식 VHD 파일을 삭제한 후 DiskPart 를 통해 다시 자식 VHD 를 생성해야 할 테니까요.
그런데 간혹 깨끗한 자식 VHD 를 준비한다고 이미 한 번 연결이 된 자식 VHD 를 복사해두는 경우도 있는데요. [그것도 소용량이긴 하죠.] 물론 이런 경우에도 부모 VHD 의 데이터에 아무런 변화가 없었다면 해당 자식 VHD 파일을 교체용으로 사용해도 사실 문제는 없습니다. 하지만 이미 연결되어 부모 VHD 의 데이터에 대한 링크 정보가 저장되어버렸기 때문에 만약 부모 VHD 의 데이터에 어떠한 변화가 생긴 상황에서 사용하고자 한다면 무용지물이 되는 거죠. 특히나 VHD 부팅에서는 이러한 경우가 빈번하게 발생하고요.
실제로 다른 커뮤니티에서 이와 같이 시스템에 한 번 연결되었던 자식 VHD 를 복사해두셨다가 나중에 부모 VHD 로 부팅을 진행한 후 해당 자식 VHD 로 교체를 진행하고는 부팅이 안 된다고 왜 그러는 거냐고 물어보시던 분이 기억이 나는 군요. 왜 다른 분들과 똑같이 했는데 자긴 안 되냐며... 아무리 봐도 똑같이 하신 게 아니던데... 그래서 자세하게 설명을 드리고 싶었지만 난 거기 회원이 아니었으니까. -_-a
그러니 깨끗한 자식 VHD 파일을 준비할 땐 이러한 상황에도 대처할 수 있는 아직 한 번도 연결되지 않은 이제 막 생성한 자식 VHD 를 복사해두시는 것이 좋습니다.
참고로 스크린 샷에서 VHD 파일의 아이콘은 제가 임의로 설정한 것입니다. 혹시나 어떻게 하는 것인지 궁금하신 분들은 Types - 확장자 아이콘 손쉽게 변경하기 글을 참고하세요.
자식 VHD 는 되도록 자주 초기화하는 것이 좋다.
자식 VHD 가 가장 널리 활용되는 곳이 바로 VHD 부팅이죠. 이러한 윈도우의 데이터는 결코 작다고 할 수 없는 크기를 가지고 있습니다. 그리고 윈도우 전체를 하나의 데이터로 놓고 보았을 때, 이러한 윈도우 데이터는 굉장히 역동적인 데이터라고 할 수 있죠. 매 순간 변화하니까요.
이러한 특성으로 윈도우가 설치된 부모 VHD 에 자식 VHD 를 사용할 땐, 자식 VHD 에 하루가 다르게 엄청난 데이터가 쌓여가는 걸 볼 수 있습니다. 이는 그 만큼 원본에서 많은 변화가 일어난다는 것이죠.
우리가 사용하는 자식 디스크의 데이터 => 부모 디스크 데이터 + 자식 디스크 데이터
이게 굉장히 중요한데요. 자식 디스크는 항상 부모의 데이터와 자신의 데이터를 취합해서 그 결과를 내놓아야 합니다. 고로 부모와 자식 데이터 사이에 차이가 커질 수록(쉽게 생각하면 자식이 점점 커질 수록) 겹합해야 할 데이터가 늘어나고, 이는 곧 이 결과를 내놓는데 더 오랜 시간이 걸리게 되는 거죠.
그리하여 자식 VHD 는, 특히나 거의 고정적인 일반 데이터가 아닌 항상 변화하는 윈도우와 같은 데이터를 담고 있는 자식 VHD 는, 오래 사용할 수록 점점 느려지는 걸 피할 수가 없습니다. 이러한 현상은 HDD 에서 VHD 를 운영할 때 두드러지게 발생하게 됩니다. 헤드가 부모 데이터랑 자식 데이터 사이를 왔다 갔다 하느라 힘겨워 하거든요. 마치 단편화된 데이터를 읽을 때처럼 말이죠. [그것도 엄청나게 단편화 된]
만약 VHD 를 SSD 에서 운영한다면 SSD 자체가 워낙에 성능이 좋고, 또한 단편화의 영향을 받지 않기 때문에 이러한 현상을 거의 느끼지 못할 수도 있습니다. [그래서 SSD 가 좋은 겁니다. 돈 좀 끼얹어주면 쾌적해지거든요.]
아무튼 이러한 이유로 자식 VHD 를 부팅에 활용하는 경우엔 되도록이면 (특히나 HDD 에선) 자주 자식 VHD 를 초기화(또는 병합) 해주는 것이 좋습니다. 제 경험상 VHD 를 HDD 에서 운영 중이라면 적어도 한 달에 한 번은 초기화를 해야 되겠더군요. 그 정도쯤 되면 확실히 부팅이나 뭐 그런 반응들이 느려지는 게 느껴지거든요.
그래서 만약 자식 VHD 를 윈도우를 빠르게 초기화할 수 있는 장점 하나만 보고 구축하곤, 실제론 몇 달에 한 번 초기화 할까 말까 하는 정도라면 차라리 자식 VHD 가 아닌 자식 없이 단일 VHD 로 사용하고 이를 백업해두었다 복원하는 방식을 사용하시는 게 좋습니다. VARS VShot 에선 기본 스타일이 이러한 방식입니다. [흠... 이거 VShot 설명 글이 아닌데 너무 자주 나오네...]
자식 VHD 를 부팅에 활용할 때 반드시 알아두어야 할 내용
모든 VHD 는 부팅용으로 사용될 때, 부팅되는 순간 VHD 파일이 최대 크기(가상 디스크의 크기)로 확장됩니다. 그리고 윈도우가 종료되면 다시 원래의 크기로 되돌아가죠. [부팅용이 아닌 일반 데이터용 VHD 는 해당하지 않습니다.] 만약 VHD 파일이 위치한 디스크의 여유 공간이 부족하여 VHD 파일이 최대 크기로 확장되지 못한다면 부팅은 실패하게 됩니다.
아무튼 그래서 부팅용 VHD 파일이 단일 VHD 이고 Fixed 형식이라면 이미 자체적으로 최대 크기이니 부팅되거나 종료되거나 상관없이 그냥 그대로인거고, 단일 VHD 이고 Expandable 형식이라면 해당 VHD 가 부팅에 사용되는 순간 Fixed 형식일 때의 크기로 확장되고, 윈도우가 종료될 때 다시 원래의 크기로 되돌아가는 겁니다.
이는 자식 VHD 에서도 마찬가지로 적용됩니다. 앞서 말했듯이 모든 자식 VHD 는 Expandable 형식이죠. 그래서 자식 VHD 또한 부팅에 사용되는 순간 마찬가지로 최대 크기로 확장됩니다. [이 때 부모 VHD 는 단순히 자식과 연결되어 데이터만 제공하는 것이기 때문에 이러한 내용을 적용받지 않습니다. 즉, 자식 VHD 가 부팅에 사용되더라도 부모 VHD 는 최대 크기로 확장되지 않습니다.]
그래서 자식 VHD 가 부팅에 사용되면 디스크에서 부모 + 자식이 차지하는 공간의 크기는 [현재 부모 VHD 파일 크기 + 최대화된 자식 VHD 파일 크기] 가 되는 겁니다.
만약 부모 VHD 가 Fixed 형식이고 자식 VHD 가 부팅에 사용된다면? 두 VHD 파일 모두 가상 디스크의 최대 크기인 상태이니 실제 디스크에서 부모 + 자식이 차지하는 공간은 [가상 디스크의 최대 크기 x 2] 의 공간을 사용하는 것이 되는 겁니다. 만약 가상 디스크의 크기가 20GB 라면 부모 + 자식은 총 40GB 의 공간을 사용하게 되는 것이죠.
만약 부모 VHD 가 Expandable 형식이고 자식 VHD 가 부팅에 사용된다면? 자식 VHD 파일만 최대 크기를 가질 것이므로 현재 부모 VHD 파일 크기 + 최대화된 자식 VHD 파일 크기하여 [가상 디스크의 최대 크기 < 부모 + 자식 =< 가상 디스크의 최대 크기 x2] 의 값을 가지게 될 것입니다. 만약 현재 부모 VHD 파일의 크기가 10GB 이고 가상 디스크의 크기는 20GB 라면 부모 + 자식은 총 30GB 의 공간을 사용하게 되는 겁니다.
즉, 어쨌든 자식 VHD 를 부팅에 사용하면 자식 없이 VHD 하나만 단독으로 사용할 때에 비해 최대 2배까지 더 많은 공간이 필요하다는 결론이 나오게 됩니다. 만약 SSD 와 같은 소용량의 공간에 VHD 를 위치시키고 자식까지 사용할 예정이라면 이거 계산 잘하셔야 합니다. 이거 생각치 않고 무작정 처음에 부모 VHD 를 생성할 때 Expandable 형식을 사용할 거라고 최대 크기를 크게 잡고 자식 VHD 를 부팅에 사용하면, 친절한 블루 스크린씨가 여러분을 마중나갈 겁니다.
VHD 의 최대 크기를 축소하는 건 DiskPart 의 기본 기능만으론 불가능합니다. [여러가지 꼼수를 부려야 하는데 이게 좀...] 하지만 VHD 의 최대 크기는 언제든지 손쉽게 확장할 수 있죠. 그러니 VHD 의 최대 크기를 처음엔 적절히 작게 잡아서 생성하고 실제로 사용하다 부족하면 적당히 늘려쓰는 지혜가 필요합니다.
여기까지 하죠...
마지막으로
이번 글이 자식 VHD 를 활용하고 관리하는 모든 것을 담은 것은 아닙니다. 하지만 제 나름대로 중요하다고 생각되는 내용은 거의 대부분 설명한 것 같네요. 그래서 이번 글에서 설명한 내용들만 잘 이해하시면 이전의 그리고 앞으로의 제 글들 뿐만 아니라 여러 가지 다른 분들의 자식 VHD 와 관련된 자료나 팁들을 이해하고 활용하는데에 많은 도움이 될 것이라고 생각합니다. 그거면 된거죠. 뭐...
★ [DiskPart] 자식 디스크의 생성과 관리, 그리고 이해 - Create Vdisk Parent
★ [DiskPart] 자식 디스크의 데이터를 부모 디스크로 합치기(VHD 병합) - Merge
★ [DiskPart] 자식 디스크의 데이터를 부모 디스크로 합치기(VHD 병합) - Merge