Programming

Kimberlize

라우드니스 2013. 2. 27. 15:19

주소: cmusatyalab / kimberley

 

Kimberlize system은 사용자에게 사전의 설치 없이 application을 실행할 수 있는 기능을 VM 기술을 통해 제공한다. 요구되는 application이 돌아가는 VM은 다른 machine이 미래에 사용될 것이라 예상될 때 사용자에 의해 미리 만들어 진다. Runtime은 target machine에서 즉시 조립되고 resume 된다.

우리는 the VirtualBox VM monitor를 가상화 platform으로 사용하도록 선택했다. VirtualBox는 최근 Sun Microsystems가 구매한 독일 소프트웨어 회사 Innotek의 open-source 가상화 제품이다.

 

10기가 이상의 VM 상태를 runtime에 전송하는 것은 아마 불가능 할 것이기 때문에, Kimberlize preparation process는 큰 VM 상태를 application의 설치와 subsequent execution의 결과로 생성되는 더욱 작은 delta로 나눈다. 이것은 VirtualBox의 snapshot과 differencing disk 기능을 이용하여 목적을 달성한다. 사용자가 Kimberlized application을 생성하는 것은 무조건 처음에 base VM을 준비해야 한다. 그리고 VM에 요구하는 application을 설치하는 kimberlize script를 실행하고, 생성되는 새로운 VM state를 저장하고, 기본 상태로 VM로 되돌리고, application이 설치되고 실행된 뒤의 상태와의 binary 차이를 나타내는 파일을 내보낸다.

 

Administrative Setup

 

(너무 영양가 없는 내용이라서 생략.)

대략적인 내용: VirtualBox에서 새로운 Virtual Machine을 생성할 때 disk option은 무엇을 선택하고, OS설치하고 kimberley라는 유저 추가하고 설정 바꿔주고 ssh 설치해놓고 기타 등등…

그리고 두 스크립트 준비(논문에서 언급하는 install-script, resume-script).

 

Kimberlize Command

 

Syntax

kimberlize [-e [-k encryption-key-file]] [-l username] [-n] <vm-name> <install-script> <execute-script>

 

Internals

The Kimberlize script는 다음의 행동을 수행한다:

  1. Checkpoint를 만든다. 이 checkpoint는 강제적인 모든 disk update를 통해 논리적으로 application state와 base VM 상태를 동적으로 확장된 boot disk image로 돌아가는 것 대신 새로운 differencing files 상태로 나눈다.
  2. VirtualBox의 port를 host는 2222로 , guest는 22번 포트로 virtual machine의 ssh access를 허락하기 위해 변경한다.
  3. Virtual machine을 재실행 한다.
  4. SSH와 install script를 실행하고 완료될 때까지 기다린다.
  5. background에서 "ssh –f"옵션과 함께 application 실행 스크립트를 실행한다.
  6. Application의 초기화까지 몇 초 기다린다.
  7. Virtual machine을 중단시킨다.
  8. /tmp/vm_name/ directory를 생성하고 VirtualBox.xml 전역 설정 파일과 vm_name.xml vm-specific 설정 파일을 그곳으로 복사한다. 이 directory는 base virtual machine위에 곧바로 untar하는 dekimberlize porcess를 허락하기 위해 VirtualBox virtual machine을 소유하고 있는 directory와 동일한 구조를 가져야 한다.
  9. /tmp/vm_name/Snapshots/ directory를 VirtualBox가 Snapshots/ subdirectory of virtual machine와 동일한 방식으로 생성한다.
  10. 설치 이전의 in-memory state와 checkpointed in-memory state의 binary 차이점을 수행하는데 사용하는 도구인 xdelta를 생성한다. 이것은 applicaton의 설치로 인해 생성된 새로운 in-memory state를 나타낸다. VirtualBox는 이미 compact differencing disk를 유지하고 있기 때문에 disk 상태에 xdelta를 사용할 필요는 없다. 산출물은 현재 memory state's 파일이름과 함께 /tmp/vm_name/Snapshots/{memory_state's_uuid}.diff 로 저장된다. Note:이 단계에서는 xdelta의 내부 압축은 비활성화이다.
  11. Snapshot 이후에 binary differencing disk를 /tmp/vm_name/Snapshots로 복사한다.
  12. Virtual machine을 snapshot 상태로 되돌리고, snapshot을 포함하여 모든 새로운 상태를 효과적으로 버린다. Virtual machine은 지금 Kimberlize를 수행하기전의 상태와 동일하다.
  13. Virtual machine으로의 forwarding port를 제거한다.
  14. /tmp/vm_name의 tarball을 생성하고 working directory내부에 app_state.tar로 산출시킨다. 이 파일은 .tar 확장자 만큼 어떤것이든 이름을 다시 설정해도 되며 .tar.lzma는 dekimberlize의 해석으로 보관돼 있다.
  15. (추가) tarball을 lzma(the Lempel-Ziv-Markov Chain algorithm)을 사용하여 압축한다.
  16. (추가) …(암호화에 관한 이야기)

 

