BigAdmin System Administration Portal
特集記事: Solaris ゾーン区分技術
Print-friendly VersionPrint-friendly Version

Solaris ゾーン区分技術

Chien Yen、 2005 年 3 月

目次 :


1.0 はじめに

Solaris オペレーティングシステムの Solaris ゾーン[1][2] 機能は、オペレーティングシステムサービスを仮想化し、アプリケーションのホスティングと実行に適した、隔離された安全な環境を提供するために使用する区分技術です。ゾーンは、「Solaris オペレーティングシステムの 1 つのインスタンス内で作成される」仮想化されたオペレーティングシステム環境です。2 種類のゾーンがあります。それは、大域ゾーンと非大域ゾーンです。

大域ゾーンは Solaris OS インストールの完全な機能を含み、システムハードウェアによって起動可能です。Solaris OS インストールは、システムハードウェアによって起動されると、大域ゾーンになります。1 つのシステムで実行される大域ゾーンは 1 つだけです。大域ゾーンの管理者は zonecfg(1M)zoneadm(1M) を使用して非大域ゾーンを作成します。大域ゾーンは、非大域ゾーンのインストール、保守、操作、および破棄を管理します。

Solaris ゾーン機能は、非大域ゾーンで実行されるプロセスに対し、サービスの仮想化と名前空間の隔離を提供します。非大域ゾーンのプロセスは、ほかのゾーンのプロセスから隔離されます。このように隔離することで、非大域ゾーンで実行中のプロセスが、ほかのゾーンで実行中のプロセスを監視したり、影響を与えたりすることを防ぎます。非大域ゾーンでスーパーユーザー資格で実行されているプロセスであっても、ほかのゾーンでの活動を監視したり操作したりすることはできません。

また、ゾーンにより、アプリケーションを配備するマシンの物理的属性からアプリケーションを分離する抽象層も提供されます。このような属性の例としては、物理的なデバイスパスやネットワークインタフェース名などが挙げられます。

ゾーンは、Solaris 10 リリースをサポートしているすべてのマシンで使用できます。1 つの物理サーバーにおけるゾーンの上限数は 8192 です。 1 つの物理サーバー上で実際に配置可能なゾーンの数は、すべてのゾーンで実行しているアプリケーションが必要とする資源の合計によって変わります。

1.1 Solaris ゾーンの機能: Solaris コンテナの構成要素

Solaris コンテナは仮想化された実行時環境で、CPU などのシステム資源を消費する作業負荷に対し制限を課します。Solaris コンテナは Solaris ゾーンと Solaris OS の資源管理機能を使用して、作業負荷に対する資源境界の固定された仮想化環境を提供します。

作業負荷とは、1 つのアプリケーションまたは一連のアプリケーションが持つすべてのプロセスの集まりです。プロセスエンティティーに加えて、Solaris OS は作業負荷を特定するのに 2 つの機能、プロジェクトとタスクを追加します。Solaris の資源管理機能を使用しなければ、Solaris OS はシステム上のすべての活動に等しく資源へのアクセスを提供することによって、作業負荷の要求に応じることになります。Solaris OS の資源管理機能によって、システム管理者は作業負荷を個別に取り扱い、作業負荷が受け取る資源の量を割り当てることができます。この資源管理機能を使用して、システム管理者は次のことができます。

  • 特定の資源へのアクセスを制限します
  • 優先順位に基づいて作業負荷に資源を提供します
  • 作業負荷を互いに分離します

作業負荷の抽象化は Solaris ゾーンとともに動作するよう拡張されました。各ゾーンは自分の project(4) データベースを持ちます。ゾーン幅の制限が資源制御に追加されます。Solaris ゾーンとSolaris 資源管理機能が連携することで、システム管理者は、特定の資源境界を持つ、仮想化された動作環境であるゾーンを作成することができます。


2.0 Solaris ゾーンソフトウェアの利点

Solaris ゾーンの主な利点は、サーバーの統合による総所有コスト (TCO) の削減です。Solaris ゾーンソフトウェアにより次のことが可能になります。

  • 1 台の物理サーバー上にあるオペレーティングシステムの 1 つのインスタンスにより、多くの仮想化された動作環境であるゾーンを作成することができます。
  • それぞれの非大域ゾーンは、固有の、仮想化されたアイデンティティー、ファイルシステム、デバイス、ネットワーク機能、オペレーティングシステム資源、およびセキュリティーを持ちます。
  • それぞれの非大域ゾーンは大域ゾーン以外のほかのゾーンから隔離されます。
  • アプリケーションの障害は隔離され、非大域ゾーン内で食い止められます。
  • ゾーン間の通信はネットワークを介してのみ行われます。
  • 各アプリケーションでは引き続き Solaris ABI/API が使用されるため、アプリケーションの移植は必要ありません。
  • それぞれの非大域ゾーンは、ほかのゾーンに影響を及ぼすことなく、個別に再起動することもシャットダウンすることもできます。
  • CPU やネットワーク帯域幅などのシステム資源は、各ゾーンでパーティション分割することができます。管理者は Solaris の資源管理メカニズムを使用して、きめの細かい資源制御を行うことができます。
  • アプリケーション環境の管理は、非大域ゾーンの管理者に委任することができます。

