限定应用程序使其支持非全局区域的最佳做法


作者:Chien Yen,发布时间:2006 年 3 月  
摘要:本文介绍对应用程序进行限定使其支持非全 局区域的最佳做法。本文将 着重论述 Solaris Containers 的 Solaris Zones 功能。
目录
 
1. 介绍
2. 限定过程
3. 逐步限定过程
4. 背景信息
5. 参考资料
6. 致谢
7. 关于作者
 
1. 介绍

Solaris Containers 技术提供一个虚拟的运行时环境,它对应用程序所使用的系统资源(例如 CPU)进行了限制。Solaris Containers 有两个组件:资源管理和 Solaris Zones。

Solaris Containers 的资源管理部分说明每个应用程序会占用多少系统资源。例如,可以将某些 CPU 专用于某个特定的应用程序,或者在保留必须保证的、最低数量的 CPU 的同时允许不同的应用程序共享 CPU。有两项技术分别被称为“动态资源池”和“公平共享调度程序”,这就是允许将 CPU 专用于某个应用程序,以及允许在最低保证的情况下实现共享。

Solaris Zones 分区技术用于虚拟化操作系统服务,并提供安全的隔离环境以便承载和运行应用程序。有两种不同类型的区域 (zone):全 局区域 (global zone) 和非全局区域 (non-global zone)。

Solaris Containers 提供一个虚拟环境,可通过服务器整合来降低总体拥有成本 (total cost of ownership, TCO)。管理员可以使用资源管理工具以及区域来创建环境,这些环境称为容器,可用于隔离应用程序并共享系统资源。通过资源共享,可以提高资源利用率,并 且有助于降低总成本。

初次安装 Solaris 10 操作系统 (Operating System, OS) 时,不会安装任何附加的容器;仅存在完整的 OS,即所谓的全局区域。此全局区域的管理员负责通过安装非全局区域,并为这些区域指定资源管理规则来创建所有附加容器。不同容器中的进程彼此是隔离的。 这是通过阻止进程从一个非全局区域觉察到另一个非全局区域来得以实现的。

某些约束适用于非全局区域进程,从而实现容器隔离。第 4 节介绍了这些约束的详细信息。由于存在这些约束,非全局区域中的进程可能会因以下原因导致无法正常工作:

  • 某些具有权限的系统调用失败
  • 某些设备节点和文件系统不可用
  • 网络控制功能受到限制

因此,为了使应用程序支持非全局区域,建议对应用程序进行限定。

本文介绍对应用程序进行限定使其支持非全局区域的最佳做法。出于以下原因,本文将着重论述 Solaris Containers 的 Solaris Zones 部分:

  • 对于应用程序限定,Solaris Containers 的资源管理方面是透明的。
  • Solaris Zones 功能对应用程序引入了一些新的限制。

根据应用程序类型、区域配置和工程设计资源的可用性,建议执行几个限定过程,使 ISV 可以选择最适合其需要的进程。本文档提供这些限制的技术背景、限定过程以及针对区域限定应用程序的逐步过程。

本文涉及 Solaris Ready Test Suite 1.1(或更高版本);此套件用于帮助您确认您的应用程 序是否会在 Solaris 10 OS 上成功运行。该套件包括 Solaris 应用程序扫描程序,一种适合于应用程序 ELF 二进制代码和源代码的快速扫描工具。该扫描程序主要用于检查近期由接口导致的某些故障,或不属于 Solaris 发行版的库。还包括 DTrace 脚本,用于检查系统调用、因信号故障导致的应用程序崩溃,以及系统资源使用情况,而且还列出了打开的所有文件和端口。

2. 限定过程

非全局区域的限定过程可能最多涉及三个单独的操作:

  1. 在非全局区域中执行应用程序限定。如果没有发现任何错误,系统还会针对全局区域来限定应用程序。
  2. 在全局区域中调用脚本以监视在全局区域或在非全局区域中执行的测试操作。此操作将帮助测试工程师确定与 区域限制有关的错误原因。
  3. 扫描应用程序源代码,了解与非全局区域不兼容的 API 和设备节点的使用情况。如果该工具没有报告任何问题,应用程序就可能同时在全局区域和非全局区域中工作。此操作增加了在操作 1 中执行的测试的信任级别。

