系统管理指南:Oracle Solaris Containers-资源管理和 Oracle Solaris Zones

第 2 章 项目和任务(概述)

本章讨论 Solaris 资源管理的项目任务功能。项目和任务用于标记工作负荷并将它们彼此分离。

本章包含以下主题:

要使用项目和任务功能,请参见第 3 章

Solaris 10 在项目数据库和资源控制命令方面的新增功能

Solaris 10 增强功能包括:

除了本章和第 6 章中包含的信息外,还可以参见以下手册页:

Solaris 10 5/08 增强功能包括为 projmod 命令添加了 -A 选项。请参见用于项目和任务的命令

有关 Solaris 10 新增功能的完整列表以及 Solaris 发行版的说明,请参见《Oracle Solaris 10 9/10 新增功能》

项目和任务功能

要优化工作负荷响应,必须首先能够识别要分析的系统上运行的工作负荷。此信息可能很难通过单独使用纯粹面向进程或面向用户的方法来获取。在 Solaris 系统中,您可以使用两个附加功能来分离和识别工作负荷: 项目和任务。项目为相关工作提供了网络范围内的管理标识符。任务将一组进程聚集成表示工作负荷组件的可管理实体。

project 名称服务数据库中指定的控制针对进程、任务和项目进行了设置。由于进程和任务控制通过 forksettaskid 系统调用继承,因此,所有在项目内创建的进程和任务都可继承这些控制。有关这些系统调用的信息,请参见 fork(2)settaskid(2) 手册页。

根据其项目或任务的成员关系,可以使用标准 Solaris 命令处理正在运行的进程。扩展记帐功能可以报告进程和任务的使用情况,并使用管理项目标识符标记每个记录。通过此进程,可以将脱机工作负荷分析与联机监视相互关联。项目标识符可以通过 project 名称服务数据库在多台计算机之间共享。这样,在(或跨)多台计算机上运行的相关工作负荷的资源占用情况最终可以在所有计算机上分析出来。

项目标识符

项目标识符是指用于标识相关工作的管理标识符。可以将项目标识符视为等同于用户标识符和组标识符的工作负荷标记。一个用户或组可以属于一个或多个项目。这些项目可用于表示允许用户(或用户组)参与的工作负荷。此成员关系然后可以作为费用分摊(例如基于使用情况或初始资源分配等)的基础。尽管必须为用户指定一个缺省项目,但是用户启动的进程可以与用户参与的任何项目关联。

确定用户的缺省项目

要登录到系统,必须为用户指定一个缺省项目。即使用户不在缺省项目中指定的用户或组列表中,此用户仍会自动成为该项目的成员。

由于系统上的每个进程都具有项目成员资格,因此,必须使用一种算法为登录或其他初始进程指定缺省项目。此算法在 getprojent(3C) 手册页中进行了介绍。系统按照顺序步骤确定缺省项目。如果找不到缺省项目,则会拒绝用户的登录或启动进程的请求。

系统按顺序执行以下步骤,以确定用户的缺省项目:

  1. 如果用户具有在 /etc/user_attr 扩展用户属性数据库中定义了 project 属性的某个条目,则 project 属性的值即为缺省项目。请参见 user_attr(4) 手册页。

  2. 如果 project 数据库中存在名为 user.user-id 的项目,则该项目即为缺省项目。有关更多信息,请参见 project(4) 手册页。

  3. 如果 project 数据库中存在名为 group. group-name 的项目,其中 group-name 是在 passwd 文件中指定的用户缺省组的名称,则该项目即为缺省项目。有关 passwd 文件的信息,请参见 passwd(4) 手册页。

  4. 如果 project 数据库中存在特殊的项目 default,则此项目即为缺省项目。

此逻辑由 getdefaultproj() 库函数提供。有关更多信息,请参见 getprojent(3PROJECT) 手册页。

使用 useraddusermodpassmgmt 命令设置用户属性

您可以使用以下带有 -K 选项和 key=value 对的命令在本地文件中设置用户属性:

passmgmt

修改用户信息

useradd

设置用户的缺省项目

usermod

修改用户信息

本地文件可包括以下内容:

如果正在使用某一网络命名服务(如 NIS)为本地文件补充其他条目,则这些命令不能更改该网络命名服务提供的信息。但是,这些命令确实可以根据外部命名服务数据库验证以下内容:

