가상화 - 윈디하나의 솔라나라

목차

가상화(Virtualization)란?

가상화란 컴퓨팅 리소스의 추상화를 통해 다수의 운영 체제 또는 애플리케이션 이미지가 하나의 물리적 서버를 공유하도록 함으로써 총소유비용을 극적으로 절감하고 관리성을 개선할 수 있게 하는 프로세스를 말한다.
오라클의 Virtualization Technology Center에 나와있었던 말이다. (내가 찾은것 중에서 가상화를 가장 잘 표현한 말이라 생각한다. 현재는 페이지가 삭제되어있다) 가상화를 쉽게 말하면 시스템 자원 추상화이고 이를 통해 비용 절감을 목적으로 한다. 목적이 비용 절감이기 때문에, 만약 가상화로 비용이 늘어난다면 하지 말아야 한다.

가상화 분류

구현에 의한 분류

※ 어떻게 가상화를 구현했느냐에 따라 아래와 같이 나누어진다. (아래의 내용중 일부는 위키피디아의 Vitualization항목에서 가져왔다. 위키피디아의 내용은 현재 수정된 상태다)
Docker, Kubernetes
특히 OS레벨 가상화는 요즘 가장 핫한 방식인데, Container 를 사용해 SaaS, PaaS를 제공하는 Docker 와, 수많은 Container 관리를 용이하게 해주는 Kubernetes가 그 중심에 있다.

전가상화, 반가상화

※ 전가상화와 반가상화의 중요한 차이는 하이퍼 바이저, OS, 하드웨어의 관계이다.

※ 솔라리스 10 최신 업데이트는 아래와 같이 지원한다.

※ Illumos 최신 업데이트는 KVM을 추가로 지원한다.

전가상화 vs 반가상화

구분은 이렇게 해놓았지만, 이론적으로는 이렇다는 이야기고, 현재 출시되어있는 반가상화/전가상화 솔루션들도 실제로는 성능상의 문제로 전가상화와 반가상화를 넘나들며 구현되고 있다.

또한 윈도를 포함한 대부분의 운영체제는 가상화 소프트웨어에 GuestOS로 들어가기 위해 이미 수정되어있으며, 부족한 부분은 Guest OS에 하이퍼바이저와 연동할 드라이버를 설치해 해결하고 있다. 필자는 전가상화, 반가상화 구분이 모호해진 이유가 VT-X, AMD-V 에서 제시한 Ring -1때문이라고 본다. Ring -1이 나온 이유중 하나가 Ring 0에서 실행하는 운영체제를 운영체제 수정 없이 반 가상화로 실행하기 위함이다.

하이퍼바이저

하이퍼바이저(Hypervisor)는 호스트컴퓨터와 게스트 OS를 연결해주는 가상화 플랫폼이다. 크게 Type 1과 Type 2로 나뉜다.
Type 1 하이퍼바이저는 부팅 가능하다는 것에서 OS와 비슷하지만 OS는 아니다. OS의 필수기능중 몇가지가 빠져있기 때문이다. 어플리케이션을 실행할 수 없다. (좀 더 복잡한 바이오스 정도로 보는것이 좋을지도 모르겠다)

가상화 지원을 위한 하드웨어 기술

전가상화반가상화를 사용할 때 하드웨어에서 성능 향상에 필요한 기능을 지원해주면 좀 더 빠르게 작동할 수 있다. 주로 리매핑 기술과 관련되어있다. 하드웨어 가상화 기술이 지원되는 장비와 하이퍼바이저와 게스트OS를 사용해, 가상화로 인한 성능 저하 비율을 1% 이하로 가져가는게 목표다. 필자가 생각에는 현재 가상화 기술로도 비용 절감을 실현할 수 있다고 생각한다. 아래는 현재 상용화된 가상화를 위한 하드웨어 기술들이다.

계통도

                    ┌──┐
                    │VM│
                    └─┬┘
              ┌───────┴───────┐

            시스템가상화          프로세스가상화

        ┌─────┴─────┐     ┌───┴───┐
                          │       │
      HW가상화      HW에뮬레이션  │       │
                  에뮬레이터
   ┌───┴───┐            다중시스템   동적변환기