对于要对其应用程序添加非全局区域支持的 ISV,建议执行操作 1。ISV 可以选择执行上述所有三项操作、其中的任何一项操作,或这些操作的组合。操作 2 和 3 仅检测运行时错误。如果 ISV 决定仅执行操作 2 或操作 3,则需要单独执行非全局区域中的附加安装测试。

ISV 根据以下因素决定要使用哪个限定流程:

  • 应用程序类型:权限与非权限以及设备使用情况
  • 区域配置:文件系统、设备节点、网络以及需要导出到区域中的系统资源
  • 测试环境:多级 (tier) 与多层 (layer) 软件堆栈
  • 测试套件:权限与非权限
  • 工程设计资源

下面给出了每个操作及其执行过程和后果的简要论述。此论述假设典型的应用程序测试过程执行以下操作:

  • 由专门的测试小组执行
  • 遵循定义以下内容的测试计划:
    • 测试环境
    • 测试中使用的工具
    • 安装过程
    • 功能测试
    • 性能测试
    • 接受条件
  • 包括开发小组用于解决测试小组所发现问题的错误报告机制

操作 1:在非全局区域中执行应用程序限定。

由于非全局区域比全局区域的约束更多,因此在非全局区域中成功测试后,就会自动为全局区域限定应用程序。此操 作要求 ISV 首先决定一项区域配置或一组区域配置,然后在非全局区域中执行应用程序安装、功能和性能测试。第 3.1 节中显示了样例区域配置设置。

必须更新测试计划,以反映附加的区域配置和设置过程。此操作还要求 ISV 在非全局区域中安装和初启功能和性能测试所需的所有测试套件、工具以及其他软件堆栈层。如果工具无法在非全局区域中运行,可能需要对测试工具进行修改。

此操作提供所有操作中最完整的测试和最高的信任级别。但是,它需要的工程设计资源比其他操作更多。

操作 2:在全局区域或非全局区域中执行应用程序限定以及监视脚本。

上面提到的套件提供了一个实用程序,用于监视应用程序使用的设备节点以及非全局区域中不可用的权限。开始限定 测试之前,应先在全局区域 中启动该套件。可以 在全局区域或非全局区域中执行限定测试。如果该套件没有标记任何警告,则应用程序很可能会在非全局区域中成功运行。

如果出现以下情况,则应使用此操作:

  • 不能对要测试的非全局区域提供测试工具和其他所需的软件堆栈,或者
  • 需要跟踪仅在非全局区域中出现的问题。

操作 2 可以与操作 1 一同执行。在这种情况下,监视脚本将监视非全局区域中运行的进程,并且用于确定在操作 1 中所发现错误的原因。对现有测试过程执行的更改处于最低程度。

安装限定将通过单独的测试执行。功能和性能测试在全局区域中执行。

操作 3:扫描应用程序源代码,了解与非全局区域不兼容的 API 的使用。

该套件包括一个实用程序,用于扫描 ISV 应用程序的源代码,了解非全局区域中不受支持的 API 和设备节点的使用。此外,该套件还将扫描第三方库的 ELF 二进制代码,了解第三方二进制代码中与区域不兼容的 API 的使用。该套件的输出将帮助开发小组确定与非全局区域支持有关的应用程序的潜在问题。此操作对应用程序源代码和二进制代码执行静态扫描,因而不要求测试工 程师运行该应用程序。

该工具还将扫描第三方库,了解第三方二进制代码中与区域不兼容的 API 的使用。开发小组使用该工具确定支持非全局区域的应用程序的潜在问题。该工具可以报告如 open(2)、ioctl(2)、socket(2)、link(2) 以及 unlink(2) 等函数的一些确定的误报。确定的误报可能是由于以下因素导致的:

  • 获取传递给函数的变量参数的难度
  • 该工具的设计目标,即报告可能导致应用程序出现故障的所有潜在问题

此操作对现有测试过程可能没有影响或影响程度最低。通过此操作,开发小组承担了在非全局区域中限定应用程序的 大多数负担。这可能不是件 坏事,因为如果在测 试过程中发现了问题,无论如何也需要涉及到开发小组。可能需要单独的安装测试或文档形式的安装指南来说明潜在的安装问题。

3. 逐步限定过程

本节介绍在非全局区域中限定应用程序的逐步过程。

3.1 在非全局区域中执行应用程序限定

步骤 1:决定限定测试的区域配置。

