최근에 서버에 세팅하고 쓰던 오라클 버추어 박스(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

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

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

+ Recent posts