与在传统的 Solaris 环境中一样,所有应用程序在全局区域中都可以完全正常地运行。只要应用程序不需要任何权限,大多数应用程序便会在非全局环境中正常运行,不会出现任何问题。如果应用程序确实需要权限,则开发者需要仔细了解所需的权限以及特定权限的使用方式。如果需要权限,则系统管理员必须为应用程序指定相应的权限。
以下是开发者需要调查的已知情况:
更改系统时间的系统调用需要 PRIV_SYS_TIME 权限。这些系统调用包括 adjtime(2)、ntp_adjtime(2) 和 stime(2)。
需要对设置了 sticky 位的文件执行的系统调用需要 PRIV_SYS_CONFIG 权限。这些系统调用包括 chmod(2)、creat(2) 和 open(2)。
ioctl(2) 系统调用需要 PRIV_SYS_NET_CONFIG 权限才能解除对 STREAMS 模块中的锚点的锁定。
link(2) 和 unlink(2) 系统调用需要 PRIV_SYS_LINKDIR 权限才能在非全局区域中创建目录链接或解除目录链接。用于安装或配置软件或创建临时目录的应用程序可能会受到此限制的影响。
PRIV_SYS_PROC_LOCK_MEMORY 权限是 mlock(3C)、munlock(3C)、mlockall(3C)、munlockall(3C) 和 plock(3C) 函数以及 memcntl(2) 系统的 MC_LOCK、MC_LOCKAS、MC_UNLOCK 和 MC_UNLOCKAS 标志所必需的。此限制会影响需要锁定和解除锁定内存的应用程序,如数据库程序。如果应用程序出于性能考虑而锁定内存,则使用 shmctl(2) 系统调用的锁定共享内存 (intimate shared memory, ISM) 可以提供潜在的解决方法。
mknod(2) 系统调用需要 PRIV_SYS_DEVICES 权限才能创建块 (S_IFBLK) 或字符 (S_IFCHAR) 特殊文件。此限制会影响需要即时创建设备节点的应用程序。
msgctl(2) 系统调用中的 IPC_SET 标志需要 PRIV_SYS_IPC_CONFIG 权限才能增加消息队列的字节数。此限制会影响任何需要动态调整消息队列大小的应用程序。
nice(2) 系统调用需要 PRIV_PROC_PRIOCNTL 权限才能更改进程的优先级。此限制会影响用于设置调用优先级的应用程序。如果进程需要更改其优先级,则这种更改必须由进程在全局区域中进行。另一种更改优先级的方法是将正在运行应用程序的非全局区域绑定到资源池,尽管该区域中的调用进程最终会通过公平共享调度程序来决定。
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 标志需要 PRIV_PROC_PRIOCNTL 权限才能更改轻量进程 (lightweight process, LWP) 的调度参数。
需要管理处理器集 (pset) 的系统调用(包括将 LWP 绑定到 pset 和设置 pset 属性)需要 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) 功能可以提供潜在的解决方法。
socket(3SOCKET) 函数需要 PRIV_NET_RAWACCESS 权限才能在协议设置为 IPPROTO_RAW 或 IPPROTO_IGMP 的情况下创建原始套接字。此限制会影响使用原始套接字或需要创建或检查 TCP/IP 头的应用程序。
swapctl(2) 系统调用需要 PRIV_SYS_CONFIG 权限才能添加或删除交换资源。此限制会影响安装和配置软件。
uadmin(2) 系统调用需要 PRIV_SYS_CONFIG 权限才能使用 A_REMOUNT、A_FREEZE、A_DUMP 和 AD_IBOOT 命令。此限制会影响在某些情况下需要强制进行崩溃转储的应用程序。
clock_settime(3RT) 函数需要 PRIV_SYS_TIME 权限才能设置 CLOCK_REALTIME 和 CLOCK_HIRES 时钟。
cpc_bind_cpu(3CPC) 函数需要 PRIV_CPC_CPU 权限才能将请求集绑定到硬件计数器。作为解决办法,可以使用 cpc_bind_curlwp(3CPC) 函数监视 CPU 计数器,找到有问题的 LWP。
pthread_attr_setschedparam(3C) 函数需要 PRIV_PROC_PRIOCNTL 权限才能更改线程的基础调度策略和参数。
timer_create(3RT) 函数需要 PRIV_PROC_CLOCK_HIGHRES 权限才能使用高精度系统时钟创建计时器。
t_open(3NSL) 函数需要 PRIV_NET_RAWACCESS 权限才能建立传输端点。此限制会影响使用 /dev/rawip 设备实现网络协议的应用程序以及对 TCP/IP 数据包头执行操作的应用程序。
以下列出的库所提供的 API 在非全局区域中不受支持。共享对象存在于区域的 /usr/lib 目录中,因此,如果代码中包括对这些库的引用,将不会出现链接时错误。对自己的 make 文件进行检查可以确定应用程序是否已显式绑定到其中的任何一个库,并可以在执行应用程序时使用 pmap(1) 来验证是否未动态装入其中的任何库。
区域包含一组受限制的设备,这些设备主要由构成 Solaris 编程 API 一部分的伪设备组成。这些伪设备包括 /dev/null、/dev/zero、/dev/poll、/dev/random、/dev/tcp 等。除非系统管理员已配置了设备,否则不能从区域中直接访问物理设备。由于设备通常是系统中的共享资源,因此,要使设备在区域中可用,需要按照以下方式设置一些限制,以免破坏系统安全性。
/dev 名称空间由符号链接(即逻辑路径)组成,这些符号链接指向 /devices 中的物理路径。/devices 名称空间只能在全局区域中使用,用于反映驱动程序所创建的附加设备实例的当前状态。仅有逻辑路径 /dev 在非全局区域中是可见的。
非全局区域中的进程不能创建新设备节点。例如,mknod(2) 不能在非全局区域中创建特殊文件。如果指定了 /dev 中的文件,creat(2)、link(2)、mkdir(2)、rename(2)、 symlink(2) 和 unlink(2) 系统调用将会失败并发出 EACCES 错误。您可以创建指向 /dev 中的某一项的符号链接,但是不能在 /dev 中创建该链接。
公开系统数据的设备只能在全局区域中使用。此类设备的示例包括 dtrace(7D)、kmem(7D)、kmdb(7d)、ksyms(7D)、lockstat(7D) 和 trapstat(1M)。
/dev 名称空间包含组成缺省“安全”驱动程序集的设备节点以及 zonecfg(1M) 命令为该区域指定的设备节点。
每个非全局区域都有自己的逻辑网络和回送接口。上层流与逻辑接口之间的绑定受到限制,因此流只能与相同区域中的逻辑接口建立绑定。与之类似,来自逻辑接口的数据包只能传递给与该逻辑接口在同一区域中的上层流。到回送地址的绑定将保留在区域内,但以下情况例外:当一个区域中的流试图访问另一区域中某一接口的 IP 地址时。尽管可以将一个区域中的应用程序绑定到具有权限的网络端口,但是它们无法控制网络配置(包括 IP 地址和路由表)。