すべてのアプリケーションは、従来の Oracle Solaris オペレーティングシステムの場合と同様に、大域ゾーン内で完全に機能します。大部分のアプリケーションは、特権を必要としないかぎり、非大域環境で問題なく動作します。アプリケーションが特権を必要とする場合、開発者は、どの特権が必要か、および特定の特権がどのように使用されるかを詳しく調べる必要があります。特権が必要な場合、システム管理者は必要な特権をゾーンに割り当てることができます。Oracle Solaris ゾーンの紹介を参照してください。
開発者による調査が必要であることがわかっているのは、次の場合です。
システム時間を変更するシステムコールは、PRIV_SYS_TIME 特権を必要とします。このようなシステムコールには、adjtime(2)、ntp_adjtime(2)、stime(2) があります。
スティッキビットが設定されているファイルを操作する必要のあるシステムコールは、PRIV_SYS_CONFIG 特権を必要とします。このようなシステムコールには、chmod(2)、creat(2)、open(2) があります。
ioctl(2) システムコールは、STREAMS モジュールのアンカーをロック解除するために、PRIV_SYS_NET_CONFIG 特権を必要とします。
link(2) および unlink(2) システムコールは、非大域ゾーン内のディレクトリのリンクを作成またはリンクを解除するために、PRIV_SYS_LINKDIR 特権を必要とします。ソフトウェアをインストールまたは構成するアプリケーションや、一時ディレクトリを作成するアプリケーションは、この制限の影響を受ける可能性があります。
PRIV_PROC_LOCK_MEMORY 特権は、mlock(3C)、munlock(3C)、mlockall(3C)、munlockall(3C)、および plock(3C) 関数と、memcntl(2) システムの MC_LOCK、MC_LOCKAS、MC_UNLOCK、および MC_UNLOCKAS フラグに必要です。この特権は非大域ゾーンのデフォルト特権です。詳細は、Oracle Solaris ゾーンの作成と使用 の 非大域ゾーン内の特権を参照してください。
mknod(2) システムコールは、ブロック型 (S_IFBLK) または文字型 (S_IFCHAR) 特殊ファイルを作成するために、PRIV_SYS_DEVICES 特権を必要とします。この制限は、デバイスノードをオンザフライで作成する必要のあるアプリケーションに影響します。
msgctl(2) システムコールの IPC_SET フラグは、メッセージキューのバイト数を増やすために、PRIV_SYS_IPC_CONFIG 特権を必要とします。この制限は、メッセージキューのサイズを動的に変更する必要のあるアプリケーションに影響します。
nice(2) システムコールは、プロセスの優先順位を変更するために、PRIV_PROC_PRIOCNTL 特権を必要とします。この特権は非大域ゾーンでデフォルトで利用可能です。優先順位を変更するもう 1 つの方法は、アプリケーションが実行されている非大域ゾーンをリソースプールにバインドすることです。ただし、そのゾーンのスケジューリングプロセスは、最終的に公平配分スケジューラによって決定されます。
p_online(2) システムコールの P_ONLINE、P_OFFLINE、P_NOINTR、P_FAULTED、P_SPARE、および PZ-FORCED フラグは、プロセスの動作ステータスを返すまたは変更するために、PRIV_SYS_RES_CONFIG 特権を必要とします。この制限は、CPU を有効または無効にする必要のあるアプリケーションに影響します。
priocntl(2) システムコールの PC_SETPARMS および PC_SETXPARMS フラグは、軽量プロセス (LWP) のスケジューリングパラメータを変更するために、PRIV_PROC_PRIOCNTL 特権を必要とします。
プロセッサセット (psets) への LWP のバインドや、pset 属性の設定など、psets の管理を行う必要のあるシステムコールは、PRIV_SYS_RES_CONFIG 特権を必要とします。この制限は、次のシステムコールに影響します: pset_assign(2)、pset_bind(2)、pset_create(2)、pset_destroy(2)、および pset_setattr(2)。
shmctl(2) システムコールの SHM_LOCK および SHM_UNLOCK フラグは、メモリー制御操作を共有するために、PRIV_PROC_LOCK_MEMORY 特権を必要とします。アプリケーションがパフォーマンスのためにメモリーをロックしている場合は、回避策として Intimate Shared Memory (ISM) 機能を使用できます。
swapctl(2) システムコールは、スワップリソースを追加または削除するために、PRIV_SYS_CONFIG 特権を必要とします。この制限は、インストールおよび構成ソフトウェアに影響します。
uadmin(2) システムコールは、A_REMOUNT、A_FREEZE、A_DUMP、および AD_IBOOT コマンドを使用するために、PRIV_SYS_CONFIG 特権を必要とします。この制限は、特定の状況で強制的にクラッシュダンプを実行する必要のあるアプリケーションに影響します。
clock-settime(3C) 関数は、CLOCK_REALTIME および CLOCK_HIRES クロックを設定するために、PRIV_SYS_TIME 特権を必要とします。
cpc_bind_cpu(3CPC) 関数は、要求セットをハードウェアカウンタにバインドするために、PRIV_CPC_CPU 特権を必要とします。回避策として、cpc_bind_curlwp(3CPC) 関数を使用して、問題の LWP の CPU カウンタをモニターできます。
pthread_attr_setschedparam(3C) 関数は、スレッドの基盤のスケジューリングポリシーおよびパラメータを変更するために、PRIV_PROC_PRIOCNTL 特権を必要とします。
timer_create(3C) 関数は、高精度のシステムクロックを使用してタイマーを作成するために、PRIV_PROC_CLOCK_HIGHRES 特権を必要とします。
次のライブラリ一覧で提供されている API は、非大域ゾーンではサポートされません。共有オブジェクトはゾーンの /usr/lib ディレクトリに存在するため、コードにこれらのライブラリへの参照が含まれている場合、リンク時エラーは発生しません。make ファイルを調べると、アプリケーションがこれらのライブラリのいずれかに明示的なバインドを持っているかどうかを判定でき、アプリケーションの実行中に pmap(1) を使用すると、これらのライブラリのいずれも動的にロードされないことを確認できます。
ゾーンは、Oracle Solaris のプログラミング API の一部である疑似デバイスで主に構成される、デバイスの限定的なセットを持ちます。このような擬似デバイスには、/dev/null、/dev/zero、/dev/poll、/dev/random、/dev/tcp などがあります。物理デバイスには、そのデバイスがシステム管理者によって構成されている場合を除き、ゾーン内から直接アクセスすることはできません。一般に、デバイスはシステム内の共有リソースなので、システムのセキュリティーを損なわずにデバイスをゾーン内で使用可能にするには、次のようないくつかの制限が必要です。
/dev 名前空間は、/devices 内の物理パスへのシンボリックリンク (論理パス) から成ります。/devices 名前空間 (大域ゾーンでのみ使用可能) は、ドライバによって作成された接続されたデバイスインスタンスの現在の状態を反映します。非大域ゾーンから見えるのは論理パス /dev だけです。
非大域ゾーン内のプロセスは新しいデバイスノードを作成できません。たとえば、mknod(2) は非大域ゾーンに特殊ファイルを作成できません。creat(2)、link(2)、mkdir(2)、rename(2)、symlink(2)、および unlink(2) システムコールは、/dev 内のファイルが指定されると EACCES で失敗します。/dev 内のエントリへのシンボリックリンクを作成することはできますが、/dev 内には作成できません。
システムのデータを公開するデバイスは、大域ゾーンでのみ利用できます。そのようなデバイスの例として、dtrace(7D)、kmem(7D)、kmdb(7d)、ksyms(7D)、lockstat(7D)、trapstat(1M) があります。
/dev 名前空間は、デフォルトの「安全な」ドライバセットから成るデバイスノードと、zonecfg(1M) コマンドによってゾーンに指定されているデバイスノードから成ります。
LIFC_UNDER_IPMP は Oracle Solaris 10 では利用できないため、このリリースでサポートされているアプリケーションは LIFC_UNDER_IPMP を使用しません。したがって、Oracle Solaris 10 ゾーン内で SIOCGLIFCONF 要求を発行するアプリケーションには、基盤のインタフェースは見えず、代わりに IPMP メタインタフェースだけが見えます。solaris10 ゾーンでは Oracle Solaris 11 バージョンの ifconfig が使用され、これは特殊な LIFC_UNDER_IPMP を渡すため、ifconfig コマンドを –a オプション付きで使用すると基盤のインタフェースが表示されます。詳細は、if_tcp(7P) を参照してください。
共有 IP インスタンスを使用するように構成されている非大域ゾーンの場合、次の制限が適用されます。
socket(3SOCKET) 関数は、プロトコルを IPPROTO_RAW または IPPROTO_IGMP に設定して raw ソケットを作成するために、PRIV_NET_RAWACCESS 特権を必要とします。この制限は、raw ソケットを使用するアプリケーション、あるいは TCP/IP ヘッダーを作成または検査する必要のあるアプリケーションに影響します。
t_open(3NSL) 関数は、トランスポートのエンドポイントを確立するために、PRIV_NET_RAWACCESS 特権を必要とします。この制限は、/dev/rawip デバイスを使用してネットワークプロトコルを実装するアプリケーション、および TCP/IP ヘッダーを操作するアプリケーションに影響します。
DLPI プログラミングインタフェースをサポートする NIC デバイスには、共有 IP 非大域ゾーンではアクセスできません。
共有 IP 非大域ゾーンは、それぞれ独自の論理ネットワークおよびループバックインタフェースを持っています。上位層ストリームと論理インタフェースの間のバインドは制限され、ストリームは同じゾーン内の論理インタフェースに対してのみバインドを確立できます。同様に、論理インタフェースからのパケットを渡すことができるのは、論理インタフェースと同じゾーン内の上位層ストリームに対してだけです。ループバックアドレスへのバインドはゾーン内に保持されますが、1 つ例外があります。それは、1 つのゾーン内のストリームが別のゾーン内のインタフェースの IP アドレスにアクセスしようとする場合です。ゾーン内のアプリケーションは、特権ネットワークポートにバインドすることはできますが、IP アドレスやルーティングテーブルなどのネットワーク構成を制御することはできません。
ただし、これらの制限は排他的 IP ゾーンには適用されません。