최근에 서버에 세팅하고 쓰던 오라클 버추어 박스(Oracle Virtual Box)가 갑자기 죽는 바람에 정상적으로 가상 머신이 구동되지 않는 문제가 발생했습니다. 아무래도 오래된 가상 머신이다 보니 저장된 데이터도 많고 특히 스냅샷이 많아서 데이터가 하드디스크의 차분 데이터(Difference)가 많이 쌓여 있었거든요. 그런데 부팅을 했더니 지난주의 스냅샷으로 돌아가버리는 겁니다. ㅠㅠ)/ 정말 돌아버릴 것 같더라구요.

그냥 날리기에는 너무 아까운 데이터들이라 vbox 관련 설정을 보기 시작했습니다. 그랬더니 규칙이 보이더라구요. 결국은 하드디스크의 차분 데이터를 순서대로 쌓고 가장 최근 차분으로 부팅을 시작하도록 vbox 설정을 수정하는 것이 핵심이었습니다. ^^;;

말로 하니 엄청 어려운데... 일단 .vbox 파일을 vi로 열어보시면 미디어 등록(MediaRegistry), 스냅샷(Snapshot), 하드웨어 설정(Hardware), 저장소 컨트롤러(Storage Controller)의 네 부분으로 나뉩니다.

<?xml version="1.0"?>
... 생략 ...
<VirtualBox xmlns="http://www.virtualbox.org/" version="1.16-linux">
  <Machine uuid="{e5321d5b-ec0b-46fb-b91b-21758d33bf65}" name="Linux 2.0" OSType="Oracle_64" currentSnapshot="{d3870e3c-14b2-46ba-9cae-95d8fe7f7cfe}" snapshotFolder="Snapshots" lastStateChange="2020-08-24T15:56:22Z">
    <-- 미디어 등록 -->
    <MediaRegistry>
      <HardDisks>
        <HardDisk uuid="{6f7655b2-370e-492c-93fc-5a965b18fdd7}" location="Linux 2.0.vdi" format="VDI" type="Normal">
          <HardDisk uuid="{5e9971c7-0b7e-4355-bb14-9f12841b2f05}" location="Snapshots/{5e9971c7-0b7e-4355-bb14-9f12841b2f05}.vdi" format="VDI"/>
        </HardDisk>
      </HardDisks>
      <DVDImages>
        <Image uuid="{84d51fa6-d6f3-48be-9cde-ecde3ddd84e1}" location="/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso"/>
      </DVDImages>
    </MediaRegistry>
    
    <-- 스냅샷 관련 정보 -->
    <Snapshot uuid="{d3870e3c-14b2-46ba-9cae-95d8fe7f7cfe}" name="Snapshot 1" timeStamp="2020-08-24T15:56:22Z" stateFile="Snapshots/2020-08-24T15-56-22-357112000Z.sav">
      <Hardware>
        <CPU count="2">
          <PAE enabled="true"/>
          <LongMode enabled="true"/>
          <X2APIC enabled="true"/>
          <HardwareVirtExLargePages enabled="false"/>
        </CPU>
        <Memory RAMSize="8192"/>
        ... 생략 ...
    </Snapshot>
    
    <-- 가상머신 하드웨어 정보 -->
    <Hardware>
      <CPU count="2">
        <PAE enabled="true"/>
        <LongMode enabled="true"/>
        <X2APIC enabled="true"/>
        <HardwareVirtExLargePages enabled="false"/>
      </CPU>
      <Memory RAMSize="8192"/>
      <Paravirt provider="KVM"/>
      <Display controller="VMSVGA" VRAMSize="128"/>
      <VideoCapture screens="1" file="." fps="25"/>
      ... 생략 ...
    </Hardware>
    
    <-- 저장소 컨트롤러 정보 -->
    <StorageControllers>
      <StorageController name="IDE" type="PIIX4" PortCount="2" useHostIOCache="true" Bootable="true">
        <AttachedDevice passthrough="false" type="DVD" hotpluggable="false" port="0" device="0">
          <Image uuid="{84d51fa6-d6f3-48be-9cde-ecde3ddd84e1}"/>
        </AttachedDevice>
      </StorageController>
      <StorageController name="SATA" type="AHCI" PortCount="1" useHostIOCache="false" Bootable="true" IDE0MasterEmulationPort="0" IDE0SlaveEmulationPort="1" IDE1MasterEmulationPort="2" IDE1SlaveEmulationPort="3">
        <AttachedDevice type="HardDisk" hotpluggable="false" port="0" device="0">
          <Image uuid="{5e9971c7-0b7e-4355-bb14-9f12841b2f05}"/>
        </AttachedDevice>
      </StorageController>
    </StorageControllers>
  </Machine>

여기서 중요한 점은 미디어 등록 부분과 마지막에 저장소 컨트롤러 부분인데요, 분석 결과 미디어 등록 부분은 가상 머신의 하드로 사용되는 vdi 파일 원본부터 스냅샷으로 인해 생성된 "Snapshot\{UUID}.vdi" 정보를 생성된 시간 순서대로 쌓아나가는 역할을 했습니다. 그리고 저장소 컨트롤러 정보는 미디어 등록 부분 중 한 위치를 가리키게 되는데요, 보통은 가장 마지막, 즉 가장 최근 차분 디스크의 UUID를 설정해서 최신 하드 정보로 부팅하도록 만듭니다.

위의 설정 파일 같은 경우는 저장소 컨트롤러가 "Snapshot\{5e9971c7-0b7e-4355-bb14-9f12841b2f05}.vdi"로 부팅을 시작하도록 되어 있고, 이는 미디어 등록 정보를 따르면 Linux 2.0.vdi의 최근 차분 정보임을 알 수 있습니다. 즉 아래처럼요.

