BigAdmin System Administration Portal
Solaris 10: Solaris 영역의 새로운 기능
Print-friendly VersionPrint-friendly Version

Solaris 영역

By Amy Rich

Solaris 10 운영 체제에는 Solaris 컨테이너 기술이라는, 시스템 리소스를 가상화하고 복수의 소프트웨어 영역 분할을 1개의 인스턴스 OS에서 사용할 수 있도록 하는 기능을 제공하고 있습니다. Solaris 컨테이너 기능은 Solaris 영역 분할 기술 및 리소스 관리 도구로 구성되어 있습니다. Solaris 영역 기능은 실행 중인 어플리케이션에 맞는 서로 다른 환경을 만드는 것을 가능하게 하며, 리소스 관리 체제는 CPU나 메모리와 같은 시스템 리소스의 할당, 관리, 계정 처리를 실현합니다.

Solaris 컨테이너의 기능은 하드웨어에 대한 의존성이 없으므로 Solaris 10 OS를 지원하는 것이라면 어느 시스템에서도 사용할 수 있습니다. Solaris 컨테이너 개발은 계속되고 있습니다. 때문에 앞으로 Solaris 10 OS의 구조는 유연성과 기능이 한층 더 강화될 전망입니다. 상세한 사항은 docs.sun.com에 있는 System Administration Guide: Solaris Containers -- Resource Management and Solaris Zones를 참조하십시오. BigAdmin의 Solaris Zones 페이지도 참고하십시오.


Solaris 영역 소프트웨어란

Solaris 영역 기능은 FreeBSD Jails와 같은 기본 개념에 근거하고 있습니다. FreeBSD Jails와 Solaris 영역 모두 실행 환경이 각자 다른 뷰는 서로 완전하게 격리되고, 어떤 환경에 있는 프로세스는 다른 환경에 있는 프로세스에 신호를 송출하지 못하며, 그 프로세스를 참조하는 것조차 불가능합니다. Jails와 영역에서는 1개의 인스턴스 운영 체제만 공유되기 때문에 CPU가 1개뿐인 시스템에서도 복수의 실행 환경이 공존할 수 있습니다.

영역에는 전역 영역과 비전역 영역 2종류가 있습니다. Solaris 영역 기능이 작용하는 시스템에는 1개의 전역 영역과 최대 8191개의 비전역 영역이 있습니다. 1대의 시스템에서 사용할 수 있는 최대 영역수는 그 시스템의 하드웨어 리소스에 의해 정해집니다. 각각의 영역에는 부팅 시에 ID를 할당할 수 있습니다. 전역 영역 ID는 항상 0이 되며 부팅 가능한 Solaris 커널은 전역 영역만큼 수용됩니다. 모든 장치, 파일 시스템, 다른 영역을 인식할 수 있는 것은 전역 영역뿐입니다. 또한 전역 영역은 비전역 영역 구성, 설치, 관리할 수 있는 유일한 영역이기도 합니다.

비전역 영역에는 전역 영역에 설치된 Solaris OS의 하위집합이 수용됩니다. 또한 전역 영역에 설치되지 않은 패키지도 넣을 수 있습니다. 각각의 비전역 영역에는 그 영역에 관련된 설치된 소프트웨어 패키지를 기록한 전용 패키지 데이터베이스가 있으며, 전역 영역과 다른 비전역 영역 간에 패키지 정보는 공유되지 않습니다. 비전역 영역에는 현지화된 설정 정보, 다른 영역 고유의 파일, 디렉토리도 포함되어 있습니다.


비전역 영역 구성

비전역 영역을 작성하려면 전역 영역의 관리자가 zonecfg 명령과 zoneadm 명령을 사용합니다. zonecfg 명령에서는 전역 영역의 템플릿을 기초로, 영역 구성 정보를 구축할 수 있습니다. zonecfg 명령과 zoneadm 명령의 상세한 설명은 BigAdmin에 있는 각 명령의매뉴얼 페이지를 참조하십시오. zonecfg 명령 구문은 다음과 같습니다.

zonecfg -z zonename
zonecfg -z zonename subcommand
zonecfg -z zonename -f command_file
zonecfg help 

zonecfg 명령의 하위 명령은 다음과 같습니다.

add <리소스 타입>
	(전역 범위)
add <등록정보 이름> <등록정보 값>
	(리소스 범위)
