'가상화,어플라이언스'에 관한 글 6건

  1. 2012.03.09 kvm, kvmclock, crazy train, "Guest WORK HARD!" 1
  2. 2011.12.19 rdesktop과 ClearType
  3. 2010.07.28 클컴 시대, OS 사업자의 효과적 접근방식
  4. 2009.02.27 어쩌자고... 넷북에서 Xen을 돌리겠다는 건데?
  5. 2008.12.13 우분투 8.10에서 kvm을 이용한 가상서버 설정
  6. 2007.04.26 이것도 어플라이언스!? - "어드밴텍, ‘UCC 노래방 기기’ 일본특허 취득"

kvm, kvmclock, crazy train, "Guest WORK HARD!"

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

그냥 급하게 진행해버려서 로그를 다 놓쳤다. 아무튼, 내 kvm Guest가 미친듯이 달렸다. 이게 처음 겪는 일은 아닌데, 지난 번 사고때는 그냥 "뭐냐~" 하면서 재시작해버렸다. 그러나 이번엔 원인 규명을 위해 약간의 정보를 더 얻어봤다.

1. 어떻게 달리나?

증상은 이렇다. 먼저 미친 기관차에 strace를 걸었을 때,

rt_sigaction(SIGALRM, NULL, {0x7f8c00851300, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7f8bffee9060}, 8) = 0
write(8, "\1\0\0\0\0\0\0\0", 8)         = 8
read(17, 0x7fffe6b5b1b0, 128)           = -1 EAGAIN (Resource temporarily unavailable)
timer_gettime(0, {it_interval={0, 0}, it_value={0, 0}}) = 0
timer_settime(0, 0, {it_interval={0, 0}, it_value={0, 250000}}, NULL) = 0
timer_gettime(0, {it_interval={0, 0}, it_value={0, 203522}}) = 0
select(20, [7 10 16 17 18 19], [], [], {1, 0}) = 1 (in [7], left {0, 999997})
read(7, "\1\0\0\0\0\0\0\0", 512)        = 8
select(20, [7 10 16 17 18 19], [], [], {1, 0}) = 1 (in [17], left {0, 999955})
read(17, "\16\0\0\0\0\0\0\0\376\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 128) = 128

이런 내용을 무지하게 뿌리고 있었다. 단순히 이 내용을 보고 "Resource temporarily unavailable" 오류를 만드는 fd 17에 집중하게 됐는데, 찾아보니,

sio4@sun:~$ sudo ls -l /proc/10815/fd
total 0
...
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 10 -> anon_inode:[signalfd]
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 14 -> anon_inode:kvm-vcpu
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 15 -> anon_inode:kvm-vcpu
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 16 -> socket:[104985]
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 17 -> anon_inode:[signalfd]
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 18 -> socket:[104986]
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 19 -> /dev/net/tun
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 3 -> socket:[104980]
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 4 -> /dev/ptmx
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 5 -> /dev/kvm
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 6 -> anon_inode:kvm-vm
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 7 -> anon_inode:[eventfd]
lrwx------ 1 libvirt-qemu kvm 64 2012-03-09 13:33 8 -> anon_inode:[eventfd]
...
sio4@sun:~$

signalfd 라는데... 이 정체는 뭘까?

아차! Terminal log buffer를 다 날렸다고 해놓고 어떻게 잡았냐고? 혹시나 정상적인 VM을 trace했더니 같은지 비슷한지... 이런 결과가 나왔다.

2. 찾아본 내용

먼저, 리소스 관련 로그를 기반으로 찾아봤더니, VM이 사용할 clock 관련 글들을 몇 개 찾을 수 있었다. 현상으로 봐도 뭔가 연관이 있을 것도 같다. 하지만... 문제의 의도적 재현이 되지 않는 상황에서 연관성이 있는지 확인은 하지 못했다. 좀 두고 봐야 할 문제네.

guest needs to boot with clock=acpi_pm

3. 기타

요거 문제 해결하려고 VM 내의 syslog를 보려 했더니 온통 DHCP lease 관련 로그로 범벅이 되어 있다. 서버라지만 고정IP를 쓰는 것은 좋아하지 않으므로 그것을 고칠 생각은 없고, DHCP 서버의 lease time을 조정하고 싶은데 libvirt/kvm에 의해 자동 실행되는 dnsmasq의 parameter를 바꿀 수 있는 방법을 쉬 알 수 없네.

dnsmasq 자체만 보면, --dhcp-range 옵션의 ',' 분리된 인수 중 세 번째로 leasetime을 줄 수 있도록 되어있는데, kvm의 xml 기반 network 설정에는 해당 기능이 없는 듯 하다. 좀 더 알아보고, 요청을 하든지...

rdesktop과 ClearType

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

요즘 회사에서는 업무 환경에 VDI를 구축하겠다고 난리다. 뭐 난리는 아니겠지만 그냥 그렇게 표현했다. 오늘은 POC를 한다고 VMware View Client를 설치하라고... 주문이 들어왔는데... POC 사이트에 접속을 했건만, 이건 무슨 90년대식 깨진 글꼴? 그래서 잠깐 이것 저것 시도를 해봤다.

1. VMware View Open Client

꽤 오래 전에 공개되었던 VMware View Client의 오픈소스 버전을 찾아서 Google Code에 방문, 프로젝트 사이트에서 최근의 버전을 다운받아 설치했다.
(http://code.google.com/p/vmware-view-open-client/)

amd64용 deb 패키지를 받았더니 Ubuntu에서 무리 없이 설치가 되었고, "프로그램-인터넷-VMware View Open Client" 메뉴를 이용하여 화면을 볼 수 있었다.

그런데 이게 무슨 꼴? 글씨가 삐뚤 빼뚤... 확~ 창을 닫을려다가 잠깐 IP와 접속 정보(Domain과 계정명)만 확인하고는 다음 시도에 들어갔다.

2. tsclient... "프로그램-인터넷-터미널 서버 클라이언트"

우분투에는 메뉴에 "터미널 서버 클라이언트"라는 제목으로 뜨는 프로그램이 있다. 아마도 rdesktop의 프론트엔드겠지. 이 녀석을 이용하여 다시 시도했다. 프로토콜에서 RDP 버전을 5로 설정하고 앞서 확인한 VM의 IP와 계정을 이용해서 접속. 그런데...

  1. 바탕화면 글꼴은 ClearType 적용이 잘 되어 있다.
  2. 그런데 바탕화면 배경 이미지는 없네...
  3. IE 브라우져의 URL 창은 ClearType이 적용된데 반해, Tab은 깨져 보인다. 뭐지? :-(

3. 다시 rdesktop, 손으로.

웹을 좀 뒤져봤더니, -x 옵션을 이용하여 좀 세세한 설정을 할 수 있었다. 그래서,

$ rdesktop -u xxx -p xxx -d xxx -g 1360x768 -x 0x80 10.10.10.10

이렇게, ... 그랬더니...

  1. 이제 ClearType도 완전해졌고(IE Tab 포함)
  2. 바탕화면도 보인다. ㅋ

그냥 -x 옵션을 기록으로 남기기 위해 좀 끄적였는데... 갑자기 예전에 s3c6400 기반 800x480 화면의 디바이스에 rdesktop 포팅하던 기억이 새록 새록 떠오르네... 그게 값이 쌀지는 모르겠으나... VDI라고 한다면 그렇게 가야 하지 않을까... :-)

클컴 시대, OS 사업자의 효과적 접근방식

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

지난 주에, 우분투 리눅스(Ubuntu Linux)의 제작사인 캐노니컬은 IBM DB2의 구동을 위한 가상 어플라이언스를 발표했다. 뭐... 별 일이 아닐 수도 있지만, 가상화/클라우드 컴퓨팅 시대의 시스템 구성/배치 방식, 소프트웨어 배포 방식, 기존 OS의 발전 방향을 놓고 봤을 때 숨은 의미가 크다고 생각한다. 어쩌면 클라우드 컴퓨팅 시대를 향한 OS 기반 사업자의 효과적인 접근 방식일 수도...

클라우드 컴퓨팅과 시스템 구성/배치

클라우드 컴퓨팅의 한 영역인 IaaS(Infrastructure as a Service) 환경은 기존의 물리적 시스템 구성/배치 방식을 가상머신을 이용한 시스템 구성/배치 형태로 바꿔놓고 있다. 가상화를 통한 시스템 추상화를 바탕으로 하여 다수의 시스템 구성을 단순히 "미리 구성된 시스템 이미지의 복제"로 해결할 수 있게 되었고, 기존의 시스템 프로비져닝을 괭장히 단순화시킬 수 있게 되었으며, 괭장히 유연한 시스템 배치가 가능하게 되었다. 사용자는, 하드웨어 설치 및 구성부터 OS 설치 및 환경 설정, 어플리케이션 설치 및 구동 환경 최적화 등의 복잡한 과정을 모두 생략하고, 전문가에 의하여 미리 구성된 "사용 가능한 시스템"을 "서비스 카탈로그"에서 골라서 단지 사용만 하면 되는 것이다. 이를 위하여,

  • 잘 구성된 가상화 인프라와 자동화된 안정적 운영 환경
  • 전문가의 손때가 묻은 미리 구성된 시스템 이미지 또는 가상 어플라이언스
  • 셀프서비스가 가능한 사용자 환경과 서비스 환경, 서비스 카탈로그 시스템

등의 조건이 갖춰져야 한다.

가상 어플라이언스

가상 어플라이언스란 일종의 소프트웨어/어플리케이션 배포 형태로 볼 수 있는데, 어플리케이션을 단일 패키지 형태로 배포하는 것이 아니라 그것이 구동하기 위한 기반 구성을 미리 조립, 설정하여 목적 어플리케이션 만을 위한 전용의 팩을 만들어 배포하는 것을 말한다. 이러한 (가상) 어플라이언스는 다음과 같은 조건과 특성을 갖는다.

  • 운영체제, 라이브러리를 포함하여 시스템의 구동 목적에 맞는 모든 구성요소가 설치/설정/최적화되어 있다.
  • 개념적으로, 지정된 목적 이외의 기능은 사용되지 않거나 접근할 수 없다. (OS의 다른 기능 등)
  • 기반 OS 지식이 없는 것으로 가정하여, 지정된 목적을 수행하기 위한 특화된 관리 기능을 제공한다.
  • 마치, OS+환경+어플리케이션이 아닌 단독 어플리케이션/시스템처럼 보일 수 있다.
  • 임베디드 OS를 기반으로 한 PMP, Kiosk Box를 떠올려보면 된다.

특히, 시스템 가상화 기술을 활용한 가상 어플라이언스는,

  • 이렇게 구성된 어플라이언스 이미지를 가상화 플랫폼 위에서 구동하게 된다.
  • 시스템 가상화를 통하여 추상화된 환경을 사용하기 때문에 하드웨어 호환성 이슈에 대한 고려가 줄어든다.
  • 호환되는 가상화 환경이 제공되면 쉽게 설치 및 운용이 가능하다.
  • 소프트웨어 배포에 있어서, 메뉴얼 위의 "Requirement" 항목이 단순해진다. (호환 가상 플랫폼만 필요)
  • 설치 메뉴얼, 설정 메뉴얼 등도 얇아진다.
  • 특히, TestDrive를 위한 영업전 엔지니어링 공수가 현저하게 줄어들게 되므로...
  • 독립 소프트웨어 공급자에겐 획기적인 소프트웨어 배포 방식이 될 수 있다.
  • 가상 어플라이언스 구성을 돕는 특화된 OS 배포 방식도 존재한다. (rPath, Turnkey Linux, JumpBox 등)

이러한 가상 어플라이언스라는 개념이 등장한 것은 이미 오래된 얘기지만, 앞서 이야기한 조건의 클라우드 컴퓨팅 시대에 와서 그 존재 가치와 의미가 한층 강해지고 있다.

그렇다면... Red Hat, Canonical 등의 리눅스 OS 공급자들이 취할 수 있는 현명한 행보는?


IDG - 캐노니컬, “IBM DB2를 리눅스 클라우드로”

캐노니컬이 IBM DB2 데이터베이스 소프트웨어의 인스턴스를 구동하는 가상 어플라이언스를 발표했다.
이번에 발표한 소프트웨어 어플라이언스는 IBM의 DB2 익스프레스-C를 포함하게 되는데, 이를 캐노니컬의 리눅스 기반 서버 배포판인 우분투 10.04 롱텀 서포트 서버 에디션 상에서 구동한다.
캐노니컬의 상용 서비스 담당 부사장 네일 레빈은 “우분투와 DB2 익스프레이스-C로 구성된 가상 클라우드 어플라이언스를 이용하면 퍼블릭 및 프라이빗 클라우드 환경에서 빠르고 쉽게 DB2를 구성할 수 있다”고 밝혔다.


어쩌자고... 넷북에서 Xen을 돌리겠다는 건데?

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

좀 우끼는 일이지만, 삼성전자의 넷북인 NC10에 우분투를 설치하고 Xen 가상화 환경을 구축하려는 과정의 이야기이다. 실은, 어제 저녁에 이 과정에 얽힌 긴 글을 쓰고 초안으로 올려뒀는데, 오늘 보니 사라져버렸네... ScribeFire로 글을 작성했는데, 이렇게 작성한 몇몇 글 중에서 사라져버린 것은 이 번이 처음이다. 누구 문제인지는 모르겠으나... 오늘 아침 tistory 접속 자체가 잘 안되었던 것을 감안하면, Firefox의 문제일지도... 어쨌든 한 번 쓴 글을 다시 쓰려니 글 쓸 생각은 잘  안나고 짜증은 잘 난다. (에라 그만둘까 싶지만서도...)

넷북, NC10과 Xen

본론으로 들어가서, 그렇다. 넷북에 Xen을 올리겠다는 것은 조금 우끼는 일이다. 본격적인 "경험담"에 들어가기 전에 잠깐 Xen와 NC10의 궁합에 대해서 생각해봤다.

NC10은 삼성전자의 첫번째 넷북인데, Intel의 Atom N270 프로세서를 사용하고 있다. CPU 사양을 잠깐 살펴보면,

flags           : fpu de tsc msr pae mce cx8 apic mtrr mca cmov pat
clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe constant_tsc
arch_perfmon pebs bts pni monitor ds_cpl est tm2 ssse3 xtpr lahf_lm

lm 도 없고, vmx 도 없다. 바꿔 말하면 x86-64 버전을 설치할 수도 없고 하드웨어 가상화 기능을 사용할 수도 없다는 뜻이다. 내 수중에 있는 기본 모델은 1GB의 RAM을 기본 장착한 상태인데 메모리 슬롯이 하나 밖에 없기 때문에 메모리 증설도 간단하지가 않다. 그런데 어째서 여기에 무슨 가상머신을 올리겠다고? (참고로 삼성전자의 다음 모델인 NC20은 VIA의 NANO칩을 쓴다고 한다. lm, vmx 다 된다던데? 솔깃~)

대답은 간단. 가벼우니까. 점점 무거운 Xnote를 어깨에 메고 다니는 것이 부담스럽게 느껴지던 차에, 이런 녀석이 옆에서 놀고 있는 꼴을 보니 써주지 않을 수가 있어야지. (그러고보니 고작 램 128MB, 256MB에서 가상머신 돌리면서 옆 팀의 512MB, 640MB 쓰는 동료들 부러워했던 때가 엇그제 같은데... 1.6GHz에 1GB 램이면 떡을 치는 사양 아니야?)

참고 : NC10의 주변 기기 사양

우분투/Xen 설치하기

어쨌든 NC10에 우분투를 설치하기 시작했다. 일단, 간단하게 기존에 설치하여 잘 돌아가고 있던 8.10 버전을 한 쪽 파티션에 복사, 다중 부팅을 하도록 했다. 그런데 이게 왠일, 시작부터 난관~! 8.10 버전의 우분투는 Xen의 Dom0를 지원하지 않는단다. 앞으로 계속 하지 않는다는 얘기도 있고(kvm을 밀고 있는 형국이므로 그럴만도 하다.) LTS에서만 될 거라는 얘기도 있고... 어쨌든 이번 작업의 목적은 "가상화"가 아니라 "Xen"이므로 간단한 결정을 했다. LTS이고 Xen 지원이 되는 8.04 버전으로 내리는 것. 결국, ubuntu 8.04 server i386 버전을 한 쪽 파티션에 깔았다.

8.10 버전의 Ubuntu를 NC10에 설치하는 것은 숨쉬는 것 만큼 간단했다. (물론, 약간의 수작업이 있어야 Wireless 등의 일부 기능을 사용할 수 있다. 본론은 아니므로 생략) 그런데 8.04는 다르더군. 설치를 한 참 진행하다가 죽어버리는 것이 아닌가! 결국 acpi=off 라는 부팅 옵션을 추가로 줌으로써 문제는 비껴 갈 수 있었다. (확인해보지는 않았지만 초기에 구워둔 CD를 사용하지 않고 8.04 버전의 최신 이미지인 8.04.2로 시도했다면 쉽게 갔을지도 모르겠다. 설치를 마친 후 최신 업데이트를 적용하고 커널도 최신으로 올리고 나니 acpi 관련 문제는 사라졌다.)

다음 순서로, ubuntu-xen-server 라는 이름의 메타 패키지를 통하여 xen 관련 패키지 설치를 마쳤다. 초반에 액땜을 해서 그런지 이 과정은 순조롭게 진행이 되었다. Xen커널 부팅을 확인한 후, 용도가 용도인지라 server 버전으로 설치했음에도 GUI가 필요했기 때문에 xorg 패키지와 간단한 wm인 openbox 패키지를 설치하였다. 그런데 이게 왠 일인가! Xen으로 부팅한 상태에서는 intel 온보드 그래픽카드를 사용하는 Xorg가 동작하지 않았다. 아니, 화면에 검게 변하면서 멈춰버렸다. (Xorg의 intel 드라이버 문제인지 kernel의 intel-agp 문제인지는 모르나, 아마도 정황으로 봐서 intel-agp와 Xen 사이에서 메모리 분쟁이 있는 것 같다.) "그래, vesa 쓰면 되지 뭐..."

Xorg, Xen, 그리고 945GME

쉽게 쉽게 안되면 피해가는 방식으로 여기까지 왔지만! 그런데 이게 뭔가?! vesa 모드로 Xorg를 띄우면 고작 800x600의 해상도로 뜨는 것이 아닌가! 안되는 것은 참아도 미운 것은 참을 수 없다! 그렇게 본격적인 삽질은 시작되었다.

시도해본 것들 :

  • intel 드라이버를 agp 없이 써보려는 시도 : 잘 안됨.
  • vesa 드라이버를 쓰면서 1024x600을 얻기 위해 xorg.conf 로 어떻게 해보려는 시도 : 잘 안됨
  • fbdev 드라이버를 쓸 각오를 하고 fbcon 띄워보려는 시도 : 헉! 왜 이런 시도를 한거야!

그렇다. 그런 시도를 한 것이 잘못이었다... 공식의 23-server 커널을 쓰면서 vga=0x314 옵션을 주면 800x600일 지언정 fbcon이 정상적으로 올라왔다. 그런데 23-xen을 올릴 때는 vga=... 도, video=... 도 먹질 않았다. xen이 원래 그런거니? 그럼 안되는데... 결국 커널 소스 패키지를 내려받아서 생애 최초의 deb 커스텀 빌드에 돌입! 몇 시간에 걸친 커널 컴파일을 시도했다.(이게 몇 년 만의 커널 컴파일인가? 기억도 나지 않는다!) 오라... 그랬더니, fbcon, vesafb를 built-in으로 했더니, xen으로 시작해도 fbcon이 잘 올라왔다. "이거야!". 여기서 멈춰도 되는데... 이놈의 결벽증은, 공식 커널에서도 왠지 설정을 잘 해주면 될 것 같은 생각이 자꾸 드는 것이다. 다시 커널을 공식 버전으로 복구하고 다양한 시도를 진행했다. 삽질의 끝은 어디인가? 포기! 아마도 뭔가 내가 모르는 것이 있는게다. 시간만 얼마가 지났는지...

그러던 길에 발견한 페이지(메일)가 바로 아래의 페이지 :

[Debian-eeepc-devel] 1024x600 console [was: Re: Video out toggling]

I have made some progress with this. The intelfb framebuffer driver doesn't support mode changing except for the VGA output. However, the uvesafb framebuffer driver does as long as the mode you want is known to the BIOS. But the Eee BIOS doesn't know about the panel's native resolution. This can be fixed using a utility called 915resolution, which hacks the RAM copy of the BIOS. But 915resolution doesn't know about the 945GME chip in the '901.

멍청한 비디오 바이오스의 모드 리포트를 소프트웨어적으로 고쳐주는 프로그램인데, NC10의 그래픽칩인 945GME 지원에 대한 패치가 있었던 것. (휘발성 수정이라서 Xorg를 위한 답은 되는데 FB를 위한 답은 되지 않는다. FB를 위한 grub 패치도 있는 것 같은데 시도하지는 않았다.) 그래... 쉽게 가는게 목표잖아. 커스텀 커널보다는 커스텀 유틸이 낫지. 결국, 생애 최초로 dpatch 를 써가며 커스텀 버전의 915resolution패키지를 빌드, 설치, 설정했다.

휴, 이제야 깔끔한 모습의 GUI를, Xen 환경에서 볼 수 있게 되었다. 이제부터 시작이다!

...

이게 얼마만의 삽질인가! 후훗~ 간만에 재밌기도 하고 :-)

(그런데 오랜만에 DE 가 아닌 WM-only로 쓰려니까... 좀 당황스러운데?


우분투 8.10에서 kvm을 이용한 가상서버 설정

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

개요

가물가물한 기억인데, kvm과의 첫 만남은 아마도 2007년 늦은 봄 정도였던 것 같다. 그 무렵이 드디어! kvm이 메인스트림 커널에 포함되고 그것을 기반으로 한 배포본이 등장하기 시작했던 무렵이기 때문이다. (요즘 가끔씩 깜짝 놀라기도 하는데, 되돌아보니 근 몇 년간 배포본에서 지원하지 않는 최신의 뭔가를 스스로 노력해서 써본 기억이 없다! 이럴수가!)

이런 저런 정황으로 봤을 때, 앞으로 리눅스 기반 가상화의 중심에 자리 잡을 것으로 예상했던 kvm의 첫 느낌은, (애써 감추려고 노력했지만) 사실 실망이었다. 너무 느리고 까다롭고... 하지만, 신생아라는 점을 고려하면, 그냥 "와~ 추카추카~ 이쁘네~~~ 잘키워~" 하고 호응해줄 수 밖에!

그로부터 채 1 년도 지나기 전에, kvm을 프로젝트에서 개발 플랫폼으로써 활용할 수 있었다는 것이, 기쁘지 않을 수 없다. :-) 그래서, 이번에는 내부 업무 시스템에 kvm을 적용해보기로 맘먹었다. (말이 길었는데,) 이 글은 그 과정에 대한 기록이다.

설치 및 설정 - 기본 설정

한 두 번도 아닌데, kvm은 설치할 때 마다 새로운 느낌이 있다. 아직 활발히 성장하고 있는 중이어서일까? 어쨌든, 이번 설치의 플랫폼은 우분투 8.10이다. 먼저, 다음 명령을 사용하여 kvm 관련 패키지를 설치했다.

$ sudo apt-get install ubuntu-virt-server

8.10 버전부터 새로 추가된 ubuntu-virt-server 패키지는 kvm, libvirt-bin, openssh-server 등의 세 패키지를 잡고 있는 가상화 서버 구성을 위한 메타패키지이다. 이와 함께 추가된 ubuntu-virt-mgmt 패키지는 virt-manager, python-vm-builder, virt-viewer 등의 관리용 패키지를 잡고 있는 메타 패키지인데, 이 번 작업 내용에는 포함되지 않았다. (현재 랩탑에서 사용중인 7.10 버전에서는 지원되지 않아서 일단 관련된 작업 및 시험은 보류했다.)

네트워킹 등의 일부 기능은 적절한 권한이 있어야 사용할 수 있다. 다음 명령을 이용하여 사용자를 libvirtd 그룹에 추가시켜준다. (물론, 다시 로그인을 해야 변경된 그룹 권한이 적용된다.)

$ sudo adduser `id -un` libvirtd

위의 과정이 정상적으로 수행되었다면, 다음과 같은 방식으로 작동 여부를 확인할 수 있다.

$ virsh -c qemu:///system list
Connecting to uri: qemu:///system
Id Name                 State
----------------------------------
$

가상머신 설치하기 - 가상 콘솔

이런! 가상머신을 설치하려고 보니 어쩔 수 없이 최소한의 클라이언트 기능을 설치할 수 밖에 없겠네... 애초의 계획은 클라이언트는 완전히 독립된 기계에서 운용하고 서버는 말 그대로 "가상화 기반"으로써만 활용하는 것이었다. 그런데... 랩탑 환경을 지금 바꾸기는 좀 무리가 있고 일단은 서버에 최소한의 관리 환경을 설치하도록 한다.

다음과 같은 방식으로 가상 콘솔 프로그램인 virt-viewer를 설치한다.

$ sudo apt-get install virt-viewer
[...]
다음 새 꾸러미를 설치할 것입니다:
  defoma fontconfig fontconfig-config hicolor-icon-theme libatk1.0-0
  libatk1.0-data libcairo2 libcups2 libdatrie0 libdrm2 libfontconfig1
  libfontenc1 libfreetype6 libgl1-mesa-glx libglu1-mesa libgtk-vnc-1.0-0
  libgtk2.0-0 libgtk2.0-bin libgtk2.0-common libgtkglext1 libice6 libjpeg62
  libpango1.0-0 libpango1.0-common libpixman-1-0 libpng12-0 libsm6
  libthai-data libthai0 libtiff4 libxcb-render-util0 libxcb-render0
  libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxfont1 libxft2 libxi6
  libxinerama1 libxmu6 libxrandr2 libxrender1 libxt6 libxxf86vm1 ttf-dejavu
  ttf-dejavu-core ttf-dejavu-extra virt-viewer x-ttcidfont-conf
  xfonts-encodings xfonts-utils
[...]

virt-viewer는 말 그대로 가상머신 뷰어이다. 이 프로그램을 통하여 가상머신의 가상 콘솔에 접속할 수 있고, OS 설치 등의 현장에서만 실행할 수 있는 작업을 진행할 수 있다.

이것으로 준비는 거의 끝난 것 같다.

가상머신 설치하기 - 가상머신 생성

virt-install 이나 우분투 고유의 python-vm-builder (예전의 ubuntu-vm-builder) 등의, 설치 전용 유틸리티를 활용하여 생성과 동시에 설치를 진행하는 방식도 있고, 또는 virt-manager에서 적절한 생성을 마친 후, 가상머신을 기동시키고 설치를 진행할 수도 있다. 예전에는 virt-manager 방식이나 virt-install 방식을 시도해봤었는데, virt-manager 방식의 경우, 설치 속도 문제로 고생을 좀 했던 기억이 있다. virt-install의 경우, 설치 후 재부팅이 필요한 환경 등에서 좀 모자라다는 느낌을 받았었던 것 같은데 역시 기억이 살짝 희미해져 있다. 더욱 중요한 것은, virt-install의 경우, 여러 디스크를 붙이고 싶은 경우 등의 상세한 작업을 할 수 없었던 것으로 기억한다. 그래서 이번에는 다른 방식을 도입해 보았다.

이름하여 가상머신 생성기. genxml.sh라는 스크립트를 급조했다. 처음에는 조금 보편적인 설정이 가능하도록 하려다가, 시간도 없고. 또한 그렇게 까지 할 필요성을 느끼지도 못해서 내 스타일의 가상머신을 만들어내는 정도로 목표 수준을 낮췄다. 다음은 스크립트의 내용이다.

#!/bin/sh

VM_ROOT=/box/vms

vm_name=mercury
vm_mem=1024
vm_cpu=2
vm_mac=`echo "52:54:00$(hexdump -e '/1 ":%02x"' -n 3 /dev/urandom)"`

echo -n "name of vm: "; read vm_name
vm_home=$VM_ROOT/$vm_name
mkdir -p $vm_home

echo -n "size of ram: "; read vm_mem
echo -n "number of cpus: "; read vm_cpu
echo -n "path of cdrom: "; read vm_cdrom
echo -n "disk size of sys: "; read size
qemu-img create $vm_home/$vm_name-sys.qcow2 -f qcow2 ${size}G
echo -n "disk size of tmp: "; read size
qemu-img create $vm_home/$vm_name-tmp.qcow2 -f qcow2 ${size}G
echo -n "disk size of opt: "; read size
qemu-img create $vm_home/$vm_name-opt.qcow2 -f qcow2 ${size}G

cat < $vm_name.xml >>EOF
<domain type="kvm">
  <name>$vm_name</name>
  <uuid>`uuidgen`</uuid>
  <memory>$(( $vm_mem * 1024 ))</memory>
  <currentmemory>$(( $vm_mem * 1024 ))</currentmemory>
  <vcpu>$vm_cpu</vcpu>
  <os>
    <type>hvm</type>
    <boot dev="hd"/>
  </os>
  </boot>
  <features>
    <acpi/>
  </features>
  <clock offset="utc" />
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type="file" device="disk">
      <source file="/$vm_home/$vm_name-sys.qcow2"/>
      <target dev="hda" bus="ide"/>
    </disk>
    <disk type="file" device="disk">
      <source file="/$vm_home/$vm_name-tmp.qcow2"/>
      <target dev="hdb" bus="ide"/>
    </disk>
    <disk type="file" device="disk">
      <source file="/$vm_home/$vm_name-opt.qcow2"/>
      <target dev="hdd" bus="ide"/>
    </disk>
    <disk type="file" device="cdrom">
      <source file="/$vm_cdrom"/>
      <target dev="hdc" bus="ide"/>
    </disk>
    <interface type="network">
      <mac address="$vm_mac"/>
      <source network="default"/>
    </interface>
    <input bus="ps2" type="mouse"/>
    <graphics type="vnc" port="-1" listen="127.0.0.1"/>
  </devices>
</domain>
EOF

이 스크립트를 이용하면 디스크 세 개를 달고 있는 가상머신 설정을 단숨에 만들어낼 수 있고 해당 디스크 이미지 역시 스크립트 내부에서 만들어낸다. 가상머신이 생성되는 위치는 스크립트 내부에 지정되어 있으며, 가상머신 이름을 이용한 디렉토리 안에 관련된 디스크 파일을 모아두는 방식으로 되어있다. 다만, 가상머신의 설정이 담긴 xml은 스크립트를 실행한 현재디렉토리에 떨어지게 되며, 다음 명령을 이용하여 이 xml 파일을 읽어들여 가상머신 설정을 완료하도록 할 수 있다.

$ ./genxml.sh
name of vm: u810si
size of ram: 512
number of cpus: 2
path of cdrom: /box/isos/ubuntu-8.10-server-i386.iso
disk size of sys: 6
Formatting '/box/vms/u810si/u810si-sys.qcow2', fmt=qcow2, size=6291456 kB
disk size of tmp: 1
Formatting '/box/vms/u810si/u810si-tmp.qcow2', fmt=qcow2, size=1048576 kB
disk size of opt: 2
Formatting '/box/vms/u810si/u810si-opt.qcow2', fmt=qcow2, size=2097152 kB
$ virsh -c qemu:///system define u810si.xml

이렇게, 우분투 8.10 서버용 i386 버전을 위한 가상머신 설정과 디스크 준비를 끝냈고, 마지막으로 virsh 쉘의 define 명령을 이용하여 만들어진 설정을 적용하였다. 이제 생성된 가상머신을 실행해보자.

$ virsh -c qemu:///system start u810si
Connecting to uri: qemu:///system

$ virt-viewer -c qemu:///system u810si

어라? 부팅에 실패했다! 왜냐하면, 기본 부팅 설정이 'hd' 즉, 하드디스크로 되어있기 때문. xml 파일을 열어서 다음의 내용을 수정해주고 다시 define 명령을 내려줘야 cdrom으로의 부팅이 가능하다. (그런데 왜 hd를 기본값으로 했을까? cdrom으로 바꿀까?)

9c9
<    <boot dev="hd">
---
>    <boot dev="cdrom">

어쨌든, cdrom으로 부팅을 하도록 설정하고, define 명령을 내려주고, 다시 start 명령을 내린 후 접속을 해보면 설치 화면이 떠 있는 것을 볼 수 있다. 이후의 과정은 일반적인 설치 과정이며, 최종적으로 재부팅. 어라? 그러면 다시 CD로 부팅할 줄 알았은데 그렇지가 않다. 그냥 부팅 오류가 발생했네? 이유는 모르겠지만 어차피 다시 부팅 설정을 바꿨어야 했으므로, 다음의 방식으로 설정을 바꿔주고 다시 시작해보자.

$ virsh -c qemu:///system destroy u810si
$ vi u810si.xml  (boot 부분 편집)
$ virsh -c qemu:///system define u810si.xml
$ virsh -c qemu:///system start u810si

휴, 이제 설치가 모두 끝났다.

아참, 이렇게 재부팅 하기 직전의 상태를 백업해 두는 것도 좋겠네.

가상머신 복제

이렇게 생성, 설정 및 설치를 마친 후, 늘 그렇듯이 설치 원본의 백업 및 복제 방안 마련에 들어간다. 백업은 간단한게, xml 파일과 디스크 이미지 파일을 tar 명령으로 묶어서 저장해두면 그 뿐. 그럼 복제는? 다음의 방식을 도입해봤다.

먼저, 간단한 스크립트를 하나 짰다. 이름은 copyvm.sh.

#!/bin/sh

src_vm=$1
dst_vm=$2

[ "$src_vm" = "" -o "$dst_vm" = "" ] && {
        echo "usage: copyvm.sh src dst"
        exit 1
}

[ ! -d "$src_vm" ] && { echo "source vm is not exist. abort!"; exit 1; }
[ -e "$dst_vm" ] && { echo "destination vm is already exist. abort!"; exit 1; }

vm_mac=`echo "52:54:00$(hexdump -e '/1 ":%02x"' -n 3 /dev/urandom)"`
vm_uuid=`uuidgen`

cp -a $src_vm $dst_vm
cd $dst_vm
rename "s/$src_vm/$dst_vm/" *
sed -i "s/$src_vm/$dst_vm/g" $dst_vm.xml
sed -i "s,<uuid>.*</uuid>,<uuid>$vm_uuid</uuid>," $dst_vm.xml
sed -i "s,<mac address=".*/">,<mac address="$vm_mac">," $dst_vm.xml

ls
cat $dst_vm.xml

내용은 간단하다. 인수 두 개를 받아서 첫 번째 인수로 받은 기존 VM을 두 번째 인수로 받은 이름의 새 VM으로 복사하고 설정 차원에서 중복되어서는 안되는 값만 바꿔주는 것이다.(MAC 주소와 UUID) 물론, OS 내부의 설정은 아직 변경하지 못한다. 불가능할 것 같지는 않은데... 현재로써는 복제 원본과 복제된 가상머신의 hostname, sshkey 등의 값이 같다는 한계가 있지만, 어쨌든 쓸만은 하다. 또한 복제 원본을 위한 템플릿 작업을 조금 한다면 더 좋겠지.

$ copyvm.sh u810si rails

이제 우분투 8.10 서버 i386 버전 기반의 rails 환경 복제 완료. 프로비저닝 시간? 한 10초?

새로운 가상머신을 시작시킨 후, 다음의 명령으로 필요한 추가 패키지를 설치해줬다.

$ sudo apt-get install vim
$ sudo apt-get install subversion
$ sudo apt-get install rails
$ sudo apt-get install rubygems

마치기

푸하하... 여기까지, 우분투 8.10 최신버전을 기반으로 한 가상 인프라 구축의 초기 단계와 가상머신 생성 및 복제 과정을 정리해봤다.

이것도 어플라이언스!? - "어드밴텍, ‘UCC 노래방 기기’ 일본특허 취득"

Clip to Evernote

블로그가 이사를 갔어요!

죄송합니다! 대부분의 글을 유지하고는 있으나 일부는 유지하지 못했습니다!
10초 이내에 새로 옮겨진 페이지로 이동할 겁니다.
원하시는 글이 아니면 전체 목록을 확인해주세요!
소용환의 생각저장소 / 아카이브

허허... 이사람들. :-)