3.0 ゾーンの作成と管理

3.1 ゾーンの構成とインストール

大域ゾーンの管理者は zonecfg(1M)zoneadm(1M)、および zlogin(1M) を使用してゾーンを管理します。zonecfg(1M) は各非大域ゾーンに対してゾーンの構成ファイル /etc/zones/my-zone.xml を作成します。my-zone.xmlmy-zone の構成を記述します。zoneadm(1M)my-zone.xml を入力とし、 live_upgrade(5) メカニズムを使用して、/etc/zones/my-zone.xmlzonepath フィールドに指定した場所に起動環境 (BE) を作成します。 さらに、非大域ゾーンの起動環境が作成されたあとで、zoneadm(1M)zoneadmd(1M) デーモンプロセスを起動して、ゾーンの状態の切り替えを管理します。

非大域ゾーンは次のいずれかの状態をとることができます。

  • 構成済み
  • 不完全
  • インストール済み
  • 準備完了
  • 稼動中
  • 停止処理中
  • 停止

通常の非大域ゾーンの管理プロセスの間、ゾーンの状態は次のように遷移します。構成済み -> インストール済み -> 準備完了 -> 稼動中 (図 1 を参照)

通常の非大域ゾーンの管理プロセス
図 1: 通常の非大域ゾーンの管理プロセスの状態

3.2 zoneadmd(1M) を使用したゾーンの管理

