Solaris Zones 分区技术


Chien Yen2005 年 3 月

目录:


1.0 介绍

Solaris 操作系统中的 Solaris Zones[1][2] 功能是一种用于虚拟化操作系统服务的分区技术,可提供安全的隔离环境以便承载和运行各种应用程序。区域是指在 Solaris 操作系统的单个实例中创建的一个虚拟的操作系统环境。区域有两种类型:全局区域 (global zone) 和非全局区域 (non-global zone)。

全局区域包含一次 Solaris OS 的完全正常运行的安装,该安装可由系统硬件来引导。通过系统硬件引导的 Solaris OS 安装过程安装的即是全局区域。一个系统中只能运行一个全局区域。全局区域管理员可使用 zonecfg(1M)zoneadm(1M) 来创建非全局区域。全局区域控制所有非全局区域的安装、维护、操作和损毁。

Solaris Zones 功能可为在非全局区域中运行的进程提供服务虚拟和名称空间隔离。它可以将在某个非全局区域中运行的进程与在其他区域中运行的进程隔离开。这种隔离可防止在 某个非全局区域中运行的进程监视或影响在其他区域中运行的进程。对于在非全局区域中运行的进程,即使具有超级用户凭证也不能查看或影响其他区域中的活动。

区域还提供一个抽象层,用以分隔应用程序与部署应用程序的计算机的物理属性。这些属性的示例包括物理设备路径 和网络接口名称。

在任何支持 Solaris 10 发行版的计算机中都可以使用区域。单个物理服务器中的区域数上限为 8192。单个物理服务器中可以有效承载的区域数取决于在组合的所有区域中运行的应用程序的总资源需求。

1.1 Solaris Zones 功能:Solaris Containers 的一个组件

Solaris 容器是一个虚拟的运行时环境,它对工作负荷所使用的系统资源(例如 CPU)进行了限制。Solaris Containers 将 Solaris OS 资源管理功能与 Solaris Zones 相结合,以提供一个对工作负荷具有固定资源边界的虚拟环境。

工作负荷是一个或一组应用程序内所有进程的集合。除进程实体外,Solaris OS 还添加了两个用于标识工作负荷的功能:项目和任务。如果不使用 Solaris 资源管理功能,则 Solaris OS 在响应工作负荷要求时会为系统中的所有活动提供相同的资源访问权限。借助于 Solaris OS 中的资源管理功能,系统管理员可以分别处理工作负荷,并可分配工作负荷接收的资源数量。通过这些资源管理功能,系统管理员可以执行以下操作:

  • 限制对特定资源的访问
  • 根据优先级为工作负荷提供资源
  • 隔离各项工作负荷

工作负荷的概念已得到扩展,以便使用 Solaris Zones。每个区域都有自己的 project(4) 数据库。向资源控制中添加了区域范围内的限制。结合使用 Solaris Zones 和 Solaris 资源管理功能,系统管理员可以创建虚拟操作环境-区域,它具有特定的资源边界。


2.0 Solaris Zones 软件的优点

Solaris Zones 的主要优点是可以利用服务器整合来降低总体拥有成本 (total cost of ownership, TCO)。利用 Solaris Zones 软件可以实现:

  • 在单个物理服务器上的单个操作系统实例中创建多个虚拟操作环境-区域。
  • 每个非全局区域都具备其自己的虚拟标识、文件系统、设备、联网、操作系统资源和安全性。
  • 可将每个非全局区域与所有其他区域隔离(全局区域除外)。
  • 将应用程序故障隔离并包含在非全局区域中。
  • 仅通过联网进行区域间通信。
  • 由于应用程序仍使用 Solaris ABI/API,因此不需要进行应用程序移植。
  • 可以分别重新引导和关闭每个非全局区域,而不影响其他区域。
  • 可为每个区域对 CPU 和网络带宽等系统资源进行分区。管理员可以利用 Solaris 资源管理机制来提供更精确的资源控制。
  • 可将应用程序环境的管理委托给非全局区域管理员。

3.0 区域 (zone) 创建和初启

3.1 区域配置和安装