{5e9971c7-0b7e-4355-bb14-9f12841b2f05}
  |-> {6f7655b2-370e-492c-93fc-5a965b18fdd7}
        |-> Linux 2.0.vdi

사실 어느 정도 정보가 살아 있는 경우는 미디어 등록 정보를 비교적 쉽게 구성할 수 있는데요, 아무런 정보가 없는 경우는 Snapshot 폴더로 이동해서 아래 명령어를 사용하면 부모의 차분 이미지 UUID를 찾아낼 수 있습니다. 이러한 정보를 이용해서 순서대로 나열하면 역시 미디어 등록 정보를 구성할 수도 있죠. 제가 직접 사용한 방법이기도 합니다. ㅠㅠ)/ 차분 정보를 보면 부모의 UUID가 6f7655b2-370e-492c-93fc-5a965b18fdd7 인데요, 아래쪽의 Linux 2.0.vdi를 보면 UUID가 동일한 것을 알 수 있습니다. 이를 통해 Linux 2.0.vdi의 첫 번째 차분임을 알 수 있는 거죠.

# 차분의 정보 표시
$> vboxmanage showhdinfo {5e9971c7-0b7e-4355-bb14-9f12841b2f05}.vdi
UUID:           5e9971c7-0b7e-4355-bb14-9f12841b2f05
Parent UUID:    6f7655b2-370e-492c-93fc-5a965b18fdd7
State:          locked write
Type:           normal (differencing)
Auto-Reset:     off
Location:       /home/user/VirtualBox VMs/Linux 2.0/Snapshots/{5e9971c7-0b7e-4355-bb14-9f12841b2f05}.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       102400 MBytes
Size on disk:   2 MBytes
Encryption:     disabled
Property:       AllocationBlockSize=
In use by VMs:  Linux 2.0 (UUID: e5321d5b-ec0b-46fb-b91b-21758d33bf65)

# 가상 하드디스크의 정보 표시
$> vboxmanage showhdinfo Linux\ 2.0.vdi 
UUID:           6f7655b2-370e-492c-93fc-5a965b18fdd7
Parent UUID:    base
State:          locked read
Type:           normal (base)
Location:       /home/user/VirtualBox VMs/Linux 2.0/Gooroom 2.0.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       102400 MBytes
Size on disk:   5967 MBytes
Encryption:     disabled
Property:       AllocationBlockSize=1048576
In use by VMs:  Linux 2.0 (UUID: e5321d5b-ec0b-46fb-b91b-21758d33bf65) [Snapshot 1 (UUID: d3870e3c-14b2-46ba-9cae-95d8fe7f7cfe)]
Child UUIDs:    5e9971c7-0b7e-4355-bb14-9f12841b2f05

어휴... 어쨌든 해결해서 다행이네요.

그럼 좋은 밤 되세요 ^^)/

얼마 전 제가 쓴 64비트 멀티코어 OS 원리와 구조의 A/S건으로 보안 프로젝트 카페에 가입을 하게되었는데요, 배울 내용이 많아 종종 들러서 공부를 하고 있습니다(감사합니다. 보안 프로젝트 선배님들 ^^). 오늘도 아침에 일어나 애기가 자는 사이 뭐라도 배울 게 없나 훑어보고 있었는데요, 재미있는 내용을 발견했습니다.

Kioptrix » Downloads 2014-02-08 09-20-39

할만한 해킹 첼린지 문제라는 글인데요, kioptrix라는 사이트에서 제공하는 가상머신 이미지를 구동시켜 루트권한을 얻는 겁니다. 제가 이런 류의 첼린지에 좀 흥미가 있어서 관심있게 봤는데요, 혹시 저 말고도 관심있는 분들이 계실까봐 링크를 걸어둡니다. ^^

그럼 좋은 하루 되세요 ^^

ps) 사실 아직 다운로드 받아서 해본 건 아니라... 내용이 어떤 지는 잘 모릅니다. ㅠㅠ 애기가 푹 자는 저녁이나 해볼 수 있거든요 ㅠㅠ

제 책 "64비트 멀티코어 OS 원리와 구조"가 나온지도 벌써 3달이 다되어 가는군요. ^^ 부족한 책이지만 많은 분들이 구매해주신 덕분에 순조롭게 진행되고 있는 것 같습니다(물론 손익 분기점까지는 아직 멀었지만 말입니다 ㅠㅠ).

<64비트 멀티코어 OS 원리와 구조>



책의 내용 중에서 가장 많이 질문 받는 내용 중에 두 가지가 초반에 환경 구축할 때 크로스 컴파일러를 만드는 과정과 QEMU 0.10.4 버전을 어디서 구하는가 하는 것입니다. ^^;;; 그래서 얼마전에 Cygwin 최신 버전으로 64비트 크로스 컴파일러를 만드는 글(http://kkamagui.tistory.com/762)을 올렸습니다.

이번에는 QEMU 0.10.4 버전을 어디서 다운로드할 수 있는가 하는 것인데... 가장 간단한 방법은 여기에 올려드린 첨부 파일을 다운로드 하는 것입니다. ^^;;; QEMU 0.10.4 버전은 제가 MINT64 OS를 만들기 시작할 때 쓰던 버전이라... 지금은 구하기가 힘들기 때문이지요.


QEMU에 최신 OS를 설치하려면 최신 버전을 다운로드하시는게 아무래도 이득이겠지만, MINT64 OS를 실습하는데는 0.10.4 버전을 사용하시는 것이 정신의 평화와 안정을 유지하는데 도움이 되실겁니다. ^^;;;;

그럼 즐거운 OS 프로그래밍하세요 ;)

+ Recent posts