Java Solaris 加入Sun中国技术社区 我的社区 注册说明

BigAdmin 系统管理门户网站
Feature Article

Solaris Zones 分区技术

Chien Yen,2005 年 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) 执行下列操作:
    • 创建和初始化内核区域结构和钩子 (hook)。
    • 创建 /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 区域根文件系统

配置非全局区域的根文件系统有两种方法:完全根模型 (whole-root model)稀疏根模型 (sparse-root model)

完全根模型将所有必需的软件包和任何选定的可选 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-父进程的有效权限集
    C.P-父进程的允许权限集
    C.I-父进程的可继承权限集
    C.L-父进程的限制权限集
    C'.E-子进程的有效权限集
    C'.P-子进程的允许权限集
    C'.I-子进程的可继承权限集
    C'.L-子进程的限制权限集

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

公式 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 节总结了在非全局区域中调用时可能返回错误的系统调用、库函数和命令。

所有权限		区域权限
 =========================================================
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] 《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》,Sun Microsystems, Inc.

    [2] BigAdmin 系统管理门户-Solaris 区域,Sun Microsystems, Inc.

    [3]《系统管理指南:安全性服务》中的第 8 章“使用角色和权限(概述)”,Sun Microsystems, Inc.

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


    关于作者

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


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