全局区域管理员使用 zonecfg(1M)zoneadm(1M)zlogin(1M) 来管理区域。zonecfg(1M) 可为每个非全局区域创建区域配置文件 /etc/zones/my-zone.xmlmy-zone.xml 可对 my-zone 配置进行说明。zoneadm(1M)my-zone.xml 作为输入,并使用 live_upgrade(5) 机制在 /etc/zones/my-zone.xmlzonepath 字段所指定的位置创建引导环境 (boot environment, BE)。而且,zoneadm(1M) 还会启动 zoneadmd(1M) 守护进程,以便在创建非全局区域 BE 后管理区域状态转换。

非全局区域可处于以下状态之一:

  • CONFIGURED
  • INCOMPLETE
  • INSTALLED
  • READY
  • RUNNING
  • SHUTTING_DOWN
  • DOWN

在标准的非全局区域初启过程中,区域会经过以下状态:CONFIGURED -> INSTALLED -> READY -> RUNNING(请参见图 1)。

标准的非全局区域初启过程
图 1:标准的非全局区域初启过程状态

3.2 使用 zoneadmd(1M) 初启区域

zoneadmd(1M) 是一种系统守护进程,用于创建非全局区域虚拟平台和管理该虚拟平台的状态转换。虚拟平台组件包括网络接口、设备、zoneadmd(1M) 守护进程和区域控制台。系统中的每个非全局区域都有一个 zoneadmd(1M) 进程。zoneadmd(1M) 的功能包括:

  • 为客户机实现门服务器,以请求区域状态更改。全局管理员使用 zoneadm(1M)zonecfg(1M)zlogin(1M) 来管理区域。这些命令通过 Solaris libdoor(3LIB)zoneadmd(1M) 通信。
  • zoneadm(1M)zonecfg(1M)zlogin(1M) 交互,以创建、初启和销毁非全局区域虚拟平台。在典型的非全局区域初启过程中,zoneadmd(1M) 将执行以下操作:
    • 创建并初始化内核区域结构和钩子。
    • 创建 /dev 目录和文件。
    • 挂载文件系统。my-zone.xml 中的 inherited-pkg-dir 目录和 /dev 挂载为回送文件系统。vfstab/proc/system/contract 中的其他文件系统和交换文件系统按常规方式挂载。
    • devfsadmd(1M) 通信,以便放置该区域的设备。
    • 创建并配置区域的逻辑网络接口。
    • 实例化区域控制台设备。每个非全局区域都有一个 zcons(7D) 驱动程序实例。该驱动程序的每个实例表示一个全局区域/非全局区域对。
    • 配置进程运行时属性,例如资源控制、池绑定和精确权限。
    • 启动区域的 init(1M) 进程。
    • 创建 zsched(非全局区域的内核 伪进程)。在非全局区域引 导过程中,zsched 将启动 init(1M)

3.3 区域配置和初启样例

下面是一个快速区域配置样例,其中区域名称为 my-zone,IPv4 地址为 10.0.0.1

global# zonecfg -z my-zone
zonecfg:my-zone> create
/* 缺省为稀疏根模型,请参见第 3.4 节了解详细信息*/
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) 等等。在安装后初次引导某一区域时,该区域没有用于命名方案的内部配置,没有语言环境 (Locale) 或时区,没有超级用户口令等。需要访问区域的控制台,以应答提示并进行设置。应使用 zlogin(1M) 命令来执行此操作:

 
# zlogin -C my-zone

[连接到区域 my-zone 控制台]

3.4 区域根文件系统

有两种方式可以配置非全局区域的根文件系统:完全根模型稀疏根模型

完全根模型将所有必需的软件包和任何选定的可选 Solaris 软件包安装到区域的专用文件系统中,因此可提供最大化的配置能力。此模型的优点是:允许区域管理员定制其区域的文件系统布局(例如,创建 /usr/local),并可以添加任意非随附或第三方软件包。此模型的缺点是:无法共享虚拟内存系统共享 的可执行文件和共享库中的文本段,并且磁盘使用量也会显著增加-如此进行配置的每个非全局区域约增加 2 GB。全局区域管理员使用 zonecfg(1M) 的子命令 create -b 创建具有完全根模式的区域(或删除 my-zone.xml 中的 inherited-pkg-dir 目录)。