Type 1   Type 2     ┌─────┬─┘   ┌───┼───┐
        VirtualBox
 ┌─┴─┐          멀티태스크  OS변환  ISA&ABI ISA&OS Language
                                      Java
반가상화 전가상화         │
 xVM
     ┌─┴─┐      OS가상화
                 Zone
   H/W지원 바이너리변환
    xVM

Solaris Zones

Zones

※ Zone의 상태 차트. [존을 생성후 인스톨 하고, 준비한 다음 부팅하면 존이 실행된다]라고 이해하면 된다. 각각의 과정을 모두 거쳐야 한다.
┌───────┐create┌────┐install  ┌─────┐ready┌─────┐    ┌────┐
│       │─────→│CON │────────→│     │────→│     │boot│    │
│NOT    │      │FIG │         │INST │     │READY│───→│RUNN│
│CREATED│←─────│URED│←────────│ALLED│←────│     │    │ING │
└───────┘delete└────┘uninstall└─────┘halt └─────┘    └────┘
                                 ↑         shutdown     │
                                 └──────────────────────┘
주) incomplete 상태는 install 하다가 실패한 경우이다.
root@wl ~ # zoneadm list -cv 1)
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
root@wl ~ # mkdir -m 700 /export/zone1 2)
root@wl ~ # zonecfg -z zone1 3)
zone1: 그런 영역은 구성되지 않음
새 영역 구성을 시작하려면 'create'을(를) 사용하십시오.
zonecfg:zone1> create
zonecfg:zone1> set zonepath=/export/zone1
zonecfg:zone1> set autoboot=true
zonecfg:zone1> add inherit-pkg-dir
zonecfg:zone1:inherit-pkg-dir> set dir=/opt
zonecfg:zone1:inherit-pkg-dir> end
zonecfg:zone1> add net
zonecfg:zone1:net> set address=192.168.0.20
zonecfg:zone1:net> set physical=vmxnet0
zonecfg:zone1:net> end
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit
root@wl ~ # cat /etc/zones/zone1.xml 4)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE zone PUBLIC "-//Sun Microsystems Inc//DTD Zones//EN" "file:///usr/share/lib/xml/dtd/zonecfg.dtd.1">
<!--
    DO NOT EDIT THIS FILE.  Use zonecfg(1M) instead.
-->
<zone name="zone1" zonepath="/export/zone1" autoboot="true">
  <inherited-pkg-dir directory="/lib"/>
  <inherited-pkg-dir directory="/platform"/>
  <inherited-pkg-dir directory="/sbin"/>
  <inherited-pkg-dir directory="/usr"/>
  <inherited-pkg-dir directory="/opt"/>
  <network address="192.168.0.20" physical="vmxnet0"/>
</zone>
root@wl ~ # zoneadm list -cv 4)
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - zone1            configured /export/zone1                  native   shared
root@wl ~ # zonecfg -z zone1 info 4)
zonename: zone1
zonepath: /export/zone1
brand: native
autoboot: true
bootargs:
pool:
limitpriv:
scheduling-class:
ip-type: shared
inherit-pkg-dir:
        dir: /lib
inherit-pkg-dir:
        dir: /platform
inherit-pkg-dir:
        dir: /sbin
inherit-pkg-dir:
        dir: /usr
inherit-pkg-dir:
        dir: /opt
net:
        address: 192.168.0.20
        physical: vmxnet0
root@wl ~ # zoneadm -z zone1 install 5)
Preparing to install zone <zone1>.
Creating list of files to copy from the global zone.
Copying <2383> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1089> packages on the zone.
Initializing package <1089> of <1089>: percent complete: 100%
Initialized <1089> packages on zone.
Zone <zone1> is initialized.
Installation of <1> packages was skipped.
The file </export/zone1/root/var/sadm/system/logs/install_log> contains a log of the zone installation.
root@wl ~ # zoneadm list -cv | grep zone1
   - zone1            installed  /export/zone1                  native   shared
root@wl ~ # zoneadm -z zone1 ready 6)
root@wl ~ # zoneadm list -cv | grep zone1
   1 zone1            ready      /export/zone1                  native   shared
root@wl ~ # zoneadm -z zone1 boot 7)
root@wl ~ # zoneadm list -cv | grep zone1
   1 zone1            running    /export/zone1                  native   shared