스마트 쇼핑저널 버즈

어드밴텍테크놀로지스(대표 최영준)는 스티커 사진기처럼 생긴 부스 안에서 노래를 부르면 뮤직 비디오로 만들어 주는 ‘UCC 노래방기기’에 대해 일본 특허를 취득했다고 24일 밝혔다. 이 제품은 어드백텍의 일본 현지 투자사인 니혼브레인웨어, CSJ 글로벌과 공동으로 개발했으며 부스 형태로 제작한 간이 스튜디오의 카메라 앞에서 노래를 부르면 DVR녹화영상과 가상 배경영상을 합성시켜 짧은 시간에 맞춤형 뮤직비디오를 제작할 수 있는 시스템이다. 회사측은 한국과 달리 일본의 UCC문화가 아직 초보적인데다 노래방을 공개 오디션장으로 활용하는 일본 오디션 문화를 고려해 하반기부터 일본시장 공략에 나설 예정이다. 어드밴텍 최영준 대표는 “이번 UCC노래방 특허취득을 계기로 일본 UCC시장에 바람을 일으킬 계획”이라고 말했다.

어떤 모습일지 궁금하다. 한 번 꼭 봤으면 좋겠는데 기회가 있을까? :-)

부스 형태의 간이 스튜디오라... 오... 이 생각은 못해봤다. 좋은 아이디어군. 크로마키 합성에 있어서 배경에 대한 조명, 대상물의 측면에 대한 조명을 포함하여 조명의 조절과 카메라의 조정, 그리고 각각의 거리 조정 등이 괭장히 중요한 요소인데, 문제는 모든 "노래방"의 구조 조건이 서로 다르고 이로 인하여 실제의 설치시에 각 방에 따라 전문적인 노력이 필요하다는 점이다. 제품을 파는 입장에서 매우 어려운 숙제다. 이것을... "어플라이언스화"로 풀었군! :-)

짧은 시간에? 어떤 의미의 말인지 정확하게는 모르겠다. 아마 실시간 DVD 레코딩에 대한 얘기일 수도 있겠다. 이 부분은 어떻게 풀었을까? 내가 할 수 있었던 유일한 선택은 미리 정해진 구조와 조건에 맞춰 작성해둔 "프리셋"을 적용한 방식으로, 일단 자체 시험에서는 별다른 문제를 보이지 않았었다. 조금 다듬는다면 실시간 DVD 레코딩에 대한 독보적 기술이 될 수도 있을 것 같은데...

일본의 노래방. 조금 특이한게, 평일 낮시간인데도 불구하고 손님이 많았었다는 것. 얼핏 보기에 나이가 좀 들어보이는 손님들이 꽤나 보였었던 기억.

그리고 또 하나. 일본의 제품 팜플릿은 왜 그렇게 후진걸까? :-)