cancel
commit
create [-F] [ -b | -t <템플릿> ]
delete [-F]
end
exit [-F]
export [-f <출력 파일>]
help [commands] [syntax] [usage] [<명령 이름>]
info [<리소스 타입> [<등록정보 이름>=<등록정보 값>]*]
remove <리소스 타입> { <등록정보 이름>=<등록정보 값> }
	(전역 범위)
remove <등록정보 이름>=<등록정보 값>
	(리소스 범위)
revert [-F]
select <리소스 타입> { <등록정보 이름>=<등록정보 값> }
set <등록정보 이름>=<등록정보 값>
verify 

기본적인 영역을 설정하려면 zonecfg을 대화 모드로 실행하여 create 지시문과 set zonepath 지시문을 입력합니다. export 지시문을 사용하면 파일 저장에 적당한 형식으로 현재의 설정 정보를 출력할 수 있습니다. 이 시점에서는 변경하지 않기 때문에 export 지시문을 사용하면 다음과 같이 기본 설정 정보가 출력됩니다.

zonecfg -z myzone
zonecfg:myzone> create
zonecfg:myzone> export
create -b
set autoboot=false
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end 

이 단계에서 기본 템플릿을 변경합니다. 여기에서는 영역 myzone을 자동 부트로 설정하고, IP 주소 192.168.1.7과 네트워크 마스크 255.255.255.0(/24)을 물리 인터페이스 hme0에 할당하며, /opt/sfw를 읽기 전용 파일 시스템으로 장착하여 해당 패키지 메타데이터를 영역에 복사하겠습니다. 이 예에서는 쓰기 가능한 루프백 마운트를 사용하여 전역 영역 디렉토리 /data/usr/local이라는 이름으로 영역 myzone으로 보내고 있습니다.

zonecfg:myzone> set zonepath=/zones/myzone
zonecfg:myzone> set autoboot=true
zonecfg:myzone> add net
zonecfg:myzone:net> set address=192.168.1.7/24
zonecfg:myzone:net> set physical=hme0
zonecfg:myzone:net> end
zonecfg:myzone> add inherit-pkg-dir
zonecfg:myzone:inherit-pkg-dir> set dir=/opt/sfw
zonecfg:myzone:inherit-pkg-dir> end
zonecfg:myzone> add fs
zonecfg:myzone:fs> set dir=/usr/local
zonecfg:myzone:fs> set special=/data
zonecfg:myzone:fs> set type=lofs
zonecfg:myzone:fs> add options [nodevices]
zonecfg:myzone:fs> end
zonecfg:myzone> verify
zonecfg:myzone> export
create -b
set zonepath=/zones/myzone
set autoboot=true
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end
add inherit-pkg-dir
set dir=/opt/sfw
end
add fs
set dir=/usr/local
set special=/data
set type=lofs
add options nodevices
end
add net
set address=192.168.1.7/24
set physical=hme0
end
zonecfg:myzone> commit
zonecfg:myzone> export -f /tmp/myzone-zone.cfg
zonecfg:myzone> exit

이것으로 영역 설정이 완료되었으며 설정을 실행하기 위한 템플릿이 /tmp/myzone-zone.cfg에 저장되었습니다. 다음에 이 파일을 사용하면 같은 영역을 설정할 수 있습니다. 또한 파일 내용(IP 주소 등)을 조금 변경하여 zonecfg -z secondzone -f /tmp/myzone-zone.cfg 명령을 실행하면 이것과 같은 영역을 새롭게 구축할 수 있습니다. 다음에는 zoneadm 명령을 이용하여 영역을 설치해 보겠습니다. zoneadm 명령 구문은 다음과 같습니다.

zoneadm -z <영역 이름> <하위 명령> [<옵션>]
zoneadm [-z <영역 이름>] list [<옵션>]
zoneadm help 

zoneadm 명령의 하위 명령은 다음과 같습니다.

boot
halt
help [subcommand]
install
list [-cipv]
ready
reboot
uninstall [-F]
verify 

비전역 영역의 설치와 부팅

영역을 설치하려면 다음 명령만 입력하면 됩니다.

zoneadm -z myzone install
Preparing to install zone <myzone>.
Creating list of files to copy from the global zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <779> packages on the zone.
Initialized <779> packages on zone.
Successfully initialized zone <myzone>. 