root@wl ~ # zlogin zone1 8)
[영역 'zone1' pts/3에 연결됨]
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
# Ctrl+D
['zone1' pts/3 영역에 대한 연결이 닫힘]
root@wl ~ # zlogin -C zone1 8)
[영역 'zone1' 콘솔에 연결됨]

zone1 console login:
zone1 console login: ~.
[영역 'zone1' 콘솔에 대한 연결이 닫힘]
root@wl ~ # zoneadm -z zone1 halt 9)
root@wl ~ # zoneadm list -cv | grep zone1
   - zone1            installed  /export/zone1                  native   shared
root@wl ~ # zoneadm -z zone1 uninstall 10)
zone1 영역을 uninstall하시겠습니까? (y/[n])? y
root@wl ~ # zoneadm list -cv | grep zone1
   - zone1            configured /export/zone1                  native   shared
root@wl ~ # zonecfg -z zone1 11)
zonecfg:zone1> delete
zone1 영역을 삭제하시겠습니까? (y/[n])? y
zonecfg:zone1> exit
root@wl ~ # zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
root@wl ~ #
1) ID값 0을 가진 global이란 존은 항상 생성되어있다. 솔라리스의 기본 존이다. 여기에 zone1 이라는 존을 생성할 것이다.
2) zone1을 생성하기 위한 디렉토리를 미리 만들어놓는다. 반드시 권한을 700으로 해야한다.
3) zone1의 설정 파일을 생성한다. [add net]뒤의 내용은 각자의 환경에 맞게 수정해야 한다.
4) /etc/zones/zone1.xml파일이 생성되었고, zone1이 설정되었음을 알 수 있다.
5) install 명령은 한참 걸리기도 하고 시스템에 디스크 부하를 많이 준다.
6) zone1을 ready상태로 전환한다.
7) zone1을 boot상태로 전환한다. ready상태가 아니고 installed상태라면 자동으로 ready로 전환후 boot상태로 다시 전환한다.
8) 로그인은 zlogin 프로그램을 이용한다. -C 옵션을 이용하면 '콘솔'에 로그인하는 것과 같아진다. -C 를 사용하면 다른 화면을 보게될 것이며 권한도 다르다. 콘솔에서 접속을 해제하려면 로그오프 한후 ~. 을 입력한다.
9) zone1에 로그인한 후에 halt명령을 수행하거나, 존에서 나온후 zoneadm -z zone1 halt명령을 주면 존이 종료되며 installed상태로 돌아간다. halt외에 reboot를 사용할 수도 있다.
10 언인스톨 한다.
11) 설정 파일을 삭제한다.

Branded Zones

LX존 지원
솔라리스에서는 Linux branded zone이 더이상 지원되지 않지만, illumOS 기반 운영체제(예를 들어 SmartOS 나 OmniOS)에서는 최신 버전의 Linux 배포판(예를 들어 Ubuntu 16.04)까지 잘 지원해준다.

리눅스 브랜디드 존의 경우 아래와 같이 세팅할 수 있다. 솔라리스 10 기준이며, 솔라리스 11에서는 지원되지 않는다.

root@wl ~ # wget http://www.solanara.net/downloads/centos39.distro 1)
root@wl ~ # cp centos39.distro /usr/lib/brand/lx/distros/
root@wl ~ # mkdir CentOSISO
root@wl ~ # cd CentOSISO
root@wl ~/CentOSISO # wget http://www.solanara.net/downloads/CentOS-3.9-i386-binDVD.iso 2)
root@wl ~/CentOSISO # digest -a md5 CentOS-3.9-i386-binDVD.iso
472540be581948a64c7cd052bac0d015
root@wl ~/CentOSISO # cd ..
root@wl ~ # mkdir -m 700 /export/lxzone 3)
root@wl ~ # zonecfg -z lxzone 4)
lxzone: 그런 영역은 구성되지 않음
새 영역 구성을 시작하려면 'create'을(를) 사용하십시오.
zonecfg:lxzone> create -t SUNWlx
zonecfg:lxzone> set zonepath=/export/lxzone
zonecfg:lxzone> set autoboot=true
zonecfg:lxzone> add net
zonecfg:lxzone:net> set address=192.168.0.30
zonecfg:lxzone:net> set physical=e1000g0
zonecfg:lxzone:net> end
zonecfg:lxzone> add capped-memory
zonecfg:lxzone:capped-memory> set locked=256m
zonecfg:lxzone:capped-memory> end
zonecfg:lxzone> exit
root@wl ~ # zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - lxzone           configured /export/lxzone                 lx       shared
root@wl ~ # zoneadm -z lxzone install -d ~/CentOSISO all 5)
Installing distribution 'CentOS 3.9'...
Installing cluster 'all'
Installing miniroot for zone 'lxzone'.
Attempting to locate 31 packages...