zoneadmd(1M) は非大域ゾーンの仮想プラットフォームを作成し、その状態遷移を管理するシステムデーモンです。仮想プラットフォームの構成要素には、ネットワークインタフェース、デバイス、zoneadmd(1M) デーモン、およびゾーンコンソールがあります。システム上の各非大域ゾーンには 1 つの zoneadmd(1M) プロセスが存在します。zoneadmd(1M) の機能は次のとおりです。

  • クライアントがゾーンの状態の変更を要求する door サーバーを実装します。大域ゾーンの管理者は zonecfg(1M)zoneadm(1M)、および zlogin(1M) を使用してゾーンを管理します。これらのコマンドは zoneadmd(1M) と Solaris libdoor(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 (非大域ゾーン用のカーネルダミープロセス) を作成します。非大域ゾーンの起動中にzschedinit(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 ゾーンのルートファイルシステム

非大域ゾーンのルートファイルシステムを構成するには、2 つの方法があります。それは、「完全ルートモデル」と「疎ルートモデル」です。

完全ルートモデルでは、Solaris ソフトウェアパッケージのうち、すべての必須パッケージと選択した任意のパッケージがゾーンの専有ファイルシステムにインストールされるため、最大限に柔軟な構成が可能になっています。このモデルの利点は、ゾーンの管理者がゾーンのファイルシステムの配置をカスタマイズしたり (たとえば、/usr/local を作成する)、バンドルされていないまたはサードパーティー製の任意のパッケージを追加したりすることができることにあります。このモデルの不利な点は、仮想メモリーシステムによって、実行可能ファイルおよび共有ライブラリからテキストセグメントの共有が失われることと、より多くのディスク占有スペース (約 2G バイトの追加) がこのように構成された非大域ゾーンのそれぞれに必要なことにあります。大域ゾーンの管理者は zonecfg(1M) のサブコマンド create -b を使用して、完全ルートモデルでゾーンを作成します (または、inherited-pkg-dir ディレクトリを my-zone.xml から削除します)。

疎ルートモデルは、ルートパッケージのサブセットのみをインストールし (pkginfo(4) パラメータ SUNW_PKGTYPEroot に設定) 、読み取り専用のループバックファイルシステムを使用することでほかのファイルにアクセスすることにより、オブジェクトの共有を最適化します。これはディスクレスクライアントの構成方法に似ていますが、この場合の /usr とほかのファイルシステムは NFS でネットワークを介してマウントされます。このモデルのデフォルトでは、ディレクトリ /lib/platform/sbin、および /usr はループバックファイルシステムとしてマウントされます。このモデルの利点は、実行可能ファイルおよび共有ライブラリを効率的に共有することでパフォーマンスを向上できることと、ゾーン自体で必要なディスク占有スペースがはるかに少ないことです。疎ルートモデルでは、ゾーン自体に約 100M バイトのファイルシステムスペースが必要なだけです。


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) 特権セットの変換ルールは次のとおりです。

数式 1

各情報の意味は次のとおりです。

    C.E - 親プロセスの実効特権セット
    C.P - 親プロセスの許可された特権セット
    C.I - 親プロセスの継承可能な特権セット
    C.L - 親プロセスの制限特権セット
    C'.E - 子プロセスの実効特権セット
    C'.P - 子プロセスの許可された特権セット
    C'.I - 子プロセスの継承可能な特権セット
    C'.L - 子プロセスの制限特権セット

すべてのカーネルセキュリティーポリシーチェックは特権だけを使用して実行されます。

数式 2

カーネルは、ユーザーがシステムを使用するために必要な基本特権セットを提供します。ログイン時に、各ユーザーは基本特権セットを継承します。基本特権セットは、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 節では、非大域ゾーンで呼ばれるとエラーを返す可能性のあるシステムコール、ライブラリ機能、およびコマンドについて要約します。

すべての特権		ゾーンの特権
 =========================================================
PRIV_CONTRACT_EVENT	PRIV_CONTRACT_EVENT
PRIV_CONTRACT_OBSERVER	PRIV_CONTRACT_OBSERVER
PRIV_CPC_CPU
PRIV_DTRACE_PROC
PRIV_DTRACE_USER
PRIV_DTRACE_KERNEL
PRIV_FILE_CHOWN		PRIV_FILE_CHOWN
PRIV_FILE_CHOWN_SELF	PRIV_FILE_CHOWN_SELF
PRIV_FILE_DAC_EXECUTE	PRIV_FILE_DAC_EXECUTE
PRIV_FILE_DAC_READ	PRIV_FILE_DAC_READ
PRIV_FILE_DAC_SEARCH	PRIV_FILE_DAC_SEARCH
PRIV_FILE_DAC_WRITE	PRIV_FILE_DAC_WRITE
PRIV_FILE_LINK_ANY	PRIV_FILE_LINK_ANY
PRIV_FILE_OWNER		PRIV_FILE_OWNER
PRIV_FILE_SETID		PRIV_FILE_SETID
PRIV_IPC_DAC_READ	PRIV_IPC_DAC_READ
PRIV_IPC_DAC_WRITE	PRIV_IPC_DAC_WRITE
PRIV_IPC_OWNER		PRIV_IPC_OWNER
PRIV_NET_ICMPACCESS	PRIV_NET_ICMPACCESS
PRIV_NET_PRIVADDR	PRIV_NET_PRIVADDR
PRIV_NET_RAWACCESS
PRIV_PROC_CHROOT	PRIV_PROC_CHROOT
PRIV_PROC_CLOCK_HIGHRES
PRIV_PROC_AUDIT		PRIV_PROC_AUDIT
PRIV_PROC_EXEC		PRIV_PROC_EXEC
PRIV_PROC_FORK		PRIV_PROC_FORK
PRIV_PROC_INFO		PRIV_PROC_INFO
PRIV_PROC_LOCK_MEMORY
PRIV_PROC_OWNER		PRIV_PROC_OWNER
PRIV_PROC_PRIOCNTL
PRIV_PROC_SESSION	PRIV_PROC_SESSION
PRIV_PROC_SETID		PRIV_PROC_SETID
PRIV_PROC_TASKID	PRIV_PROC_TASKID
PRIV_PROC_ZONE
PRIV_SYS_ACCT		PRIV_SYS_ACCT
PRIV_SYS_ADMIN		PRIV_SYS_ADMIN
PRIV_SYS_AUDIT		PRIV_SYS_AUDIT
PRIV_SYS_CONFIG
PRIV_SYS_DEVICES
PRIV_SYS_IPC_CONFIG
PRIV_SYS_LINKDIR
PRIV_SYS_MOUNT		PRIV_SYS_MOUNT
PRIV_SYS_NET_CONFIG
PRIV_SYS_NFS		PRIV_SYS_NFS
PRIV_SYS_RESOURCE	PRIV_SYS_RESOURCE
PRIV_SYS_SUSER_COMPAT
PRIV_SYS_TIME

5.0 ゾーンの資源とサービスの仮想化

Solaris ゾーンは、マシンの動作環境を仮想化する強固なパーティション分割ソリューションをプロセスに提供します。非大域ゾーン内のプロセスは、アクティビティがほかのゾーンのプロセスと隔離されていながら、動作環境に必要な資源とサービスにアクセスします。これには次のものが含まれます。

  • ネットワークインタフェース
  • ファイルシステム
  • プロセス間通信 (IPC)
  • デバイス
  • プロセス
  • 資源管理機能
  • パッケージングデータベース

5.1 ネットワーク機能

各非大域ゾーンには、固有の論理ネットワークとループバックインタフェースがあります。上位層ストリームと論理インタフェース間の結合は制限され、ストリームを確立できるのは、同一ゾーン内の論理インタフェースへの結合だけです。同様に、論理インタフェースからのパケットを渡すことができるのは、論理インタフェースと同じゾーン内の上位層ストリームに対してだけです。

ループバックアドレスへの結合はゾーン内に限られますが、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) を使用してゾーンにループバックマウントされます。lofsautofstmpfsmntfsctfsprocfs、および 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/zconsolezcons(7D) ドライバによって実装されます。 zcons ドライバの各インスタンスは、大域ゾーンと非大域ゾーンのペアを表します。ドライバは大域ゾーンから非大域ゾーンへの入出力、およびその逆のチャネルとなります。/dev/console/dev/msglog/dev/syscon/dev/sysmsg、および /dev/systty はすべて /dev/zconsole へのシンボリックリンクです。
  • 5.5 プロセス

    ゾーン設計の基本原理の 1 つは、非大域ゾーン内のプロセスは、ほかのゾーンで実行中のプロセスの活動を参照したり影響を与えたりできてはならないということです。各プロセスは 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 属性が「真」に設定されている場合、パッケージは大域ゾーンからのみインストールおよび削除することができます。パッケージはすべての非大域ゾーンにインストールされ、ゾーンがインストールされるときにパッケージがゾーンにインストールされます。pkginfo(4)SUNW_PKG_HOLLOW 属性も、非大域ゾーンでのパッケージの可視性と動作に影響を与えることができます。

    次のリストは、patchadd(1M) を使用して大域ゾーンおよび非大域ゾーンにパッチを追加するときの、patchadd(1M)-G オプションと SUNW_PKG_ALLZONES 変数との間の相互作用を示しています ( pkginfo(4) を参照 ) 。

    • 大域ゾーン、-G を指定する
      • SUNW_PKG_ALLZONES を真に設定しているパッケージがある場合: patchadd(1M) はエラーを返し、何も変更されません。
      • SUNW_PKG_ALLZONES を真に設定しているパッケージがある場合: 大域ゾーンでのみパッケージにパッチを適用します。
    • 大域ゾーン、-G を指定しない
      • SUNW_PKG_ALLZONES を真に設定しているパッケージがある場合: すべてのゾーンで適切なパッケージにパッチを適用します。
      • SUNW_PKG_ALLZONES を真に設定しているパッケージがある場合: すべてのゾーンで適切なパッケージにパッチを適用します。
    • 非大域ゾーン、-G を指定するまたは指定しない
      • SUNW_PKG_ALLZONES を真に設定しているパッケージがある場合: patchadd(1M) はエラーを返し、何も変更されません。
      • SUNW_PKG_ALLZONES を真に設定しているパッケージがある場合: 局所ゾーンでのみパッケージにパッチを適用します。

    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_LOCKMC_LOCKASMC_UNLOCK、または MC_UNLOCKAS を指定
    mknod(2) -- ディレクトリ、特殊ファイル、または通常ファイルを作成します
    ->ファイルタイプとして S_IFCHR および S_IFBLK を指定
    msgctl(2) -- メッセージ制御操作
    -> IPC_SET を指定して、msg_qbytes を立てる
    ntp_adjtime(2) -- ローカルのクロックパラメータを調整します
    p_online(2) -- プロセッサの操作状態を返したり変更したりします
    ->P_ONLINEP_OFFLINEP_NOINTRP_FAULTEDP_SPARE、および P_FORCED
    priocntl(2) -- プロセススケジューラの制御
    -> PC_SETPARMSPC_SETXPARMS、および PC_ADMIN を指定
    priocntlset(2) -- 総合プロセススケジューラの制御
    -> PC_SETPARMSPC_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)


    7.0 参考資料

    [1] 『Solaris のシステム管理 (Solaris コンテナ : 資源管理と Solaris ゾーン)』、Sun Microsystems, Inc.

    [2] 『BigAdmin System Administration Portal -- Solaris Zones』、Sun Microsystems, Inc.

    [3]「 第 8 章: 役割と特権の使用 (概要)」『Solaris のシステム管理 (セキュリティサービス)』、Sun Microsystems, Inc.

    [4] 『Solaris 10 Reference Manual Collection』、Sun Microsystems, Inc.


    著者について

    Chien-Hua Yen 氏は、Sun Microsystems 社の市場開発技術の上級スタッフエンジニアです。


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


BigAdmin