다음에는 영역을 부팅하고 실행 환경을 시동하여 zlogin 명령으로 영역 콘솔에 로그인합니다. 영역 콘솔에서 로그아웃하려면 ~.을 입력합니다(물결표(~) 키와 도트(.) 키를 순서대로 누른다).

zoneadm -z myzone boot
zlogin -C myzone 

설치 후의 첫 부팅이라 내부적인 명명 규칙이 아무것도 없으므로 콘솔을 사용하여 필요한 정보를 입력하도록 요구 받습니다. 기본적으로 영역의 호스트 이름은 영역 이름과 같습니다. 호스트 이름을 지정할 경우 영역의 내부적인 이름 서비스(DNS, LDAP, 파일, NIS, NIS+ 등)에 근거하여 영역의 IPv4 주소 중 하나로 변환할 수 있는 것을 지정할 필요가 있습니다. 영역에서는 전역 영역과는 완전히 별개의 이름 서비스를 사용할 수 있습니다. 같은 이름 서비스를 사용했다고 해도 그 서비스는 전역 영역 서비스에서 완전히 독립하여 동작합니다.

영역에서는 sysidcfg를 사용하여 설정이 실행됩니다. 때문에 표시되는 화면은 sys-unconfig 실행 후나 OS의 초기 설치 때와 같습니다. 이 단계에서 필요한 정보 대부분은 영역을 처음 부팅하기 전에 영역의 /etc 디렉토리에 sysidcfg 파일을 작성해 둠으로써 미리 지정할 수 있습니다. 영역 설정을 해제할 수도 있습니다. 그럴 때는 sys-unconfig 명령을 사용합니다. 상세한 사항은 sysidtool(1M)sysidcfg(4)의 매뉴얼 페이지를 참조하십시오.

실행 중인 각 영역 상태는 다음 명령으로 전역 영역에서 참조할 수 있습니다.

zoneadm list -v
   ID NAME             STATUS         PATH
    0 global           running        /
    2 myzone           running        /zones/myzone 

이 출력으로 새로운 영역이 부팅되고 사용 가능한 상태가 되는 것을 확인할 수 있습니다. 비전역 영역에서 zoneadm list -v 명령을 실행한 경우에는 그 영역의 정보만 표시됩니다. 영역에서 zonename 명령을 실행하면 그 영역 이름이 표시됩니다.

새로 부팅된 영역은 새로 설치된 시스템과 비슷합니다. 아직 사용자 계정이 없으며, 시스템의 기본 설정을 제외하면 설정 정보도 없습니다. 따라서 새로운 영역을 실제로 사용하려면 우선 계정을 만들고 소프트웨어를 추가하여 영역 설정을 사용자 정의할 필요가 있습니다. 그 후 전역 영역 관리자는 -l 플래그가 지정된 zlogin 명령을 사용하여 통상 사용자로 비전역 영역에 로그인할 수 있습니다.

zlogin -l <사용자> <영역 이름> 

zlogin 명령을 전역 영역에서 비대화식 모드로 실행하여 지정한 영역에서 특정 명령을 실행시킬 수도 있습니다. 예를 들어 myzone에서 ls -al /를 실행하려면 관리자로서 전역 영역에서 다음 명령을 실행합니다.

zlogin myzone ls -al /
total 126
drwxr-xr-x  19 root  other  512 Mar  8 12:45 .
drwxr-xr-x  19 root  other  512 Mar  8 12:45 ..
lrwxrwxrwx   1 root  root     9 Mar  8 12:03 bin -> ./usr/bin
drwxr-xr-x   2 root  other  512 Mar  8 12:02 data
drwxr-xr-x  10 root  other 1024 Mar  8 12:45 dev
drwxr-xr-x  51 root  sys   3584 Mar  8 13:36 etc
drwxr-xr-x   2 root  sys    512 Feb 12 11:42 export
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 home
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 kernel
drwxr-xr-x   4 root  bin   4608 Feb 12 12:17 lib
drwxr-xr-x   2 root  sys    512 Mar  8 12:04 mnt
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 net
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 opt
drwxr-xr-x  43 root  sys   1536 Feb 12 11:52 platform
dr-xr-xr-x  64 root  root 30400 Mar  8 16:27 proc
drwxr-xr-x   2 root  sys   1024 Feb 12 11:48 sbin
drwxrwxrwt   4 root  sys    314 Mar  8 16:19 tmp
drwxr-xr-x  38 root  other 1024 Jul 18  2003 usr
drwxr-xr-x  33 root  sys    512 Mar  8 12:45 var 