稀疏根模型只安装根软件包的子集(即将 pkginfo(4) 参数 SUNW_PKGTYPE 设置为 root 的根软件包)并使用只读回送文件系统来访问其他文件,从而可优化对象的共享。这与配置无盘客户机的方式类似,其中 /usr 和其他文件系统通过网络与 NFS 挂载。使用此模型时,缺省情况下会将目录 /lib/platform/sbin/usr 挂载为回送文件系统。此模型的优点在于可提供更高的性能,原因是可以有效地共享可执行文件和共享库,并且区域本身的磁盘使用量会小很多。稀疏根模型只需要 将大约 100 MB 的文件系统空间用于区域本身。


4.0 区域安全性

每个非全局区域都有一个安全边界。该安全边界通过以下各项进行维护:

  • 采用 Solaris 10 进程权利管理 (privileges(5))
  • 名称空间(例如 /proc/dev)隔离,以及
  • 仅通过网络进行的区域间通信(在 IP 内环回)

4.1 进程权利管理

传统的 UNIX 权限模型使所有权限与有效的 uid 0(根) 相关联。 这种要么全有要么全无的方法存在很多缺点:

  • 不能扩展具有受限权限的普通用户的能力。
  • 每个具有权限的进程都对系统具有完全的支配权。可以利用具有权限的进程对系统进行完全访问。

Solaris 10 OS 解决了实现进程权利管理[3] 的原则所存在的缺点,该原则将用户的权限限制于执行作业所需的权限。进程权利管理扩展了 Solaris 进程模型的权限集。每个权限集包含零个或多个权限。每个进程有四个权限集。其中的一个权限集-有效权限集,决定进程是否可以使用特定权限。

这四个权限集包括:

  • 有效权限集-程序在执行时使用的权限集。要使某一权限成为有效权限,该权限还必须包含在 所允许的权限集中。
  • 允许权限集-可用的权限集。权限可通过继承或分配供程序使用。允许集合是可继承集合的子 集。可从允许集合中删除权 限,但不能向该集合中添加权限。可识别权限的程序会从程序的允许权限集中删除该程序从来不使用的权限。这样,程序便可避免使用不正确地分配或继承的权限。
  • 可继承的权限集-进程可从父进程中继承的权限的集合。子进程实际继承哪些权限由进程的启 动方式以及子进程中的允许 权限集来控制。对于用户而言,可继承的集合包括基本的权限集合。通过调用 fork(2) 启动的程序可以继承父进程的所有权限,并可向该进程添加新权限。通过调用 exec(2) 启动的程序可以继承父进程的所有权限。但此类程序不能添加任何新权限。也就是说,程序的允许权限集等于可继承权限集。可继承集合由限制集合的值来限制。
  • 限制权限集-进程及其后代可以继承的权限的上限。缺省情况下,限制集合为所有权限。因 此,如果为用户分配的配置文 件中包括一个已分配权限的程序,则用户可以运行该程序,因为分配的权限在用户的限制集合内。在执行时,并非允许集合中的所有权限都可以使用。限制集合仅在 exec(2) 时实施,从而允许进程删除 exec(2) 的权限,但仍然使用这些权限直到特定时刻。允许集合是可继承集合的子集。可继承集合由限制集合的值来限制。

exec(2) 权限集合变换规则如下所示。

公式 1

其中,

    C.E - the Effective privilege set of the parent process
C.P - the Permitted privilege set of the parent process
C.I - the Inheritable privilege set of the parent process
C.L - the Limit privilege set of the parent process
C'.E - the Effective privilege set of the child process
C'.P - the Permitted privilege set of the child process
C'.I - the Inheritable privilege set of the child process
C'.L - the Limit privilege set of the child process

所有内核安全策略检查都只能使用权限来执行。

公式 2

内核提供用户使用系统所需的基本权限集合。登录时,每个用户都会继承基本集合。基本集合可以使用 ppriv(1) 来修改。限制集合通常是完整的权限集合。目前,为权限集合定义了 48 种权限。privileges(5) 可以列出这些权限及其定义。如果某一进程可识别权限,则其有效权限集将决定该进程的行为。

如果进程的权限识别状态 (Privilege Aware State, PAS) 是不可识别权限 (not privilege aware, NPA),则进程可忽略该权限模型。进程的权限状态可以通过 PAS 进行扩展,PAS 可取以下值:

  • 可识别权限 (Privilege aware, PA)-完全忽略有效 UID
  • 不可识别权限 (Not privilege aware, NPA)-行为几乎完全类似于传统进程