有关更多信息,请参见 passmgmt(1M)useradd(1M)usermod(1M)user_attr(4) 手册页。

project 数据库

您可以将项目数据存储在本地文件、网络信息服务 (Network Information Service, NIS) 项目映射或轻量目录访问协议 (Lightweight Directory Access Protocol, LDAP) 目录服务中。/etc/project 文件或命名服务在登录时使用,由可插拔验证模块 (pluggable authentication module, PAM) 发出的所有帐户管理请求使用它将用户绑定到缺省项目。


注 –

对项目数据库中条目的更新,无论是对 /etc/project 文件还是对网络命名服务中数据库表示形式的更新,都不会应用于当前活动的项目。使用 loginnewtask 命令时,会将更新应用于加入项目的新任务。有关更多信息,请参见 login(1)newtask(1) 手册页。


PAM 子系统

更改或设置身份的操作包括登录到系统、调用 rcprsh 命令,以及使用 ftp 或使用 su。当操作涉及更改或设置身份时,会使用一组可配置的模块来提供验证、帐户管理、证书管理和会话管理。

项目的帐户管理 PAM 模块在 pam_projects(5) 手册页中进行介绍。有关 PAM 的概述,请参见《系统管理指南:安全性服务》中的第 16  章 “使用 PAM”

命名服务配置

资源管理支持命名服务 project 数据库。/etc/nsswitch.conf 文件中定义了 project 数据库的存储位置。缺省情况下,会先列出 files,但是源可以按任意顺序列出。


project: files [nis] [ldap]

如果列出了多个项目信息源,则 nsswitch.conf 文件会指示例程开始在列出的第一个源中搜索信息,然后搜索后续源。

有关 /etc/nsswitch.conf 文件的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的第 2  章 “名称服务转换器(概述)”nsswitch.conf(4)

本地 /etc/project 文件格式

如果在 nsswitch.conf 文件中选择 files 作为 project 数据库源,则登录进程会在 /etc/project 文件中搜索项目信息。有关更多信息,请参见 projects(1)project(4) 手册页。

对于系统识别的每个项目,project 文件均包含以下形式的单行条目:


projname:projid:comment:user-list:group-list:attributes

字段定义如下:

projname

项目的名称。该名称必须是由字母数字字符、下划线 (_) 字符、连字符 (-) 和句点 (.) 组成的字符串。句点是为对操作系统有特殊意义的项目保留的,只能将其用在用户的缺省项目名称中。projname 不能包含冒号 (: ) 或换行符。

projid

系统内项目的唯一数字 ID (PROJID)。projid 字段的最大值为 UID_MAX (2147483647)。

comment

项目的说明。

user-list

允许参与项目的用户的列表(以逗号分隔)。

此字段中可以使用通配符。星号 (*) 允许所有用户参与项目。感叹号后跟星号 (!*) 可将所有用户排除在项目之外。感叹号 (!)后跟用户名可将指定用户排除在项目之外。

group-list

允许参与项目的用户组的列表(以逗号分隔)。

此字段中可以使用通配符。星号 (*) 允许所有组参与项目。感叹号后跟星号 (!*) 可将所有组排除在项目之外。感叹号 (!)后跟组名可将指定组排除在项目之外。

attributes

用分号分隔的名称-值对列表,如资源控制(请参见第 6 章)。name 是指定与对象相关的属性的任意字符串,value 是该属性的可选值。


name[=value]

在名称-值对中,名称仅可包含字母、数字、下划线和句点。句点通常用作资源控制 (rctl) 的类别和子类别之间的分隔符。属性名称的第一个字符必须是字母。名称区分大小写。

可以在值中使用逗号和括号结构以便确立优先级。

分号用于分隔名称-值对。不能在值定义中使用分号。冒号用于分隔项目字段。不能在值定义中使用冒号。


注 –

如果读取此文件的例程遇到格式错误的条目,则这些例程会停止。不会分配错误条目后指定的任何项目。


以下示例显示了缺省的 /etc/project 文件:


system:0:System:::
user.root:1:Super-User:::
noproject:2:No Project:::
default:3::::
group.staff:10::::