区域配置可能会影响应用程序操作。可以为非全局区域配置以下资源类型:

  • inherit-pkg-dir:回送挂载到区域中的系统目录
  • fs:要从全局区域向非全局区域公开的文件系统
  • device:要向区域公开的设备节点
  • net:要向区域公开的网络接口
  • rctl:资源控制的名称和值对-请参见 prctl(1)
  • pool:与区域绑定的资源池的名称

zonecfg(1M) 命令用于创建和修改这些资源类型。

缺省区域配置使用回送文件系统 lofs(7FS) 将全局区域的 /lib/platform/sbin/usr 目录挂载到非全局区域,作为只读文件系统。如果应用程序安装需要写入这些目录,则区域管理员应该使用以下方法将可写目录导出到区域。

global# mkdir /anyDir/myInstallDir  // create the dir to be exported to the zone
global# mkdir /usr/myInstallDir // create the mount point
global# zonecfg -z my-zone
zonecfg:my-zone> add fs
zonecfg:my-zone:fs> set dir=/usr/myInstallDir
zonecfg:my-zone:fs> set special=/anyDir/myInstallDir
zonecfg:my-zone:fs> set type=lofs
zonecfg:my-zone:fs> set options=[rw,nodevices]
zonecfg:my-zone:fs> end

本示例创建了一项缺省区域配置并允许写入 my-zone 中的 /usr/myInstallDir, 从而可将软件安装在 /usr/myInstallDir 中。

步骤 2:创建非全局区域。

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

global# zonecfg -z my-zone
zonecfg:my-zone> create
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:> add fs
zonecfg:my-zone:fs> set dir=/cdrom
zonecfg:my-zone:fs> set special=/cdrom
zonecfg:my-zone:fs> set type=lofs
zonecfg:my-zone:fs> set options=[nodevices]
zonecfg:my-zone:fs> 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   
global# zoneadm -z my-zone boot

在安装后初次引导某一区域时,该区域没有用于命名方案的内部配置,没有语言环境 (Locale) 或时区,没有超级用户口令等。需要访问区域的控制台,以应答提示并进行设置。应使用 zlogin(1M) 命令来执行此操作:

# zlogin -C my-zone

步骤 3:在非全局区域中安装应用程序。

此时,ISV 测试工程师应该能够将 ISV 应用程序安装到非全局区域中。

在典型的软件安装中,应该将软件安装 CD/DVD 导出到非全局区域。由于 vold(1M) 不在非全局区域中运行,因此测试工程师必须手动挂载 CD/DVD。此操作可通过从全局区域回送挂载 /cdrom 目录来得以实现。步骤 2 中给出的示例显示如何从全局区域回送挂载 /cdrom 目录。

步骤 4:执行限定测试。

将应用程序成功地安装到非全局区域中后,测试工程师可以执行限定测试,就像在常规的 Solaris 系统上安装应用程序一样。就访问系统资源和内核服务的权限、设备可用性、联网能力而言,非全局区域对应用程序的限制比全局区域更多。因而,在非全局区域中 成功完成限定测试,可以保证应用程序会在全局区域中正常工作。

步骤 5:处理限定故障。

如果非全局区域限定测试中出现故障,测试工程师应先检查故障,然后再将其报告给开发小组。对于由区域配置(如 某个特定设备不可用、写入 只读文件系统或资源 约束)导致的故障,可以使用不同的区域配置对故障加以更正。但是,如果故障是由权限不足而导致的,则只能通过更改代码来修复此故障。在这类情况下,必须将 故障报告给开发小组进行评估。参考资料中的文章 "Bringing Your Application Into the Zone"[6] 提供了 API 权限故障的解决方法。

步骤 6:执行操作 2 和 3(可选)。

此操作不能捕获到可能导致性能降低或应用程序功能缺失的无提示错误。为了最大程度地确保非全局区域中应用程序 的质量,建议在全局区域中 运行 srcheck, 以监视权限和设备节点使用情况(操作 2)并扫描源代码库,以了解应用程序中不受支持的 API 的使用(操作 3)。

3.2 使用 Solaris Ready Test Suite 1.1 或更高版本在全局区域中执行应用程序限定

步骤 1:安装 Solaris Ready Test Suite