Installing 31 miniroot packages...

Setting up the initial lx brand environment.
System configuration modifications complete.
Duplicating miniroot; this may take a few minutes...
Booting zone miniroot...
Miniroot zone setup complete.

Performing full install for zone 'lxzone'.
Attempting to locate 956 packages...

Installing zone 'lxzone' from
  ISO "/root/CentOSISO/CentOS-3.9-i386-binDVD.iso".


Installing 956 packages; this may take several minutes...

Completing installation; this may take a few minutes.
Setting up the initial lx brand environment.
System configuration modifications complete.
Installation of CentOS 3.9 to zone
  'lxzone' completed 2009년 2월 13일 금요일 오전 11시 39분 21초.

Installation of zone 'lxzone' completed successfully.

Details saved to log file:
    "/export/lxzone/root/var/log/lxzone.install.10794.log"

root@wl ~ # zoneadm -z lxzone boot 6)
root@wl ~ # zlogin -C lxzone  7)
[영역 'lxzone' 콘솔에 연결됨]

CentOS release 3.9 (Final)
Kernel 2.4.21 on an i686

lxzone login: root

[root@lxzone root]# uname -a
Linux lxzone 2.4.21 BrandZ fake linux i686 i686 i386 GNU/Linux
[root@lxzone root]# vi /etc/sysconfig/network 8)
NETWORKING=yes
HOSTNAME=lxzone
[root@lxzone root]# vi /etc/hosts
192.168.0.30	lxzone
[root@lxzone root]# reboot
1) centos39.distro 파일을 받는다. 솔라리스 10에서는 CentOS 3.9를 정식지원하지 않는다. 필자가 CentOS 3 Release Notes u9를 참고해 직접 만들었다.
2) CentOS 3.9의 DVD이미지를 받는다. 현재 존재하는 대부분의 미러에서 받을 수 없기 때문에 솔라나라에 링크 걸어둔다.
3) lxzone 디렉토리를 만들어 놓는다. 존 파일은 여기에 생성할 것이다.
4) lxzone 을 설정한다. 생성시 create -t SUNWlx 명령을 준다는 것이 다르다.
5) BRAND가 lx라는것이 다르다. 인스톨시 CentOS패키지가 있는 tar.bz2파일의 위치를 -d 옵션을 이용해 넣어준다. 만약 CentOS 3.8의 ISO 파일들이 /root/CentOSISO 에 있다면 [zoneadm -z lxzone install -d /root/CentOSISO all] 처럼 실행시켜도 된다. tar파일보다는 오래 걸리지만 CentOS가 더 최신 버전인듯 하다. 필자는 이렇게 사용한다.
6) 존의 설치가 끝나면 존을 부팅시킨다.
7) 존의 콘솔에 연결하면 내용을 확인해볼 수 있다.
8) 네트워크를 활성화한 한다. network 파일을 수정하고 재시작 해주어야 한다.(존을 재시작 한다) hosts파일도 수정해야 한다.

Oracle VM VirtualBox

root@wl ~/src # wget http://download.virtualbox.org/virtualbox/4.3.10/VirtualBox-4.3.10-93012-SunOS.tar.gz
root@wl ~/src # mkdir VirtualBox
root@wl ~/src # cd VirtualBox
root@wl ~/src/VirtualBox # tar xvfz ../VirtualBox-4.3.10-93012-SunOS.tar.gz
root@wl ~/src/VirtualBox # pkgadd -d VirtualBox-4.3.10-SunOS-amd64-r93012.pkg

The following packages are available:
  1  SUNWvbox     Oracle VM VirtualBox
                  (i386) 4.3.10,REV=2014.03.26.20.08.93012

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: all