进程可以通过使用 setpflags(2) 尝试成为 NPA。如果未继承 PA,内核会尝试删除 exec(2) 的 PA。

4.2 区域进程权限

在非全局区域中运行的所有进程都可以识别权限。这意味着非全局区域中的所有进程都受创建进程时为其分配的权限 集合的约束。系统创建非全 局区域时,会创建一个内核伪进程 zsched 作为该区域的根进程。非全局区域中的所有进程都是 zsched 的后代。zsched 的可继承权限集决定了该区域中进程的有效权限集。

下面的列表显示非全局区域中的进程所具有的权限。由于非全局区域中进程的权限受限,因此某些系统可能返回错 误。在大多数情况下,拥有权限的进程将会返回 EPERM。某些检查 PRIV_CPC_CPUPRIV_NET_RAWACCESS 的系统调用会返回 EACCESS。第 6.0 节总结了在非全局区域中调用时可能返回错误的系统调用、库函数和命令。

All Privileges		Zone Privileges
=========================================================
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 Zones 提供了强健的分区解决方案,以便为进程虚拟计算机操作环境。当非全局区域中的进程的活动与其他区域中的进程隔离时,这些进程能够访问在操作环境中需要的资 源和服务。这些资源和服务包括:

  • 联网接口
  • 文件系统
  • 进程间通信 (Interprocess communication, IPC)
  • 设备
  • 进程
  • 资源管理功能
  • 打包数据库

5.1 联网

每个非全局区域都有自己的逻辑网络和回送接口。上层流与逻辑接口之间的绑定受到限制,因此流只能与相同区域中 的逻辑接口建立绑定。与之 类似,来自逻辑接口的数据包只能传递给与该逻辑接口在同一区域中的上层流。

到回送地址的绑定将保留在区域内,但以下情况例外:当一个区域中的流试图访问另一区域中某一接口的 IP 地址时。