以下示例显示了在结尾添加了项目条目的缺省的 /etc/project 文件:


system:0:System:::
user.root:1:Super-User:::
noproject:2:No Project:::
default:3::::
group.staff:10::::
user.ml:2424:Lyle Personal:::
booksite:4113:Book Auction Project:ml,mp,jtd,kjh::

您还可以将资源控制和属性添加到 /etc/project 文件:

NIS 的项目配置

如果正在使用 NIS,则可以在 /etc/nsswitch.conf 文件中进行指定,以便在 NIS 项目映射中搜索项目:


project: nis files 

NIS 映射(project.bynameproject.bynumber)与 /etc/project 文件具有相同的形式:


projname:projid:comment:user-list:group-list:attributes

有关更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的第 4  章 “网络信息服务 (Network Information Service, NIS)(概述)”

LDAP 的项目配置

如果正在使用 LDAP,则可以在 /etc/nsswitch.conf 文件中进行指定,以便在 LDAP project 数据库中搜索项目:


project: ldap files

有关 LDAP 的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的第 8  章 “LDAP 名称服务介绍(概述/参考)”。有关 LDAP 数据库中项目条目结构的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的“Solaris 架构”

任务标识符

每次成功登录到项目时,都会创建一个包含登录进程的新任务。任务是指表示一段时间内一组工作的进程集。任务也可以视为工作负荷组件。会为每个任务自动指定一个任务 ID。

每个进程都是一个任务的成员,而每个任务都与一个项目关联。

图 2–1 项目和任务树

图中显示项目下有三个任务,而每个任务下有两到四个进程。

任务还支持对进程组执行的所有操作,如信号传送。您还可以将任务绑定到处理器集,并为任务设置调度优先级和类,优先级和类会修改任务中的所有当前进程以及后续进程。

每次加入项目时,就会创建任务。以下操作、命令和函数可创建任务:

您可以使用以下方法之一创建最终任务。所有进一步创建新任务的尝试都将失败。

有关更多信息,请参见 login(1)newtask(1)cron(1M)su(1M)setproject(3PROJECT) 手册页。

扩展记帐功能可以为进程提供记帐数据。此数据在任务级别聚合。

用于项目和任务的命令

下表中所示的命令提供了项目和任务功能的主要管理接口。

手册页参考 

说明 

projects(1)

显示用户的项目成员关系。列出 project 数据库中的项目。列显指定项目的信息。如果未提供项目名称,则显示所有项目的信息。使用带有 -l 选项的 projects 命令可列显详细输出。

newtask(1)

执行用户的缺省 shell 或指定命令,将执行命令放在指定项目拥有的新任务中。newtask 还可以用于为正在运行的进程更改任务和项目绑定。与 -F 选项一起使用,以创建最终任务。

passmgmt(1M)

更新口令文件中的信息。与 -K key=value 选项一起使用,可在本地文件中添加或替换用户属性。

projadd(1M)

将新项目条目添加到 /etc/project 文件。projadd 命令仅在本地系统上创建项目条目。projadd 不能更改网络命名服务提供的信息。

可用于编辑除缺省文件 /etc/project 之外的项目文件。为 project 文件提供语法检查。验证和编辑项目属性。支持标度值。

projmod(1M)

在本地系统上修改项目信息。projmod 不能更改网络命名服务提供的信息。但是,此命令确实可以根据外部命名服务验证项目名称和项目 ID 的唯一性。

可用于编辑除缺省文件 /etc/project 之外的项目文件。为 project 文件提供语法检查。验证和编辑项目属性。可用于添加新属性,向属性添加值或者删除属性。支持标度值。

从 Solaris 10 5/08 发行版开始,可与 -A 选项一起使用,以便将在项目数据库中找到的资源控制值应用到活动项目。与 project 文件中定义的值不匹配的现有值(例如通过 prctl 命令手动设置的值)都会被删除。

projdel(1M)

从本地系统中删除项目。projdel 不能更改网络命名服务提供的信息。

useradd(1M)

向本地文件添加缺省项目定义。与 -K key=value 选项一起使用,可添加或替换用户属性。

userdel(1M)

删除本地文件中的用户帐户。 

usermod(1M)

修改系统上的用户登录信息。与 -K key=value 选项一起使用,可添加或替换用户属性。