Solaris 운영 체제의 Solaris 영역[1][2] 기능은 운영 체제 서비스를 가상화하여 어플리케이션의 호스팅과 실행에 적절하도록 격리시킨 안전한 환경을 제공하기 위해 사용하는 구분 기술입니다. 영역은 「Solaris 운영 체제 중 하나인 인스턴스 내에서 작성되는」가상화된 운영 체제 환경입니다. 2 종류의 영역이 있으며, 이는 전역 영역과 비전역 영역입니다.
전역 영역은 Solaris OS 설치의 완전한 기능을 포함하며, 시스템 하드웨어에 의해 실행할 수 있습니다. Solaris OS 설치는 시스템 하드웨어에 의해 시작되면 전역 영역입니다. 하나의 시스템에서 실행되는 전역 영역은 하나뿐입니다. 전역 영역의 관리자는 zonecfg(1M)와 zoneadm(1M)를 사용해 비전역 영역을 작성합니다. 전역 영역은 비전역 영역의 설치, 유지보수, 작동 및 파기를 관리합니다.
Solaris 영역 기능은 비전역 영역에서 실행되는 프로세스에 대해 서비스의 가상화와 이름 공간의 격리를 제공합니다. 비전역 영역의 프로세스는 다른 영역의 프로세스로부터 격리됩니다. 이와 같이 격리하면 비전역 영역에서 실행 중인 프로세스가 다른 영역에서 실행 중인 프로세스를 감시하고 영향을 주는 것을 막습니다. 비전역 영역에서 슈퍼유저 자격으로 실행되고 있는 프로세스인 경우라도 다른 영역에서의 활동을 감시하거나 작동할 수 없습니다.
또한 영역에 따라 어플리케이션을 배치하는 시스템의 물리적 속성으로부터 어플리케이션을 분리하는 추상화 계층도 제공됩니다. 이러한 속성의 예로는 물리적인 장치 경로나 네트워크 인터페이스 이름 등을 들 수 있습니다.
영역은 Solaris 10 릴리스를 지원하는 모든 시스템에서 사용할 수 있습니다. 1개의 물리 서버에서 영역의 상한 수는 8192입니다. 1개의 물리 서버 상에서 실제로 배치 가능한 영역의 수는 모든 영역에서 실행하고 있는 어플리케이션이 필요로 하는 리소스의 합계에 따라 다릅니다.
1.1 Solaris 영역의 기능:Solaris 컨테이너의 구성 요소
Solaris 컨테이너는 가상화된 실행 환경에서 CPU 등의 시스템 리소스를 소비하는 작업 부하에 대해 제한을 둡니다. Solaris 컨테이너는 Solaris 영역과 Solaris OS의 리소스 관리 기능으로 작업 부하에 대한 리소스 경계가 고정된 가상화 환경을 제공합니다.
작업 부하란 하나의 어플리케이션 또는 일련의 어플리케이션이 가지는 모든 프로세스의 집합입니다. 프로세스 엔티티에 함께 Solaris OS는 작업 부하를 특정하는 데 있어서 두 가지 기능, 프로젝트와 태스크를 추가합니다. Solaris의 리소스 관리 기능을 사용하지 않으면, Solaris OS는 시스템 상의 모든 활동에 동일하게 리소스에 대한 액세스를 제공함으로써 작업 부하의 요구에 부응합니다. Solaris OS의 리소스 관리 기능에 의해 시스템 관리자는 작업 부하를 개별적으로 취급하여 작업 부하가 받는 리소스의 양을 할당할 수 있습니다. 이 리소스 관리 기능으로 시스템 관리자는 다음 작업을 수행할 수 있습니다.
특정 리소스에 대한 액세스를 제한합니다.
우선순위를 바탕으로 작업 부하에 리소스를 제공합니다.
작업 부하를 상호 분리합니다.
작업 부하의 추상화는 Solaris 영역과 함께 동작하도록 확장되었습니다. 각 영역은 자체적인 project(4) 데이터베이스를 가집니다. 영역 폭의 제한이 리소스 제어에 추가됩니다. Solaris 영역과 Solaris 리소스 관리 기능이 제휴함으로써 시스템 관리자는 특정 리소스의 경계를 갖는 가상화된 동작 환경 영역을 작성할 수 있습니다.
2.0 Solaris 영역 소프트웨어의 이점
Solaris 영역의 주요 이점은 서버 통합에 의한 총소유비용(TCO)의 절약입니다. Solaris 영역 소프트웨어에 의해 다음의 사항이 가능합니다.
1대의 물리 서버에 있는 운영 체제 중 하나의 인스턴스를 통해 여러 개의 가상화 동작 환경인 영역을 만들 수 있습니다.
각각의 비전역 영역은 고유의 가상화된 ID, 파일 시스템, 장치, 네트워크 기능, 운영 체제 리소스 및 보안성을 가집니다.
각각의 비전역 영역은 전역 영역 이외의 다른 영역으로부터 격리됩니다.
어플리케이션의 장애는 격리되므로 비전역 영역 내에서 차단할 수 있습니다.
영역 간의 통신은 네트워크를 매개로 이루어집니다.
각 어플리케이션에서는 계속하여 Solaris ABI/API 가 사용되므로 어플리케이션을 옮기지 않아도 됩니다.
각각의 비전역 영역은 다른 영역에 영향을 주지 않고, 개별적으로 재부팅 및 종료할 수 있습니다.
CPU나 네트워크 대역폭 등의 시스템 리소스는 각 영역으로 파티션 분할할 수 있습니다. 관리자는 Solaris의 리소스 관리 메커니즘을 사용하여 세밀하게 리소스를 제어할 수 있습니다.
어플리케이션의 환경 관리는 비전역 영역의 관리자에게 위임할 수 있습니다.
3.0 영역의 작성과 관리
3.1 영역의 구성과 설치
전역 영역의 관리자는 zonecfg(1M), zoneadm(1M), 및 zlogin(1M)를 사용해 영역을 관리합니다. zonecfg(1M)는 각 비전역 영역에 대해 영역의 구성 파일 /etc/zones/my-zone.xml를 작성합니다. my-zone.xml는 my-zone의 구성을 기술합니다. zoneadm(1M)는 my-zone.xml를 입력으로 해, live_upgrade(5) 메커니즘을 사용하고, /etc/zones/my-zone.xml의 zonepath 필드로 지정한 장소에 시작 환경(BE)을 작성합니다. 게다가 비전역 영역의 시작 환경이 작성된 후에, zoneadm(1M) 하 zoneadmd(1M) demon 프로세스를 시작하고, 영역 상태의 변환을 관리합니다.
비전역 영역은 다음 중 하나의 상태를 취할 수 있습니다.
CONFIGURED
INCOMPLETE
INSTALLED
READY
RUNNING
SHUTTING_DOWN
DOWN
일반적으로 비전역 영역의 관리 프로세스 간 영역 상태는 다음과 같이 이동합니다. 구성 완료 -> 설치 완료 -> 준비 완료 -> 가동 중(그림 1 참조)
그림 1: 일반적인 비전역 영역의 관리 프로세스 상태
3.2 zoneadmd(1M)를 사용한 영역의 관리
zoneadmd(1M)는 비전역 영역의 가상 플랫폼을 작성해 그 상태 변화를 관리하는 시스템인 데몬입니다. 가상 플랫폼의 구성 요소에는 네트워크 인터페이스, 장치, zoneadmd(1M) 데몬 및 영역 콘솔이 있습니다. 시스템상의 각 비전역 영역에는 1개의 zoneadmd(1M) 프로세스가 존재합니다. zoneadmd(1M)의 기능은 다음과 같습니다.
클라이언트가 영역 상태의 변경을 요구하는 도어 서버를 구현합니다. 전역 영역의 관리자는 zonecfg(1M), zoneadm(1M), 및 zlogin(1M)를 사용해 영역을 관리합니다. 이러한 명령은 zoneadmd(1M)와 Solarislibdoor(3LIB)를 통해 통신합니다.
zoneadm(1M), zonecfg(1M), zlogin(1M)의 인터페이스로서 비전역 영역의 가상 플랫폼을 작성하고, 관리 및 파기를 실시합니다. 일반적인 비전역 영역을 관리할 때 zoneadmd(1M)는 다음과 같이 활동합니다.
커널의 영역 구조와 후크를 생성하여 초기화합니다.
/dev 디렉토리와 파일을 작성합니다.
파일 시스템을 마운트합니다. my-zone.xml에 있는 inherited-pkg-dir 디렉토리와 /dev는 루프백 파일 시스템으로서 마운트됩니다. vfstab, /proc, /system/contract에 있는 그 밖의 파일 시스템과 스왑 파일 시스템은 통상대로 마운트됩니다.
devfsadmd(1M)와 통신하고, 영역의 장치를 배치합니다.
영역의 논리 네트워크 인터페이스를 작성하여 구성합니다.
영역의 콘솔 장치를 인스턴스화합니다. 각 비전역 영역에 zcons(7D) 드라이버의 인스턴스가 1개 존재합니다. 드라이버의 각 인스턴스는 전역 영역과 비전역 영역의 쌍을 표현합니다.
리소스 관리, 풀 바인딩 및 세분화된 권한과 같은 프로세스 실행 시에 속성을 구성합니다.
영역의 init(1M) 프로세스를 시작합니다.
zsched (비전역 영역용 커널 더미 프로세스)를 생성합니다. 비전역 영역의 실행 중에 zsched는 init(1M)를 시작합니다.
3.3 영역 구성과 관리의 예
영역 명이 my-zone이고, IPv4 주소가 10.0.0.1의 영역 구성의 예를 나타냅니다.
global# zonecfg -z my-zone
zonecfg:my-zone> create
/* default is sparse root model, See section 3.4 for details*/
zonecfg:my-zone> set zonepath=/export/home/my-zone
zonecfg:my-zone> add net
zonecfg:my-zone:net> set address=10.0.0.1
zonecfg:my-zone:net> set physical=eri0
zonecfg:my-zone:net> end
zonecfg:my-zone> verify
zonecfg:my-zone> commit
zonecfg:my-zone> ^D
이 시점에서 영역 구성 파일 /etc/zones/my-zone.xml가 생성되고, 그 중에는 위와 같은 파라미터와 루프백이 마운트된 파일 시스템용의 몇 가지 inherited-pkg-dir 필드가 포함됩니다. 영역 구성 파일이 확립되면, 전역 영역의 관리자는 zoneadm(1M)를 사용해 영역 구성을 설치합니다.
global# zoneadm -z my-zone install
zoneadm(1M) install 명령이 완료되면, 시작 환경이 live_upgrade(5) 기능과 함께 생성됩니다. 영역의 시작은 표준 Solaris 환경의 시작과 비슷하지만, zoneadm(1M)가 사용되어 영역 실행 시 환경을 생성하는 점이 다릅니다.
global# zoneadm -z my-zone boot
이로써 영역을 실행합니다. 적절한 파일 시스템이 영역 내에 마운트되어 그 후 zoneadmd(1M)가 시작되는 등의 프로세스로 이어집니다. 설치 후, 영역이 처음 실행될 때에는 이름 지정 체계를 위한 내부 구성, 로케일 또는 표준 시간대, 루트 암호 등 어느 것도 존재하지 않습니다. 영역의 콘솔에 액세스하고 프롬프트에 응답하여 이와 같은 내용을 설정해야 합니다. 이것은 zlogin(1M) 명령을 사용하여 실행해야 합니다.
# zlogin -C my-zone
[영역 my-zone의 콘솔에 접속]
3.4 영역의 루트 파일 시스템
비전역 영역의 루트 파일 시스템을 구성하려면, 두 가지 방법이 있습니다. 그것은 「전체 루트 모델」와 「스파스 루트 모델」입니다.
전체 루트 모델에서는 Solaris 소프트웨어 패키지 중에 모든 필수 패키지와 선택한 임의의 패키지가 영역의 전용 파일의 시스템 설치를 위해 최대한 유연하게 구성할 수 있도록 되어 있습니다. 이 모델의 이점은 영역의 관리자가 영역의 파일 시스템 배치를 사용자 지정(커스터마이즈)할 수 있거나 (예를 들어, /usr/local를 작성), 번들이 아닌, 또는 타사(Third party)에서 만든 임의의 패키지를 추가할 수 있다는 점입니다. 이 모델의 불리한 점은 가상 메모리 시스템에 의해 실행 가능 파일 및 공유 라이브러리로부터 텍스트 세그먼트를 공유할 수 없어지고, 보다 많은 디스크 점유 공간(약 2G 바이트 추가)이 각 전역 영역에 필요하다는 점입니다. 전역 영역의 관리자는 zonecfg(1M)의 하위 명령 create -b를 사용하고, 전체 루트 모델로 영역을 작성합니다.(또는 inherited-pkg-dir 디렉토리를 my-zone.xml로부터 삭제합니다).
스파스 루트 모델은 루트 패키지의 하위 집합만을 설치하고, (pkginfo(4) 파라미터 SUNW_PKGTYPE를 root로 설정), 읽기 전용의 루프백 파일 시스템을 사용하여 다른 파일에 액세스할 개체 공유를 최적화합니다. 이는 디스크 없는 클라이언트의 구성 방법과 비슷하지만, 이 경우의 /usr와 다른 파일 시스템은 NFS로 네트워크를 통해 마운트됩니다. 이 모델의 기본값에서는 디렉토리 /lib, /platform, /sbin, 및 /usr는 루프백 파일 시스템으로서 마운트됩니다. 이 모델의 이점은 실행 가능 파일 및 공유 라이브러리를 효율적으로 공유하여 성능을 향상시킬 수 있다는 점으로, 영역 자체에서 필요한 디스크 점유 공간이 훨씬 적습니다. 스파스 루트 모델에서는 영역 자체에 약 100MB의 파일 시스템 공간이 필요할 뿐입니다.
4.0 영역의 안전성
각 비전역 영역은 보안 경계로 둘러싸여 있습니다. 보안 경계는 다음 항목에 의해 유지보수됩니다.
Solaris 10의 프로세스 권한 (privileges(5))의 채택
이름 공간 (예를 들어 /proc, /dev)의 격리 및
네트워크만을 사용한 영역 간 통신(IP 내 루프백)
4.1 프로세스 권한
종래의 UNIX 권한 모델은 모든 권한이 유효성 uid 0(root)과 관련이 있습니다. 이러한 여부를 가리기에는 많은 결점이 있습니다.
제한된 권한 집합을 지닌 일반 사용자의 기능을 확장할 수 없습니다.
각 권한 프로세스는 시스템을 완전하게 지배합니다. 시스템에 대한 전체 액세스권을 얻기 위해서 권한 프로세스를 이용할 수 있습니다.
Solaris 10 OS에 의한 이러한 결점은 프로세스 권한의 원칙[3]을 구현하는 것입니다. 이는 작업의 실행에 필요 이상의 권한을 주지 않도록 사용자를 제한합니다. 프로세스 권한은 권한 집합에 의해서 Solaris의 프로세스 모델을 확장합니다. 각 권한 집합에는 권한이 없거나 1 이상의 권한이 포함됩니다. 각 프로세스는 4개의 권한 집합을 가집니다. 권한 집합의 1개는 실효 권한 집합이며, 프로세스가 특정 권한을 사용할 수 있을지를 결정합니다.
4개의 권한 집합은 다음과 같습니다.
실효 권한 집합 -- 프로그램 실행 시에 사용하는 권한의 집합입니다. 권한을 실효로 하려면 그것이 허용 권한 집합에도 있어야 합니다.
허용 권한 집합 -- 사용할 수 있는 권한의 집합입니다. 프로그램은 상속 또는 할당을 통해 권한을 사용할 수 있습니다. 허용 권한 집합은 상속 가능한 권한 집합의 하위 집합입니다. 허용 권한 집합으로부터 권한을 삭제할 수 있지만, 추가할 수는 없습니다. 권한을 인식하는 프로그램은 그 프로그램이 전혀 사용할 수 없는 권한을 프로그램의 허용 권한 집합에서 삭제합니다. 이 방법은 잘못 할당하거나 잘못 상속된 권한을 프로그램의 사용을 막습니다.
상속 가능한 권한 집합 -- 프로세스가 상위 프로세스로부터 상속할 수 있는 권한의 집합입니다. 자식 프로세스가 실제로 어느 권한을 상속할지는 프로세스의 시작 방법과 자식 프로세스가 허용 권한 집합에 의해 제어됩니다. 사용자에 대해서는 상속 가능한 권한 집합은 기본 권한 집합을 포함합니다. fork(2)에 대한 호출로 시작된 프로그램은 상위 프로세스로부터 모든 권한을 상속해 프로세스에 새로운 권한을 추가할 수 있습니다. exec(2)에 대한 호출로 개시된 프로그램은 상위 프로세스로부터 모든 권한을 상속합니다. 다만, 이러한 프로그램은 새로운 권한을 1개도 추가할 수 없습니다. 즉, 그 프로그램의 허용 권한 집합은 자신의 상속 가능한 권한 집합과 같습니다. 상속 가능한 권한 집합은 제한 권한 집합의 값으로 제한됩니다.
제한 권한 집합 -- 해당 프로세스와 자손이 상속할 수 있는 권한의 상한입니다. 기본값에서의 제한 권한 집합은 전체 권한입니다. 따라서 권한이 할당된 프로그램을 포함한 프로파일이 사용자에게 할당된 경우, 할당된 권한은 그 사용자의 제한 권한 집합의 범위 내에 있으므로 사용자는 해당 프로그램을 실행할 수 있습니다. 허용 권한 집합 내에 있는 모든 권한이 실행 시에 사용되는 것은 아닙니다. 제한 권한 집합은 exec(2)의 실행 시에만 적용되므로 프로세스는 exec(2)의 권한을 그 시점까지 사용하고 있어도 삭제할 수 있습니다. 허용 권한 집합은 상속 가능한 권한 집합의 하위 집합입니다. 상속 가능한 권한 집합은 제한 권한 집합의 값으로 제한됩니다.
exec(2) 권한 집합의 변환 규칙은 다음과 같습니다.
각 정보의 의미는 다음과 같습니다.
C.E - parent process의 실효 권한 집합
C.P - parent process의 허용 권한 집합
C.I - parent process의 상속 가능한 권한 집합
C.L - parent process의 제한 권한 집합
C'.E - child process의 실효 권한 집합
C'.P - child process의 허용 권한 집합
C'.I - child process의 상속 가능한 권한 집합
C'.L - child process의 제한 권한 집합
모든 커널 보안 정책 확인은 권한만을 사용해 실행됩니다.
커널은 사용자가 시스템을 사용하는 데 필요한 기본 권한 집합을 제공합니다. 로그인 시에 각 사용자는 기본 권한 집합을 상속합니다. 기본 권한 집합은, ppriv(1)를 사용해 변경할 수 있습니다. 제한 집합은 통상, 모든 권한 집합입니다. 현재, 48개의 권한이 권한 집합에 정의되어 있습니다. privileges(5)는 이러한 권한과 그 정의를 일람으로 나타내고 있습니다. 권한을 인식하는 프로세스의 경우, 그 실효 권한 집합이 프로세스의 동작을 결정합니다.
프로세스의 권한 인식 상태(PAS)가 권한을 인식하지 않는(NPA) 경우는 해당 권한 모델은 프로세스에 의해 무시될 수 있습니다. 프로세스의 권한 상태는 확장되어 PAS는 다음의 값을 받을 수 있습니다.
권한을 인식(PA) -- 실효 UID를 완전하게 무시
권한을 인식하지 않는(NPA) -- 통상의 프로세스와 거의 같은 동작
프로세스는 setpflags(2)를 사용하고 NPA가 되려고 할 수 있습니다. PA가 상속되지 않는 경우, 커널은 exec(2)의 PA를 삭제하려고 합니다.
4.2 영역의 프로세스 권한
비전역 영역에서 실행하고 있는 프로세스는 모두 권한을 인식합니다. 이는 프로세스가 생성되었을 때에 할당되었던 권한 집합에 의해 비전역 영역의 모든 프로세스가 제약을 받는 것을 의미합니다. 시스템이 비전역 영역을 작성하면 커널의 더미 프로세스, zsched가 영역의 루트 프로세스로서 생성됩니다. 비전역 영역 내의 모든 프로세스는 zsched의 자손입니다. zsched의 상속 가능한 권한 집합은 영역 내 프로세스의 실효 권한 집합을 결정합니다.
다음의 리스트는 비전역 영역 내 프로세스가 가지는 권한을 나타내고 있습니다. 비전역 영역 내 프로세스의 제한 권한 때문에 오류를 돌려주는 시스템이 있을지도 모릅니다. 대부분의 경우, 권한을 가지는 프로세스에 대해 EPERM를 돌려주어집니다. PRIV_CPC_CPU 또는 PRIV_NET_RAWACCESS를 확인하는 시스템 호출 중에는 EACCESS를 돌려주는 것도 있습니다. 6.0절에서는 비전역 영역에서 호출되면 오류를 돌려줄 가능성이 있는 시스템 호출, 라이브러리 기능 및 명령에 대해 요약합니다.
Solaris 영역은 시스템의 동작 환경을 가상화하는 강고한 파티션 분할 솔루션을 프로세스에 제공합니다. 비전역 영역 내의 프로세스는 작업이 다른 영역의 프로세스와 격리되어 있으면서 동작 환경에 필요한 리소스와 서비스에 액세스합니다. 여기에는 다음의 것이 포함됩니다.
네트워크 인터페이스
파일 시스템
프로세스 간 통신(IPC)
장치
프로세스
리소스 관리 기능
패키징 데이터베이스
5.1 네트워크 기능
각 비전역 영역에는 고유의 논리 네트워크와 루프백 인터페이스가 있습니다. 상위층 스트림과 논리 인터페이스 간의 결합은 제한되며, 스트림을 확립할 수 있는 것은 동일 영역 내의 논리 인터페이스에 대한 결합뿐입니다. 마찬가지로 논리 인터페이스로부터 패킷을 건네줄 수 있는 것은 논리 인터페이스와 같은 영역 내 상위층 스트림에 대해서 뿐입니다.
루프백 주소에 대한 결합은 영역 내로 한정되지만, 한 가지 예외가 있습니다. 그것은 어느 영역 내의 스트림이 다른 영역 내 인터페이스의 IP 주소에 액세스하려고 하는 경우입니다.
또한 다음의 네트워크 가상화와 제한이 비전역 영역에 적용됩니다.
영역이 사용하는 대역폭의 제어가 가능합니다. 이것은 번들된 IPQoS 기능을 사용해 특정 영역에 대해 구성된 각 IP 주소의 대역폭 파라미터를 구성해 제어할 수 있습니다.
IPQoS 와 IPSec의 구성은, 전역 영역 내에서만 가능합니다. 영역 특유의 구성은, 영역의 IP 주소를 구성으로 지정하는 것으로 작성할 수 있습니다.
트랜스포트 층에서 하위층에 대한 raw 액세스(예를 들어, 링크층에 대한 IP, ARP 및 DLPI)는 비전역 영역에서는 허용되지 않습니다. 따라서 DLPI를 사용해 직접 링크층(NIC 장치 드라이버)과 통신하면 오류가 됩니다. snoop(1M)는 DLPI를 사용해 인터페이스 드라이버에 직접 액세스하므로 비전역 영역에서는 동작하지 않습니다.
다음의 네트워크 기능은 전역 영역의 관리자만을 구성할 수 있는 시스템 전체의 기능으로 남습니다.
루팅
IP 다중 경로(IPMP)
이동식 IP
DHCP 클라이언트
Network Cache and Accelerator(NCA)
/etc/system 및 ndd(1M)를 사용한 네트워크 튜닝
IP 필터
5.2 파일 시스템
각 비전역 영역은 고유의 파일 시스템 이름 공간을 가지고 있고, 파일 시스템은 영역 간에 공유할 수 있습니다. 전역 영역의 파일 시스템은 lofs(7FS)를 사용해 영역에 루프백 마운트됩니다. lofs, autofs, tmpfs, mntfs, ctfs, procfs, 및 NFS와 함께 클라이언트를 비전역 영역 내 로컬에 마운트할 수 있습니다.
전역 영역의 디렉토리, 예를 들어 /usr/local를 비전역 영역에서 보이지 않도록 하기 위해 전역 영역의 관리자는 전역 영역에 빈 디렉토리를 작성해 대상의 디렉토리의 맨 위의 비전역 영역에 대해 루프백 마운트를 구성할 수 있습니다.
global# zonecfg -z my-zone
zonecfg:my-zone> add fs
zonecfg:my-zone:fs> set dir=/usr/local
zonecfg:my-zone:fs> set special=/empty
zonecfg:my-zone:fs> set type=lofs
zonecfg:my-zone:fs> add options ro
zonecfg:my-zone:fs> end
파일 시스템을 비전역 영역에 추가하는 방법은 몇 가지 있습니다.
LOFS 마운트를 사용하는 경우
global# newfs /dev/rdsk/c1t0d0s0
global# mount /dev/dsk/c1t0d0s0 /mystuff
global# zonecfg -z my-zone
zonecfg:my-zone> add fs
zonecfg:my-zone:fs> set dir=/usr/mystuff
zonecfg:my-zone:fs> set special=/mystuff
zonecfg:my-zone:fs> set type=lofs
zonecfg:my-zone:fs> end
UFS 마운트를 사용하는 경우
global# newfs /dev/rdsk/c1t0d0s0
global# zonecfg -z my-zone
zonecfg:my-zone> add fs
zonecfg:my-zone:fs> set dir=/usr/mystuff
zonecfg:my-zone:fs> set special=/dev/dsk/c1t0d0s0
zonecfg:my-zone:fs> set raw=/dev/rdsk/c1t0d0s0
zonecfg:my-zone:fs> set type=ufs
zonecfg:my-zone:fs> end
장치 노드를 내보내 비전역 영역에서 마운트하는 경우
global# zonecfg -z my-zone
zonecfg:my-zone> add device
zonecfg:my-zone:device> set match=/dev/rdsk/c1t0d0s0
zonecfg:my-zone:fs> end
zonecfg:my-zone> add device
zonecfg:my-zone:device> set match=/dev/dsk/c1t0d0s0
zonecfg:my-zone:fs> end
my-zone# newfs /dev/rdsk/c1t0d0s0
my-zone# mount /dev/dsk/c1t0d0s0 /usr/mystuff
전역 영역에서 UFS를 직접 마운트하는 경우
# mount /dev/dsk/c1t0d0s0 /export/home/my-zone/root/usr/mystuff
혼재시켜 LOFI를 추가하는 경우
global# newfs /dev/rdsk/c1t0d0s0
global# mount /dev/dsk/c1t0d0s0 /mystuff
global# mkfile 1g /mystuff/myfile
global# lofiadm -a /mystuff/myfile
global# zonecfg -z my-zone
zonecfg:my-zone> add device
zonecfg:my-zone:device> set match=/dev/rlofi/1
zonecfg:my-zone:fs> end
zonecfg:my-zone> add device
zonecfg:my-zone:device> set match=/dev/lofi/1
zonecfg:my-zone:fs> end
5.3 프로세스 간 통신(IPC)
Solaris 영역의 기본 설계 원리에서는 비전역 영역 내 프로세스는 같은 영역 내외의 프로세스와 IPC를 사용해야만 통신할 수 있습니다. 파이프(fifofs를 사용), 스트림(namefs를 사용), UNIX 도메인 소켓(sockfs를 사용), 및 POSIX IPC 등 파일 시스템 기반의 IPC인 경우, 영역의 독자적인 파일 시스템의 이름 공간에 의해 프로세스 간 통신은 영역 내 한정이 보증됩니다.
Solaris door나 System V IPC와 같은 IPC는 영역 ID를 통신 개체에 접속하므로 비전역 영역 내에서 실행하고 있는 프로세스는 같은 영역인 만큼 관련 개체에 액세스하거나 제어할 수 있습니다.
5.4 장치
일반적으로 장치는 시스템 내 공유 리소스입니다. 따라서 비전역 영역에서의 장치 사용은 시스템 보안성을 해치지 않도록 일련의 제약이 필요합니다.
시스템 데이터를 표시하는 장치는 전역 영역에서만 사용 가능합니다. 이러한 장치의 예로서 dtrace(7D), kmem(7D), ksyms(7D), kmdb(7D), trapstat(1M), lockstat(7D) 등이 있습니다.
/dev 이름 공간은 /devices 안의 물리적 경로의 기호 연결(논리적 경로)로 구성됩니다. /devices 이름 공간은 전역 영역 내에서만 사용 가능하고, 드라이버에 의해 생성된 접속이 끝난 장치 인스턴스의 현재 상태를 나타냅니다. 논리적 경로 /dev 만은 비전역 영역으로 볼 수 있습니다.
비전역 영역의 관리 시, zoneadmd(1M)는 영역 특유의 /dev를 생성한 후 /dev 디렉토리를 비전역 영역의 루트 아래에 루프백 마운트합니다. 전역 영역의 관리자는 zonecfg(1M)를 사용해 특정의 영역에 존재하는 장치를 지정합니다. 비전역 영역 내 /dev 항목의 수는 전역 영역 내보다 큰 폭으로 적어집니다.
영역의 관리자는 장치의 액세스권을 변경할 수 있지만, 새로운 항목을 작성할 수 없습니다.
장치의 수는 시스템 전체의 자산입니다. 특정의 장치 번호에 매핑하는 특수 파일을 작성하는 시스템 호출(mknod(2) 등)은 오류가 됩니다.
Solaris Volume Manager의 메타 장치를 비전역 영역에 구성할 수 없습니다. 그러나 전역 영역의 관리자는 메타 장치를 국소 영역으로 내보낼 수 있습니다.
전역 영역의 관리자는 zonecfg(1M)의 하위 명령 add device을 사용하여 비전역 영역 내에 추가 장치를 포함시킬 수 있습니다. 예를 들어, /dev/dsk/c1t1d0s0 장치 노드를 비전역 영역에 추가하려면 관리자는 다음의 행을 추가합니다.
zonecfg:my-zone> add device
zonecfg:my-zone:device> set match=/dev/dsk/c1t1d0s0
zonecfg:my-zone:device> end
하드웨어를 구성하거나 /dev 항목을 변경하는 유틸리티는 비전역 영역에서는 동작하지 않습니다. 그러한 유틸리티에는 다음과 같은 것이 있습니다.
add_drv(1M)/rem_drv(1M)
modload(1M)/modunload(1M)
autopush(1M)
cfgadm(1M)
devfsadm(1M),drvconfig(1M), disks(1M), tapes(1M), ports(1M), 및 devlinks(1M)
영역 콘솔 -- 영역 콘솔, /dev/zconsole는 zcons(7D) 드라이버에 의해 구현됩니다. zcons 드라이버의 각 인스턴스는 전역 영역과 비전역 영역의 쌍을 나타냅니다. 드라이버는 전역 영역에서 비전역 영역에 대한 입출력 및 그 반대의 채널이 됩니다. /dev/console, /dev/msglog, /dev/syscon, /dev/sysmsg, 및 /dev/systty는 모두 /dev/zconsole의 기호 연결입니다.
5.5 프로세스
영역 설계의 기본 원리 중 하나는 비전역 영역 내 프로세스는 다른 영역에서 실행 중인 프로세스의 활동을 참조하거나 영향을 주어서는 안 된다는 것입니다. 각 프로세스는 1개의 영역과 관련 지을 수 있습니다. 프로세스의 가시성 제한은 proc(4) 액세스와 그 관련 유틸리티 proc(1)에 의해 표시된 프로세스 ID를 제한함으로써 가능합니다.
비전역 영역에서는 proc(4) 파일 시스템은 해당 영역의 프로세스만을 표시합니다. 전역 영역 내 proc 파일 시스템은 시스템으로 실행하고 있는 모든 프로세스를 표시하는데, 여기에는 모든 비전역 영역의 프로세스도 포함됩니다.
다른 영역 내의 프로세스에 신호를 보내거나 제어하려고 하면 (예를 들어, /proc를 사용) 오류 코드 또는 EPERM가 아니라, ESRCH (또는 proc(4) 액세스에 대한 ENOENT)가 반환됩니다. PRIV_PROC_ZONE 권한을 가지고 있는 전역 영역 내 프로세스만이 다른 영역의 프로세스에 신호를 보내거나 제어할 수 있습니다.
5.6 리소스 관리
Solaris의 리소스 관리에 의해 시스템 관리자는 「작업 부하」의 「리소스」이용율을 제어할 수 있습니다. Solaris OS 내의 작업 부하는 프로젝트, 태스크 및 프로세스 엔티티와 관련되어 있습니다. 종래의 프로세스별 리소스 제어는 태스크 및 프로젝트 엔티티에까지 확장되었습니다.
사용자나 그룹과 같은 프로젝트는 관련 작업에 대한 네트워크 전체의 관리용 식별자입니다. 태스크는 프로세스의 그룹을, 작업 부하의 구성 요소를 나타내 관리하기 쉬운 엔티티에 정리합니다.
시스템 관리자는 prctl(1)를 사용하여 실행 중인 프로세스, 태스크 및 프로젝트에 대한 리소스 제어를 취득 또는 설정합니다. 옵션 없이 rctladm(1M)를 사용하면, prctl(1)로 작동할 수 있는 시스템 리소스 제어의 리스트가 표시됩니다. 프로세서 집합에 대한 영속적인 구성 메커니즘에 리소스 풀의 추상화가 도입되었습니다. poolbind(1M)를 사용하여 리소스 풀에 대한 프로세스, 태스크 및 프로젝트를 결합할 수 있습니다.
이러한 리소스 관리의 추상화는 영역 작업에까지 확장되었습니다. 각 영역은 자신의 project(4) 데이터베이스를 가집니다. 영역 전체의 제한이 리소스 제어에 추가되어 영역 내의 프로세스가 시스템을 독점하는 것을 막습니다. 전역 영역의 관리자는 rctladm(1M)를 사용해 광역의 제한을 지정할 수 있습니다. 비전역 영역의 관리자는 rctladm(1M)를 사용하여 영역 전체의 제한을 지정할 수 있습니다.
비전역 영역에는 「1 영역, 1 리소스 풀」이라는 규칙이 적용됩니다. 이것은 비전역 영역이 전체 중에서 풀의 경계임을 의미합니다. 풀 내의 모든 리소스는 영역 내 모든 프로세스로 공유됩니다. 비전역 영역 내의 개별 프로세스, 태스크 또는 프로젝트를 다른 풀과 결합하려고 하면 실패합니다.
5.7 패키지와 패치의 데이터베이스
각 영역은 소유하고 있는 패키지와 패치 데이터베이스를 유지보수합니다. 패키지나 패치는 비전역 영역 또는 전역 영역에서 모든 영역으로 개별 설치할 수 있습니다.
영역 환경 내에서의 패키지화의 동작은 다음의 요인에 따라 다릅니다.
pkgadd(1M)로의 -G 옵션 사용
pkginfo 파일 내 SUNW_PKG_ALLZONES 및 SUNW_PKG_HOLLOW 변수의 설정(자세한 내용은 pkginfo(4)를 참조)
pkgadd(1M)가 호출되는 영역의 종류(전역 영역과 비전역 영역 중)
패키지의 pkginfo(4)SUNW_PKG_ALLZONES 속성이 「True」로 설정되어 있는 경우, 패키지는 전역 영역에만 설치 및 삭제할 수 있습니다. 패키지는 모든 비전역 영역에 설치되며, 영역이 설치될 때 패키지가 영역에 설치됩니다. pkginfo(4)의 SUNW_PKG_HOLLOW 속성도 비전역 영역에서의 패키지 가시성과 동작에 영향을 줄 수 있습니다.
다음의 리스트는 patchadd(1M)를 사용해 전역 영역 및 비전역 영역에 패치를 추가할 때의 patchadd(1M)의 -G 옵션과 SUNW_PKG_ALLZONES 변수와의 사이의 상호작용을 나타내고 있습니다.(pkginfo(4)를 참조 ) .
전역 영역 -G를 지정하는
SUNW_PKG_ALLZONES가 True로 설정되어 있는 패키지가 있는 경우: patchadd(1M)는 오류를 반환하여 아무것도 변경되지 않습니다.
SUNW_PKG_ALLZONES가 True로 설정되어 있는 패키지가 있는 경우: 전역 영역에서만 패키지에 패치를 적용합니다.
전역 영역, -G를 지정하지 않는
SUNW_PKG_ALLZONES가 True로 설정되어 있는 패키지가 있는 경우: 모든 영역에서 적절한 패키지에 패치를 적용합니다.
SUNW_PKG_ALLZONES가 True로 설정되어 있는 패키지가 있는 경우: 모든 영역에서 적절한 패키지에 패치를 적용합니다.
비전역 영역, -G를 지정하거나, 또는 지정하지 않는
SUNW_PKG_ALLZONES가 True로 설정되어 있는 패키지가 있는 경우: patchadd(1M)는 오류를 반환하여 아무것도 변경되지 않습니다.
SUNW_PKG_ALLZONES가 True로 설정되어 있는 패키지가 있는 경우: 국소 영역에서만 패키지에 패치를 적용합니다.
6.0 영역의 제한 사항
지금까지 설명한 안전성, 프로세스의 격리, 리소스의 파티션 분할의 제약에 의해 시스템 호출, 장치의 가용성, 네트워크 사용 시의 몇 가지 제한이 비전역 영역 내에서 실행하는 프로세스에 부과되어 있습니다. 이러한 제한은 다음과 같은 사항에 의해 적용됩니다.
프로세스 권한
영역 생성 중의 zoneadmd(1M) (예를 들어, /dev/kmem, /dev/dtrace)
커널 (예를 들어, /proc)
다음 절[4]의 목적은 비전역 영역에서 사용되면 오류를 반환할 가능성이 있는 인터페이스(API, CLI, 장치 파일 등)의 일람을 나타내는 것입니다.
6.1 시스템 호출
adjtime(2) -- 시각을 수정해 시스템 시계의 동기화를 가능하게 합니다.
ioctl(2) -- 장치 제어
-> I_POP 및 STREAMS 적절한 위치의 앵커를 지정한 ioctl(2)
link(2) /unlink(2) -- 디렉토리에 대한 링크
memcntl(2) -- 메모리 관리 제어
-> MC_LOCK, MC_LOCKAS, MC_UNLOCK, 또는 MC_UNLOCKAS를 지정
mknod(2) -- 디렉토리, 특수 파일 또는 통상의 파일을 작성합니다.
->파일 유형으로서 S_IFCHR 및 S_IFBLK를 지정
msgctl(2) -- 메시지 제어 작동
-> IPC_SET를 지정하고, msg_qbytes를 설정합니다.
ntp_adjtime(2) -- 로컬의 시계 파라미터를 조정합니다.
p_online(2) -- 프로세서의 작동 상태를 반환하거나 변경합니다.
-> P_ONLINE, P_OFFLINE, P_NOINTR, P_FAULTED, P_SPARE, 및 P_FORCED
priocntl(2) -- 프로세스 스케줄러의 제어
-> PC_SETPARMS, PC_SETXPARMS, 및 PC_ADMIN를 지정
priocntlset(2) -- 종합 프로세스 스케줄러의 제어
-> PC_SETPARMS, PC_SETXPARMS, 및 PC_ADMIN를 지정
pset_bind(2) -- LWP를 프로세서의 집합에 결합합니다.
pset_create(2), pset_destroy(2), pset_assign(2) -- 프로세서의 집합을 관리합니다.
pset_setattr(2) -- 프로세서의 집합의 속성을 설정합니다.
shmctl(2) -- 공유 메모리 제어의 작동
-> SHM_LOCK 및 SHM_UNLOCK를 지정
socket(2) -- 통신의 종단을 작성합니다.
-> SOCK_RAW를 지정
stime(2) -- 시스템의 시간과 일자를 설정합니다.
swapctl(2) -- 스왑 공간을 관리합니다.
-> SC_ADD 및 SC_REMOVE 스왑 리소스를 지정
6.2 라이브러리 기능
clock_settime(3RT) -- 고해상도의 시계 작동을 설정합니다.
cpc_bind_cpu(3CPC) -- 하드웨어 카운터를 설정하는 바인딩 요구
libdevinfo(3LIB) -- 장치 정보 라이브러리
libcfgadm(3LIB) -- 구성 관리 라이브러리
libpool(3LIB) -- 풀 구성 작동 라이브러리
libkvm(3LIB) -- 커널 가상 메모리 액세스 라이브러리
libtnfctl(3LIB) -- TNF 프로브 제어 라이브러리
mlock(3C)/munlock(3C) -- 메모리 내 페이지의 잠금 또는 잠금 해제
mlockall(3C)/munlockall(3C) -- 주소 공간의 잠금 또는 잠금 해제
plock(3C) -- 메모리 프로세스, 텍스트 또는 데이터의 잠금 또는 잠금 해제
timer_create(3RT) -- 타이머를 작성합니다.
-> CLOCK_HIGHRES를 지정
t_open(3NSL) -- 트랜스포트 종단을 확립합니다.
-> /dev/rawip를 지정
settimeofday(3C) -- 일자 및 시각을 취득 또는 설정합니다.
6.3 명령
다음에 일람표 나타내는 명령은 비전역 영역에서는 완전한 기능을 발휘할 수 없는 경우가 있습니다. 예를 들어, arp -a를 비전역 영역에서 사용하고, 시스템의 현재의 ARP 항목을 모두 표시할 수 있습니다. 그러나 arp(1M) 외의 옵션을 비전역 영역에서 사용해 ARP 테이블을 작동하면 오류가 됩니다.
add_drv(1M)/rem_drv(1M) -- 시스템에 새로운 장치 드라이버를 추가 또는 삭제합니다.
arp(1M) -- 주소 결정을 표시하고 제어합니다.
autopush(1M) -- 자동으로 푸시된 STREAMS 모듈의 리스트를 구성합니다.
cfgadm(1M) -- 구성 관리
cpustat(1M) -- CPU 성능 카운터를 사용해 시스템의 동작을 감시합니다.
devfsadm(1M) -- /dev에 대한 관리 명령
devlinks(1M) -- 그 외의 장치나 의사 장치에 대해 /dev 항목을 추가합니다.
dispadmin(1M) -- 프로세스 스케줄러 관리
disks(1M) -- 시스템에 접속된 하드 디스크에 대해 /dev 항목을 작성합니다.
drvconfig(1M) -- 장치에 대해 액세스권과 소유권의 변경을 적용합니다.
dtrace(1M) -- DTrace 동적 추적 컴파일러 및 추적 유틸리티
intrstat(1M) -- 인터럽트 통계를 리포트합니다.
ipf(1M) 및 관련 IP 필터 명령 -- IP 패킷 입출력에 대한 대체 패킷 필터링 리스트
modload(1M)/ modunload(1M) -- 커널 모듈의 로드 및 언로드
plockstat(1M) -- 사용자 수준의 잠금 통계를 리포트합니다.
pooladm(1M) -- 리소스 풀의 기능을 활성화 또는 비활성화합니다.
poolcfg(1M) -- 리소스 풀의 구성 파일을 작성 및 변경합니다.
poolbind(1M) -- 프로세스, 태스크 또는 프로젝트를 결합하거나 리소스 풀에 대한 프로세스의 결합을 쿼리합니다.
ports(1M) -- 시리얼 회선에 대해 /dev 항목 및 inittab 항목을 작성합니다.
prtconf(1M) -- 시스템 구성을 인쇄합니다.
prtdiag(1M) -- 시스템의 진단 정보를 표시합니다.
psrset(1M) -- 프로세서의 집합을 작성하고 관리합니다.
route(1M) -- 경로 지정 테이블을 수동으로 작동합니다.
share(1M) -- 로컬의 리소스를 원격 시스템으로 마운트할 수 있도록 합니다.
snoop(1M) -- 네트워크 패킷을 포착해 검사합니다.
tapes(1M) -- 시스템에 연결된 테이프 드라이브에 대해 /dev 항목을 작성합니다.
trapstat(1M) -- 트랩 통계를 리포트합니다.
date(1) -- 일자와 시간을 씁니다.
nca(1) -- Solaris Network Cache and Accelerator(NCA)
6.4 장치와 인터페이스의 특수 파일
uscsi(7I) -- 사용자 SCSI 명령 인터페이스
mem(7D)/kmem(7D)/allkmem(7D) -- 물리 또는 가상 메모리 액세스
kmdb(7D) -- in situ 커널 디버거
ksyms(7D) -- 커널 심볼
dtrace(7D) -- DTrace 동적 추적 기능
lockstat(7D) -- DTrace 커널 잠금 계측 공급자
cpuid(7D) -- CPU 식별 드라이버
fcip(7D) -- 파이버 채널 데이터그램 캡슐화 드라이브 경유 IP/ARP
DLPI 프로그래밍 인터페이스를 지원하는 모든 NIC 장치 노드는 비전역 영역에서는 액세스할 수 없습니다. 그러한 장치 노드의 예로서 다음을 들 수 있습니다. hme(7D), ce(7D), ge(7D), eri(7D), bge(7D), dmfe(7D), dnet(7D), e1000g(7D), elxl(7D), iprb(7D), pcelx(7D), pcn(7D), qfe(7D), rtls(7D), sk98sol(7D), skfp(7D), 및 spwr(7D).