비대화식 모드 zlogin은 비전역 영역을 관리하는 스크립트를 실행할 때 특히 도움이 됩니다. 이 명령에는 안전장치 모드(-S)도 있습니다. 이 모드를 사용하면 장해가 발생하여 로그인이 불가능해진 비전역 영역에 접속할 수 있습니다.

영역 myzone을 없애려면 그 영역을 정지시키고 zoneadm uninstall 명령으로 루트 파일 시스템을 제거하고 인수 delete를 붙여 zonecfg 명령을 실행합니다.

zlogin myzone shutdown -y -i0 -g0
zoneadm -z myzone uninstall -F
zonecfg -z myzone delete -F 

전역 영역에서 행하는 비전역 영역 정보 획득과 설정
zonecfg, zoneadm, zonename, zlogin을 사용 가능할 뿐만 아니라, 다양한 표준 시스템 명령도 전역 영역에서 영역 정보를 참조, 변경할 수 있도록 수정되었습니다.

프로세스 제어

ps 명령으로 서식 설정 옵션 -o zone-o zoneid가 추가되었습니다. 이러한 옵션을 사용하면 프로세스 영역 이름이나 영역 ID를 출력할 수 있습니다. 그 결과를 grep에 넘겨 영역 이름이나 ID를 검색시키면 특정 영역의 프로세스만 포함된 목록을 얻을 수 있습니다.

/bin/ps -efo user,zone,pid,ppid,c,stime,tty,time,comm |grep myzone
  root myzone 18386     1  0 12:45:24 ?      00:00 /usr/sbin/syslogd
  root myzone 18527     1  0 12:47:04 ?      00:00 /usr/lib/ssh/sshd
  root myzone 18630 18527  0 13:38:26 ?      00:03 /usr/lib/ssh/sshd
  root myzone 18300     1  0 12:45:22 ?      00:00 init
  root myzone 18512     1  0 12:45:33 ?      00:01 /usr/sfw/sbin/snmpd
  root myzone 18399     1  0 12:45:24 ?      00:00 /usr/sbin/cron
  root myzone 18638 18634  0 13:38:31 pts/2  00:00 -sh
  root myzone 18523 18300  0 12:47:03 ?      00:00 /usr/lib/saf/sac
  root myzone 18401     1  0 12:45:25 ?      00:00 /usr/lib/autofs/automountd
daemon myzone 18324     1  0 12:45:23 ?      00:00 /usr/lib/crypto/kcfd
  root myzone 18656 18638  0 13:44:26 pts/2  00:00 tcsh
daemon myzone 18349     1  0 12:45:23 ?      00:00 /usr/sbin/rpcbind
  root myzone 18400     1  0 12:45:24 ?      00:00 /usr/sbin/nscd
  root myzone 18402     1  0 12:45:25 ?      00:00 /usr/sbin/inetd
 smmsp myzone 18435     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18434     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18442     1  0 12:45:29 ?      00:00 /usr/lib/utmpd
  root myzone 18297     1  0 12:45:09 ?      00:00 zsched
  root myzone 18618 18300  0 13:37:58 zoneconsole \
                                             00:00 /usr/lib/saf/ttymon
  root myzone 18496     1  0 12:45:31 ?      00:00 /usr/dt/bin/dtlogin
  root myzone 18526 18523  0 12:47:03 ?      00:00 /usr/lib/saf/ttymon

많은 명령이 확장되어, 영역을 기준 삼아 출력을 필터 처리하거나 프로세스가 소속된 영역을 입력으로 지정할 수 있게 되었습니다. ipcs, pgrep, pkill, ptree, prstat 명령에서는 -z 플래그를 지정함으로써 영역을 지정할 수 있습니다. 또한 prstat에서는 -Z 플래그를 지정함으로써 모든 프로세스의 리스트뿐 아니라 영역 ID 별로 개요 정보를 출력할 수 있습니다. 이 기능은 어느 영역에서 리소스가 가장 많이 사용되고 있는지를 재빨리 확인하는 데에 도움이 됩니다. truss 프로그램도 영역 고유의 호출을 인식할 수 있도록 수정되었습니다. 다만 이 프로그램은 아직 영역을 인식하지 못합니다.