사용자는 tarball 을 생성하고 machine이 적용될 것에다가 저장하거나 webserver로 공용으로 이용할 수 있게 만든다. 사용자가 이 patch의 사용을 시도할 때, dekimberlize script를 호출하고, kimberlize patch의 파일이름이나 찾을 수 있는 URL중 하나를 제공한다. Dekimberlize는 kimberlize의 역작용을 수행하고, kimberlize patch를 가지고 base VM에 적용하여 요구되는 application이 설치된 것을 만든다.

 

Dekimberlize Command

 

Syntax

 

Dekimberlize 명령어의 문법은 다음과 같다:

dekimberlize [-a floppy_image_path] [-d encryption_key_file] <-f || -i> <kimberlize_path> <vm_name>
					

 

(옵션 설명)

 

Internals

 

The dekimberlize script는 다음 역할을 수행 한다:

  1. VM overlay를 불러온다. 만약 URL로 나타나 있으면 –i command-line option을 통해서 불러온다.
  2. VM overlay를 해독한다. 만약 해독 key가 공급된다면 –d command-line option을 통해서 해독한다. Openssl이 역할을 수행하기 위해 불려진다.
  3. 만약 파일이름의 확장자가 압축돼있다고 나타낸다면 VM overlay의 압축을 해제한다.
  4. Virtual machine's in-memory state 파일 이름을 해당하는 checkpointed filename으로 변경한다. 그리고 step 4중에는 blown away 되지 않는다. (주: 삭제 되지 않는다는 말?) 기억할 것은, 이건 base virtual machine's in-memory state를 나타낸다.
  5. Kimberlize patch를 virtual machine's directory: $HOME/.VirtualBox/Machines/vm_name/에 untar한다.
  6. Binary difference file {memory_state_uuid}.idff파일ㅇ르 base in-memory state에 적용하고 application이 돌아가고 있는 {memory_state_uuid}.sav파일을 재생성한다. 이 때 xdelta가 사용된다.
  7. Virtual machine을 다시 시작한다.
  8. VirtualBox가 virtual machine이 돌아가고 있다고 나타낼 때까지 기다린다.
  9. 만약 공급됐다면, 추가적으로 VM에 floppy disk image file을 floppy disk로 부착한다.
  10. Virtual machine이 더 이상 사용되지 않거나 사용자가 중지시키거나 종료할 때까지 기다린다. 대안으로, /tmp/dekimberlize_finished 파일을 생성하는 것이 사용이 완료됐다는 것을 dekimberlize에게 나타낸다.
  11. Machine을 종료한다.
  12. Machine이 checkpoint로 복구한다. Kimberlize와 동일하게, base VM 상태로 되돌린다.
  13. {memory_state_uuid}.diff를 제거한다.

 

Dekimberlize porcess가 새로운 상태를 버리고 kimberlize patch에 저장된 checkpoint로 복구하기 때문에, 이것은 멱등의 명령이고 연속적으로 부작용 없이 적용될 수 있다.

 

(kimberlize script가 동작중인 VM을 다른 host로 옮길 수 있지만 VirtualBox의 기술적인 문제 때문에 안전하게 machine 사이로 옮겨갈 수는 없다는 이야기. Innotek이 미래에 해결해야 할 제한점. )

 

Appendix: VirtualBox Directory Structure

Kimberlize depends on VirtualBox's directory structure representation for virtual machines and their snapshots.

Path

Purpose

$HOME/.VirtualBox/

Contains user-specific VirtualBox data.

$HOME/.VirtualBox/VirtualBox.xml

VirtualBox's global configuration file, which contains information about virtual disks.

$HOME/.VirtualBox/VDI/*.vdi

Virtual disks used in creating new virtual machines.

$HOME/.VirtualBox/Machines/

Virtual machine-specific data, excluding the virtual disks.

$HOME/.VirtualBox/Machines/vm_name/

A specific virtual machine's data, including checkpoints.

$HOME/.VirtualBox/Machines/vm_name/vm_name.xml

VM-specific configuration file.

$HOME/.VirtualBox/Machines/vm_name/Snapshots/

Used to store in-memory states and differencing virtual disks created as a result of taking snapshots.

$HOME/.VirtualBox/Machines/vm_name/Snapshots/*.sav

Represents in-memory state of a checkpoint (or current state).

$HOME/.VirtualBox/Machines/vm_name/Snapshots/*.vdi

Represents virtual disk differences of a checkpoint (or current state).

반응형