安装 Solaris Ready Test Suite 后,请在 bin 目录中运行 srchecksrcheck 是专门为 Solaris Ready 程序[7] 开发的测试套件,用于检查应用程序在 Solaris OS 上运行的兼容性以及质量。srcheck 包括几项检查,用于测试应用程序是否与 Solaris OS 兼容。关于 Solaris Zones 兼容性测试,srcheck 包括:

  • 用于在运行时期间监视与区域不 兼容的 API 和设备节点使用的脚本
  • 用于扫描应用程序源代码以了解与区域不兼容的 API 和设备节点使用的实用程序
  • ABI 检查工具 abiscan
  • 开始常规的应用程序测试之前,应该调用 srcheck

    步骤 2:在全局区域中安装应用程序。

    测试工程师以常规方式安装应用程序。

    步骤 3:运行 srcheck

    测试工程师在开始应用程序限定测试之前,必须先运行 srcheck。 如果限定测试具有性能套件,则可以 将 srcheck 与性能测试套件一同使用。但是,应注意 srcheck 可能会带来系统开销,因此建议不要在 srcheck 仍然处于运行状态时获取性能数字。运行性能测试套件和 srcheck,以了解实行的代码是否会在非全局区域中正常工作。如 果测试通过,请重新运行测试(而不要运行 srcheck)以获取准确的性能数据。

    在运行 srcheck 以在非全局区域 my-zone4 中监视命令 dateifconfigmdbdrvconfig 10 分钟的示例中,srcheck 的输入参数如下所示:

    % srcheck -n "My Application Name" -i App_dir -c date,ifconfig \
    -t 600 -z my-zone4

    十分钟后,将使用 /tmp/srcheck.28838/summary_report.txt 中的 srcheck 的汇总输出为 srcheck 进程 ID 28838 创建 /tmp/srcheck.28838/

    如果在非全局区域中执行 dateifconfigmdbdrvconfig 命令中的任何一个,则 my-zone4 将执行以下操作:

    • 使用在非全局区域中可用的权限,并
    • 打开在非全局区域中不可用的设备节点。

    这将被记录在 /tmp/srcheck.28838/summary_report.txt 中。

    步骤 4:执行限定测试。

    测试工程师在全局区域中执行限定测试。(srcheck 可用于监视非全局区域中运行的进程。但是,前提条件是假设限定测试是在全局区域中执行的。)

    步骤 5:处理由脚本报告的问题。

    srcheck 将其输出置于 /tmp/srcheck.pidXXX 中,其中 pidXXXsrcheck 的进程 ID。汇总报告 summary_report.txt 是在该目录中创建的。应将 srcheck 标记的所有问题都报告给开发小组。请参见参考资料中的文章 "Bringing Your Application Into the Zone"[6], 了解某些问题的解决方法。

    % cat / tmp/srcheck.28838/summary_report.txt

    ******************************************************************************
    System: i86pc
    Processor: 2-1792MHz AMD Opteron(tm) Processor 244, Memory: 2048 Megabytes
    OS: SunOS xian-60 5.10 Generic, amd64
    Date: Mon Jan 9 21:31:07 PST 2006
    ******************************************************************************
    SRcheck command line: /tmp/srcheck/bin/srcheck -n test1 -i /
    export/home/ws/onnv/usr/src/cmd/cmd-inet/ -t 50

    Solaris 10 COMPATIBILITY - SUMMARY REPORT

    Source code analysis - "c" code: ISSUES: 24 OCCURRENCES: 192
    details: /tmp/srcheck.7627/private/srcheck_scan/reports/srcheck.pscore_c.log
    Source code analysis - "h" code: ISSUES: 0 OCCURRENCES: 0

    Source code analysis - "shell" code: ISSUES: 2 OCCURRENCES: 2
    details: /tmp/srcheck.7627/private/srcheck_scan/reports/shell_lines.txt
    Source code analysis - "perl" code: ISSUES: 15 OCCURRENCES: 15
    details: /tmp/srcheck.7627/private/srcheck_scan/reports/srcheck.perlscan_pl.log
    ==============================================================================
    appcheck output

    Program Name Privilege Count
    ifconfig PRIV_SYS_NET_CONFIG 1
    drvconfig PRIV_SYS_CONFIG 1
    date PRIV_SYS_TIME 1


    Program Name Device Node Count
    drvconfig /devices/pseudo/devinfo@0:devinfo 1
    ifconfig /dev/udp 1
    mdb /dev/ksyms 1

    步骤 6:在非全局区域中安装应用程序。

    Solaris Ready Test Suite 不能检测安装问题。因此,建议执行第 3.1 节中的步骤 3,确保可以将应用程序安装在非全局区域中。

    步骤 7:执行操作 3(可选)。

    此操作将捕获在 QA 测试中实行的代码路径中的区域错误。为确保最大程度地扩大代码适用范围,建议在全局区域中运行 srcheck, 以扫描源代码库,了解应用程序中不受支持的 API 的使用(操作 3)。

    3.3 扫描应用程序源代码,了解与区域不兼容的 API 的使用

    步骤 1:运行 srcheck

    srcheck 将解析指定目录的 C、C++ 和 shell 脚本文件中的应用程序源代码,以检查在非全局区域中可能返回错误的以下各项的使用:

    • API
    • 设备节点
    • 命令

    srcheck 还将运行 ABI 检查工具 abiscan 并检查第三方供应商的二进制可执行文件和动态库中的区域兼容性问题。

    该工具的典型用法如下:

    % srcheck -n "My Application Name" -i /home/johndoe/src -t 0

    srcheck 会产生多个报告,包括发现的所有问题的汇总报告。

    步骤 2:评估 srcheck 报告。

    开发小组应评估 srcheck 报告,以确定这些报告中的问题是否可以阻止应用程序在非全局区域中运行。正如在第 3 节中说明的,报告中的某些项可能不是真正的有价值的问题,可以予以忽略。可能会报告某些确定的误报的函数示例有 open(2)、socket(2)、link(2)、unlink(2) 以及 ioctl(2)。

    步骤 3:在全局区域中安装应用程序。

    测试工程师以常规方式安装应用程序。

    步骤 4:在全局区域中执行限定测试。

    测试工程师以常规方式执行限定测试。

    步骤 5:在非全局区域中安装应用程序。

    Solaris Ready Test Suite 不能检测安装问题。因此,建议执行第 3.1 节中的步骤 3,确保可以将应用程序安装在非全局区域中。

    步骤 6:执行操作 2(可选)。

    此操作会报告系统调用 link(2)、ioctl(2)、socket(2)、open(2) 以及 unlink(2) 的许多确定的误报。为了交叉检查这些系统调用的使用,建议在全局区域以及 QA 测试中运行 srcheck, 以监视应用程序中的权限和设备节点使用情况(操作 2)。

    4. 背景信息

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

    • 降低的进程权限、
    • 资源和服务虚拟,以及
    • 仅通过网络进行的区域间通信。
    4.1 降低的进程权限

    Solaris 10 OS 引入了进程权利管理,该功能扩展了 Solaris 进程模型和权限集,并使用这些权限集控制系统资源和内核服务的进程访问。进程可以是以下两种类型之一:

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

    如果进程是 PA,则内核仅检查系统操作的进程权限。如果进程是 NPA,则内核将检查 UID 和进程权限。进程可以使用 setpflags(2) 试图成为 NPA。

    每个权限集包含零个或多个权限。每个进程有四个权限集。其中一个权限集是有效 (E) 权限集,决定进程是否可以使用特定权限。

    这四个权限集包括:

    • E,有效权限集:当前有效的权限集
    • P,允许权限集:进程最大的权限集
    • I,可继承的权限集:根据 exec(2) 继承的权限集
    • L,限制权限集:进程及其后代可以获取的权限的上限

    目前,为权限集定义了 48 种权限。privileges(5) 列出了这些权限及其定义。ppriv(1) 可用于检查或修改进程权限集。

    对于在非全局区域中运行的所有进程,权限都降低了。这意味着非全局区域中的所有进程都受创建进程 时为其分配的权限集合的约束。表 1 列出了非全局区域中的进程所具有的权限。由于非全局区域中的进程权限降低了,因此某些系统调用可能会返回错误。在大多数情况下,没有权限的进程会返回 EPERM。 某些检查 PRIV_CPC_CPUPRIV_NET_RAWACCESS 的系统调用会返回 EACCESS

    应该注意的是,只有非全局区域中的特权应用程序会受到降低的进程权限的影响。传统的非特权应用程 序仅具有下表中以粗体突出显示的五种基 本权限。这五种基本 权限可用于非全局区域。

    表:1 Solaris 权限

        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

    4.2 Solaris Zones 资源和服务虚拟

    Solaris Zones 功能对以下资源和服务进行虚拟化,当一个进程的活动与其他区域中的进程隔离时,该进程需要这些资源和服务才能在操作环境中运行:

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

    以下联网限制适用于非全局区域:

    • IPQoS 和 IPsec 配置、ipqosconf(1M) 以及 ipsecconf(1M) 只能在全局区域中执行。通过为配置指定区域的 IP 地址,可以创建特定于区域的配置。
    • 在非全局区域中不允许对传输层以下的层进行原始访问(例如,使用 IP、ARP 和 DLPI 与链路层通信)。因此,使用 DLPI 与链路层(NIC 设备驱动程序)直接通信将会产生错误。snoop(1M) 在非全局区域中无法工作,因为它使用 DLPI 直接访问接口驱动程序。
    • 以下联网功能保留为系统范围内的功能,只能由全局管理员进行配置:
      • 路由
      • IP 多路径 (IP Multipathing, IPMP)
      • 移动 IP
      • DHCP 客户机
      • 网络高速缓存和加速器 (Network Cache and Accelerator, NCA)
      • 通过 /etc/systemndd(1M) 进行联网调优
      • IP 过滤器
    文件系统

    尽管可在其他区域中共享全局区域文件系统,但每个区域都有自己的文件系统名称空间。缺省区域配置 使用回送虚拟文件系统 lofs(7FS) 将几个全局区域的系统目录(如 /usr/lib/platform/sbin)回送挂载到非全局区域。除了 lofs(7FS) 以外,您还可以在非全局区域中本地挂载以下目录:autofstmpfs(7FS)、mntfsctfs(7FS)、procfs 以及 NFS 客户机。

    进程间通信 (Interprocess Communication, IPC)

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

    其他 IPC(例如 Solaris 门和 System V IPC)将区域 ID 附加到通信对象中,使得区域中运行的进程只能访问或控制与同一区域关联的对象。

    设备

    设备通常是系统中的共享资源。因此,要使设备在区域中可用,需要规定一些限制,以免破坏区域隔离 原则。由于存在以下约束,/dev 目录将受到严格限制:

    • 公开系统数据的设备只能在全局区域中使用。此类设备的示例包括:dtrace(7D)、kmem(7D)、ksyms(7D)、kmdb(7D)、trapstat(1M)、lockstat(7D) 等。
    • /dev 名称空间由符号链接(逻辑路径)组成,通过这些符号链接可转到 /devices 中的物理路径。只在全局区域中可用的 /devices 名称空间可反映由驱动程序创建的附加设备实例的当前状态。只有逻辑路径 /dev 在非全局区域中可见。
    • 在非全局区域初启过程中,zoneadmd(1M) 将创建一个特定于区域的 /dev, 然后在非全局区域根下回送挂载 /dev 目录。全局管理员使用 zonecfg(1M) 来指定要在特定区域中显示的设备。非全局区域中的 /dev 项的数目比全局区域中的 /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 的符号链接。
    进程文件系统

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

    在区域中,proc(4) 文件系统仅公开该区域的进程。全局区域中的 /proc 文件系统将显示系统中运行的所有进程,包括所有其他区域的进程。

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

    软件包和修补程序数据库

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

    建议使用 smpatch(1M) 在全局区域中分析、下载、应用和删除修补程序,然后在非全局区域中运行 showrev(1M) 以获取有关非全局区域的修补程序的修订信息。如果修补程序管理是必要的,则可以使用 patchadd(1M) 和 patchrm(1M) 分别在非全局区域中应用和删除修补程序。

    5. 参考资料
    1. System Administration Guide:Solaris Containers-Resource Management and Solaris Zones, Sun Microsystems, Inc.
    2. BigAdmin System Administration Portal - Solaris Zones
    3. "Chapter 8: Using Roles and Privileges (Overview)", System Administration Guide:Security Services, Sun Microsystems, Inc.
    4. Solaris 10 Reference Manual Collection, Sun Microsystems, Inc.
    5. Chien-Hua Yen,Solaris Zones Partitioning Technology,2005 年 3 月
    6. Paul Lovvik, Joseph Balenzano, Bringing Your Application Into the Zone, Sun Developer Network
    7. The Solaris Ready Logo Program
    8. Menno Lageman,Solaris Containers - What They Are and How to Use Them (pdf),Sun BluePrints,2005 年 5 月
    9. OpenSolaris Zones and Containers FAQ,由 Jeff Victor 等人维护
    6. 致谢
    非常感谢 Joseph Balenzano、Prashant Srinivasan、Joost Pronk Van Hoogenveen 和 Frederick Rehhausser 帮助审阅本文档。
     
    7. 关于作者
    Chien-Hua Yen 是 Sun Microsystems 市场开发工程部门的高级工程师。