Solaris OS에서는 coreadm을 사용하여 코어 파일 이름의 패턴을 설정할 수 있습니다. 이 패턴에 영역 이름을 나타내는 %z가 포함되었습니다. 예를 들어 전역 영역에서 코어 파일 이름의 패턴을 /var/core/core.%f.%p.%z로 설정했을 경우, 영역 myzone에서 실행 중인 PID가 123인 foo 라는 이름의 프로그램 코어 이름은 /var/core/core.foo.123.myzone이 됩니다. 영역 관리자는 비전역 영역에서 coreadm을 실행하여 그 영역만의 설정을 제어할 수도 있습니다.

파일 시스템

전역 영역에서 -Z 플래그가 지정된 df를 실행하면 모든 영역의 장착을 표시할 수 있습니다. 이 플래그를 지정하지 않은 경우 현재 영역에 존재하는 장착만 표시됩니다.

df -Z
/                  (/dev/dsk/c0t1d0s0 ):      1881482 blocks   247016 files
/devices           (/devices          ):            0 blocks        0 files
/usr               (/dev/dsk/c0t1d0s3 ):       859490 blocks   271499 files
/proc              (proc              ):            0 blocks     1837 files
/etc/mnttab        (mnttab            ):            0 blocks        0 files
/dev/fd            (fd                ):            0 blocks        0 files
/var               (/dev/dsk/c0t1d0s4 ):      1889810 blocks   239530 files
/var/run           (swap              ):      2111168 blocks    15280 files
/tmp               (swap              ):      2111168 blocks    15280 files
/zones             (/dev/dsk/c0t1d0s5 ):     60468666 blocks  3681959 files
/zones/myzone/root/dev(/zones/myzone/dev  ): 60468666 blocks  3681959 files
/zones/myzone/root/lib(/lib               ):  1881482 blocks   247016 files
/zones/myzone/root/opt/sfw(/opt/sfw       ): 60468666 blocks  3681959 files
/zones/myzone/root/platform(/platform     ):  1881482 blocks   247016 files
/zones/myzone/root/sbin(/sbin             ):  1881482 blocks   247016 files
/zones/myzone/root/usr(/usr               ):   859490 blocks   271499 files
/zones/myzone/root/usr/local(/data        ):  1881482 blocks   247016 files
/zones/myzone/root/proc(proc              ):        0 blocks     1837 files
/zones/myzone/root/etc/mnttab(mnttab      ):        0 blocks        0 files
/zones/myzone/root/dev/fd(fd              ):        0 blocks        0 files
/zones/myzone/root/var/run(swap           ):  2111168 blocks    15280 files
/zones/myzone/root/tmp(swap               ):  2111168 blocks    15280 files

네트워킹

ifconfig 유틸리티가 수정되어 영역별로도 인터페이스 설정과 참조가 가능해졌습니다. 다만 인터페이스 플러밍이나 언플러밍은 전역 영역에서만 수행할 수 있습니다. 전역 영역에서 영역 내부에 IP 인터페이스를 포함하려면 다음 명령을 사용합니다.

ifconfig <인터페이스> zone {<이름> | <수치>}
ifconfig hme0:3 plumb 192.168.1.8 netmask 255.255.255.0 zone myzone up 

전역 영역에서 전역 영역에 한정된 IP 인터페이스 리스트를 출력하려면 ifconfig -aZ를 사용합니다. ifconfig -a를 사용하면 모든 영역의 네트워크 인터페이스가 출력됩니다.

ifconfig -a
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1 
         inet 192.168.1.7 netmask ff000000
lo0:1: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1
         zone myzone
         inet 127.0.0.1 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40
hme0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         zone myzone
         inet 192.168.1.7 netmask ffffff00 broadcast 192.168.1.255

ifconfig -aZ
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1
         inet 192.168.1.7 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40 

계정 처리

확장 계정(exacct)을 사용하면 각 영역을 개별적으로 설정할 수 있습니다. 레코드는 전역 영역의 계정 파일과 각 영역의 계정 파일 모두 기록됩니다. 태스크와 프로세스의 계정 레코드에는 zonename이라는 필드가 새로 추가됩니다. 이 필드를 보면 프로세스나 태스크가 어느 영역에 속해 있는지 알 수 있습니다.


참고 정보

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin
  
 
BigAdmin Upgrade Hub