패키지 예 <SUNWvbox>(을)를 </root/src/VirtualBox/VirtualBox-4.3.10-SunOS-amd64-r93012.pkg>에서 처리 중

Oracle VM VirtualBox(i386) 4.3.10,REV=2014.03.26.20.08.93012
Oracle Corporation
## checkinstall 스크립트 실행
Checking package dependencies...
Done.
## 패키지 정보 처리 중
## 시스템 정보 처리 중
## 디스크 공간 요구 검증 중
## 이미 설치되어 있는 패키지와의 충돌 여부를 확인하고 있습니다.
## setuid/setgid 프로그램 점검

다음의 파일은 setuid/setgid 권한과 함께 설치되는 중입니다:
  /opt/VirtualBox/amd64/VBoxHeadless <setuid root>
  /opt/VirtualBox/amd64/VBoxNetAdpCtl <setuid root>
  /opt/VirtualBox/amd64/VBoxNetDHCP <setuid root>
  /opt/VirtualBox/amd64/VBoxNetNAT <setuid root>
  /opt/VirtualBox/amd64/VBoxSDL <setuid root>
  /opt/VirtualBox/amd64/VirtualBox <setuid root>

이 파일들을 setuid/setgid 파일로 설치하겠습니까? [y,n,?,q] y

이 패키지에는 설치 과정 중 수퍼유저 권한으로 실행될 스크립트가
있습니다.

<SUNWvbox>(을)를 계속 설치하겠습니까 [y,n,?] y

Oracle VM VirtualBox(을)를 <SUNWvbox>(으)로 설치

## 1째 (전체: 1) 부분 설치
/etc/hostname.vboxnet0
...
/var/svc/manifest/application/virtualbox/virtualbox-autostart.xml
[ 클래스 <none> 검증 ]
/opt/VirtualBox/VBoxAutostart <연결된 경로 이름>
/opt/VirtualBox/VBoxHeadless <연결된 경로 이름>
/opt/VirtualBox/VBoxISAExec <연결된 경로 이름>
/opt/VirtualBox/VBoxManage <연결된 경로 이름>
/opt/VirtualBox/VBoxSDL <연결된 경로 이름>
/opt/VirtualBox/VBoxSVC <연결된 경로 이름>
/opt/VirtualBox/VBoxTestOGL <연결된 경로 이름>
/opt/VirtualBox/VBoxZoneAccess <연결된 경로 이름>
/opt/VirtualBox/VirtualBox <연결된 경로 이름>
/opt/VirtualBox/vboxwebsrv <연결된 경로 이름>
/opt/VirtualBox/webtest <연결된 경로 이름>
[ 클래스 <manifest> 검증 ]
## 설치 후 스크립트 실행
Checking for older bits...
Installing new ones...
Detected Solaris 10 Version Generic_147441-01
Loading VirtualBox kernel modules...
   - Loaded: Host module
   - Loaded: NetAdapter module
   - Loaded: NetFilter (STREAMS) module
Configuring services...
   - Loaded: Zone access service
Installing MIME types and icons...
Installing Python bindings...
   - Skipped: Python 2.4 install is unusable
   - Installed: Bindings for Python 2.6
Updating the boot archive...

<SUNWvbox>(이)가 성공적으로 설치되었습니다.

root@wl ~/src/VirtualBox # VirtualBox 1)
1) VirtualBox를 실행한다. /opt/VirtualBox/UserManual.pdf 에 매뉴얼이 있다.

Oracle VM Server for SPARC

  1. Sparc 시스템에서 가상화를 위한 소프트웨어다. Sun Logical Domains 라고 불렸지만 오라클에 인수된 이후 Oracle VM Server for SPARC으로 이름이 변경되었다.
  2. sun4v(SUN Ultra Sparc T1 CPU 이상을 사용한 시스템, 정확하게는 썬의 CoolThreads 기술이 적용된 CPU를 사용하는 시스템), Solaris 10 u4 이후 부터 지원되는 가상화 방식이다
  3. 솔라리스 10이 설치된 상태에서 Oracle VM Server for SPARC을 받아 설치하면 된다고 한다.
  4. 해보지 않은 관계로 더이상 언급하는 건 무리다. ^O^
RSS ATOM XHTML 5 CSS3