此外,以下联网虚拟和限制适用于非全局区域:

  • 可以控制区域使用的带宽。可通过使用捆绑的 IPQoS 功能以及为特定区域的每个已配置 IP 地址配置带宽参数来实现此功能。
  • IPQoS 和 IPSec 配置只能在全局区域中进行。通过为配置指定区域的 IP 地址,可以创建特定于区域的配置。
  • 在非全局区域中不允许对传输层以下的层进行原始访问(例如,使用 IP、ARP 和 DLPI 与链路层通信)。因此,使用 DLPI 直接与链路层(NIC 设备驱动程序)通信时将出现错误。snoop(1M) 使用 DLPI 直接访问接口驱动程序,因此它在非全局区域中无法工作。
  • 以下联网功能保留为系统范围内的功能,只能由全局管理员进行配置:
    • 路由
    • IP 多路径 (IP multipathing, IPMP)
    • 移动 IP
    • DHCP 客户机
    • 网络高速缓存和加速器 (Network Cache and Accelerator, NCA)
    • 使用 /etc/systemndd(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 进程间通信 (Interprocess Communication, IPC)

Solaris Zones 的基本设计原则是:非全局区域中的进程只能使用 IPC 与同一区域中的其他进程通信。对于基于文件系统的 IPC,例如管道(使用 fifofs)、 STREAMS(使用 namefs)、UNIX 域套接字(使用 sockfs)和 POSIX IPC,区域的唯一文件系统名称空间可确保 IPC 通信在区域内进行。

其他 IPC(例如 Solaris 门和 System V 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 卷管理器元设备。但是,全局区域管理员可将元设备导出到本地区域。
  • 全局区域管理员使用 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 驱动程序的每个实例表示一个全局区域/非全局区域对。该驱动程序可将 I/O 从全局区域传递到非全局区域,然后再反向传回。/dev/console/dev/msglog/dev/syscon/dev/sysmsg/dev/systty 都是到 /dev/zconsole 的符号链接。

5.5 进程

区域设计的一个基本原则是:非全局区域中的进程不能影响或查看在其他区域中运行的进程的活动。每个进程都与一 个区域关联。对进程可见性 的限制可通过限制 proc(4) 访问及其关联实用程序 proc(1) 所公开的进程 ID 来实施。

在非全局区域中,proc(4) 文件系统只公开该区域的进程。全局区域中的 proc 文件系统可显示在系统中运行的所有进程,包括所有非全局区域的进程。

尝试向其他区域中的进程发送信号或对其进行控制(例如,使用 /proc) 将产生错误代码或 ESRCH(对于 proc(4) 访问为 ENOENT),而非 EPERM。 只有全局区域中具有 PRIV_PROC_ZONE 权限的进程才可以向其他区域中的进程发送信号或对其进行控制。

5.6 资源管理

通过 Solaris 资源管理,系统管理员可以控制工作负荷资源使用情况。 Solaris OS 中的工作负荷与项目、任务以及进程实体相关联。传统的按进程进行的资源控制已扩展到任务和项目实体。

项目(像用户和组)是相关工作在网络范围内的管理标识符。任务将一组进程收集到表示工作负荷组件的可管理实体 中。

系统管理员使用 prctl(1) 来为运行的进程、任务和项目获取或设置资源控制。使用不带任何选项的 rctladm(1M) 命令将给出可由 prctl(1) 处理的系统资源控制列表。处理器集的永久配置机制已引入资源池概念。poolbind(1M) 可用于将进程、任务或项目绑定到资源池。

这些资源管理概念已得到扩展,以便使用区域。每个区域都有自己的 project(4) 数据库。向资源控制中添加了区域范围内的限制,以防止某个区域中的进程独占系统。全局区域管理员可以使用 rctladm(1M) 指定全局限制。非全局区域管理员可以使用 rctladm(1M) 来指定区域范围内的限制。

一个区域,一个资源池规则适用于非全局区域。这意味着非全局区域完全与池绑定。池中的所有资源 都在区域的所有进程间共 享。将非全局区域中的单个进程、任务或项目绑定到其他池的任何尝试都将失败。

5.7 软件包和修补程序数据库

每个区域都维护自己的软件包和修补程序数据库。可以从全局区域将软件包或修补程序单独安装到某个非全局区域 中,或安装到所有非全局区域 中。

区域环境中的打包行为会根据以下因素而有所变化:

    • pkgadd(1M) 中对 -G 选项的使用
    • pkginfo 文件中对 SUNW_PKG_ALLZONESSUNW_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)-设备控制
    -> ioctl(2) 并在适当位置使用 I_POPSTREAMS
    link(2)/unlink(2)-链 接到目录
    memcntl(2)-内存管理控制
    -> 具有 MC_LOCKMC_LOCKASMC_UNLOCKMC_UNLOCKAS
    mknod(2)-创建一个目录、特殊文 件或正规文件
    -> 以 S_IFCHRS_IFBLK 作为文件类型
    msgctl(2)-消息控制操作
    -> 使用 IPC_SET 并引发 msg_qbytes
    ntp_adjtime(2)-调整本地 时钟参数
    p_online(2)-返回或更改处理 器运行状态
    -> P_ONLINEP_OFFLINEP_NOINTRP_FAULTEDP_SPAREP_FORCED
    priocntl(2)-进程调度程序控 制
    -> 使用 PC_SETPARMSPC_SETXPARMSPC_ADMIN
    priocntlset(2)-一般性进 程调度程序控制
    -> 使用 PC_SETPARMSPC_SETXPARMSPC_ADMIN
    pset_bind(2)-将 LWP 绑定到处理器集
    pset_create(2), pset_destroy(2), pset_assign(2)- 管理处理器集
    pset_setattr(2)-设置处 理器集属性
    shmctl(2)-共享的内存控制操作
    -> 使用 SHM_LOCKSHM_UNLOCK
    socket(2)-创建通信端点
    -> 使用 SOCK_RAW
    stime(2)-设置系统时间和日期
    swapctl(2)-管理交换空间
    -> 使用 SC_ADDSC_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)-现场内核调试器
    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] System Administration Guide:Solaris Containers -- Resource Management and Solaris Zones, Sun Microsystems, Inc.

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

[3] System Administration Guide:Security Services, Sun Microsystems, Inc. 中的第 8 章:Using Roles and Privileges (Overview)

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

关于作者

Chien-Hua Yen 是 Sun Microsystems 市场开发工程部门的高级工程师。


除非另行说明,否则此处所有技术手册(包括文章、FAQ、样例)中的代码都按此许可提 供。