Solaris Resource Manager 1.3 系统管理指南

第 3 章 配置

Solaris Resource Manager 可为中央系统管理员提供进行配置的极大灵活性(例如,root 用户)。本章介绍以下配置内容:

内核启动参数

内核具有可被中央管理员在内核启动时设定的 Solaris Resource Manager 参数。Solaris 系统会在启动时读取 /etc/system 文件,并使用它来配置内核模块(有关详情,请参阅 system(4))。能在 SHR 模块(均为 32- 位整数)中设置并能覆盖 Solaris Resource Manager 缺省行为的参数是:

SRMLnodes

要在内核中进行高速缓存的 lnode 的数目。在 Solaris 系统上,每个内核 lnode 需要大约 3 千字节。零值(缺省值)的意思是内核将确定其值。所采用的试探方法为:

(nproc / SRMProcsPerUid ) + SRMLnodesExtra

其中, nproc 是系统中所允许的同时进程的最大数目。最小值6覆盖这一计算。SRMMemoryMax 所指定的最大值也将覆盖这一计算。

SRMProcsPerUid

所期待的每个用户所使用的进程的平均数目。缺省值为 4。

SRMLnodesExtra

试探方法中所使用的一个边缘数,用于确定内存内 lnode 数组的大小。缺省值为 20。

SRMNhash

散列表中的条目数,用于将 UID 值映射到内核中的 lnode。在 Solaris 系统上,每个条目均为 4 字节长。缺省值为零,意思是使用与 lnode 数目一样的值。

SRMMemoryMax

该值的倒数是一个分数,指定用于 Solaris Resource Manager lnode 和散列表两者的真实内存的最大百分比。缺省值为 20,意思是最大百分之五的真实内存将用于 Solaris Resource Manager 数据结构。

SRMMemWarnFreq

单一 lnode 的"内存超出"通知警告之间的最小间隔,以秒为单位。缺省值为 4。

例如,在 /etc/system 文件中:

set srmlim:SRMMemWarnFreq=10

行将确保内存针对任意单个用户的超出消息的发出频率不得超过每 10 秒钟一次。

还有某些参数不在 Solaris Resource Manager 之中,但也可影响其行为。其中包括:

initclass

这是在其中开始 init(1M) 进程的调度类的名称。在 Solaris Resource Manager 下,这应被看作是字符串 'SHR'(包括双引号字符)。缺省 Solaris 值为 'TS'。要使用 Solaris Resource Manager 进行 CPU 资源控制,则应在 /etc/system 文件中加入下列一行:

set initclass='SHR'

用于覆盖缺省值:

extraclass

这是一个要加载的调度类模块的名称,不必非要将其用作缺省的调度类。如要只是将 Solaris Resource Manager 用于非 CPU 资源控制,则 /etc/system 文件中应包含下列一行:

set extraclass='SHR'

要启动未装载 Solaris Resource Manager 的系统,请使用名为 /etc/system.noshrload 的替代 /etc/system 文件。请参阅不带 Solaris Resource Manager 的启动 以了解有关该进程的指示。

多用户启动配置

在正常的系统启动过程中,当系统从单用户模式变为多用户模式时,则会运行一个 Solaris Resource Manager 初始化脚本(请参阅 附录 A,Solaris Resource Manager 代码示例),并设定所有的 Solaris Resource Manager 参数。有关该脚本所进行的任务的详细介绍,请参阅第 4 章,启动过程

如果初始化脚本自身 (/etc/init.d/init.srm) 被修改,则原来的和修改的版本的一个副本应分开保存。应用 Solaris Resource Manager 更新程序,则不一定会保留当前的初始化脚本。

借助 srmadm 的通用 Solaris Resource Manager 参数

srmadm 命令使管理员可以设置、修改或显示通用 Solaris Resource Manager 参数。有关所有参数的详细介绍,请参阅 srmadm(1MSRM) 手册页。

srmadm 命令可被调用任何次数,并用于设定各类参数。并不一定要在单一调用中包括所有设置。也就是说,srmadm 可被用来在运行中更改正在运行的 Solaris Resource Manager 系统的操作参数,但在操作时应加以小心。

对管理员来讲尤其重要的是 srmadm 选项,用来启用或者禁用 Solaris Resource Manager 的主要特性。其中有:

fileopen[={y|n}]

缺省的数据库为 /var/srm/srmDB;可以用 -f 选项作为 limreport 的输入。注意,在操作中间关闭 Solaris Resource Manager 数据库文件应当视作一项紧急行动。这有多个不良后果:所有的进程将继续在替代 root lnode 上运行,从而获得比平常更多的特权;SHR 调度程序遭到禁用;Solaris Resource Manager 限制强制执行终止。如果被禁用,则 Solaris Resource Manager 当前没有打开的任何限制数据库,其高速缓存只包含所有进程所附加的替代 root lnode。

share[={y|n}]

如果被启用,则使用 Solaris Resource Manager SHR 调度程序,且根据 Solaris Resource Manager 的动态利用率和衰变算法进行 CPU 调度。除非 fileopen(文件打开)模式被启用,否则无法设置该模式。如果被禁用,则冻结 SHR 调度程序的利用率计算,且进程被调度为"不分先后"拥有固定平等优先权。

limits[={y|n}]

如果被启用,则 Solaris Resource Manager 强制执行虚拟内存和进程限制。除非 fileopen (文件打开)模式被启用,否则无法设置该模式。如果被禁用,则 Solaris Resource Manager 将使利用率属性保持为最新,但不强制执行限制。

adjgroups[={y|n}]

如果被启用,则使用 Solaris Resource Manager SHR 调度程序的通用组有效份额调整。建议在大多数情形下使用启用状态。在每次运行的间隔,所有限制条目的正常化使用得到重新计算。如果 adjgroups 调度模式被启用,则对正常化使用进行如下的附加处理。调度程序在调度树上进行逾越,将每个组最近所收到的有效份额与其权利进行比较。所收到的比其组权利少的组受到特别对待,并将在下一个运行间隔收到较多的有效份额。这就确保组尽可能地收到其应得的 CPU 服务,而不论其成员有何操作。

limshare[={y|n}]

如果被启用,则 SHR 调度程序应用其优先权最高的特性,对所有用户的有效份额加以限制,以防止利用率极端低下的用户短暂地获得几乎 CPU 的百分之百。建议使用启用状态。

某个用户的 CPU 服务的比率,大体与该用户的利用率成反比。如果用户已有较长一段时间没有处于活动状态,则其利用率衰变到接近零。当这样的一个用户登录(或者 lnode 以无论任何方式成为活动)时,则在下次运行间隔期间,该用户的进程可以拥有极高的优先权,乃至垄断 CPU。

启用 limshare 调度标志使调度程序可以估算某个 lnode 将在下一次运行间隔以前接收的有效份额。如果结果超过该用户分配特权一定的程度(请参阅 maxushare),则该用户的正常化利用率将被重新调整,以预防这种情况。

有两个针对 srmadm 的可选参数对管理员来说也是有用的:

下面的例子介绍典型的 srmadm 命令。

要打开 Solaris Resource Manager,则应启用 SHR 调度程序和资源限制:

# srmadm set -f /var/srm/srmDB fileopen=y:share=y:limits=y 

要把 CPU 利用率的衰减率设置为 5 分钟的半寿命:

# srmadm set usagedecay=300s 

要显示当前标志设置和收费:

% srmadm 

要显示所有缺省设置:

% srmadm show-dv 

禁用 Solaris Resource Manager

srmadm(1MSRM) 命令通过清除 fileopen 标志来禁用 Solaris Resource Manager:所有进程均被移动到替代 root lnode 上,高速缓存中的其它被更改 lnode 均被存入磁盘,限制数据库被关闭。这将自动迫使 sharelimits 标志关闭,并分别禁用 SHR 调度程序和限制强制。在必要时,sharelimits 标志可以单独关闭,而使限制数据库仍保持打开。这比关闭文件更好,因为所有进程仍可保持附加在其正确的 lnode 上。

注意:如果在操作中间单独禁用 Solaris Resource Manager 调度程序,则结果只是暂停利用率和衰变算法。调度程序仍旧继续处理 SHR 调度类中的进程,但是由于向其中每个指派了更新的优先权,使用的是同样的值,导致简单的"不分先后"调度。

通过在文件关闭后打开文件并设置 share 和/或 limits 标志,重新启用 Solaris Resource Manager 不会造成现有进程移出 root lnode。最好不要在正常运行过程中关闭 Solaris Resource Manager 数据库。如果该数据库被关闭,则必须重新启动系统,以确保进程能正确地附加到 lnode 上。

使用 limdaemon

缺省情况下,limdaemon 记录消息使用的是 syslog(3C)。在消息上包括一个时间印戳。

limdaemon 有若干个可在启动时配置的选项:

在下面的例子中,limdaemon 命令:

% limdaemon -g300 

启动守护程序并把宽限时间设置为 5 分钟。请注意,不必在该命令之后添加一个 shell '&' 字符。当 limdaemon 启动后,它就把自己变成守护程序。即一个子进程被派生出来,使自身从控制端脱离,将自身放入其自己的进程组中。

管理员应该确定在对连接时间利用率属性进行快速更新时所招致的附加管理费用之间的余额,更新频率越少,粒度就越大。有关这些选项和其它选项的详情,请参阅 limdaemon(1MSRM) 手册页。

PAM 子系统

从 Solaris 2.6 版本开始,Solaris 系统可支持可插接鉴别模块(PAM)。无论何时只要某个用户请求涉及该用户身份(例如,登录到系统上,调用 'r'命令如 rcprsh 等命令,使用 ftp 或使用 su)的更改或设置的操作时,就使用一组可配置模块提供鉴别、帐户管理和会话管理。Solaris Resource Manager 为登录会计和修改 su 行为提供了一个 PAM 模块。

被用于请求操作的程序称为一个服务。

PAM 系统的全部内容均在手册页 pam( 3), pam.conf(4), pam_unix(5) 和 pam_srm(5SRM) 中,提供了针对 Solaris Resource Manager 帐户和会话管理模块的所支持变量的完整列表。

在 Solaris Resource Manager 中,PAM 模块提供帐户管理和会话管理功能。PAM 的行为可通过编辑文件 /etc/pam.conf 加以控制。对于正常的 Solaris Resource Manager 行为,则应将 Solaris Resource Manager PAM 模块配置为 requisite(对于会话管理的所有类似登录的服务),和 requisite(对于所有 PAM 服务的帐户管理)。通常,Solaris Resource Manager 模块应被放置在所有其它 requiredrequisite 模块之后,任何其它 sufficientoptional 模块之前。

安装时,Solaris Resource Manager 对 /etc/pam.conf 进行编辑,以提供合适的性能。它为每种会话期间或帐户管理已得到配置的服务插入类似于下面的命令行(其中包括 other):

login account requisite pam_srm.so.1 nolnode=/etc/srm/nolnode
other session requisite pam_srm.so.1
other account requisite pam_srm.so.1 nolnode=/etc/srm/nolnode

第一行限定对于服务 login 来说,模块 pam_share.so.1 被用于提供帐户管理功能,如果要使 login 成功且被赋予变量 nolnode=/etc/srm/nolnode,则它必须允许登录。请参阅 pam.conf(4) ,以获取不同的控制标记(required、requisite、optional sufficient)的解释。

第二行说的是 login 服务将使用 pam_share.so.1 模块进行会话管理。

pam_srm(5SRM) 中提供了针对 Solaris Resource Manager 帐户和会话管理模块的所支持的变量的完整列表。

帐户管理

当 Solaris Resource Manager 帐户管理 PAM 模块获得控制时:

  1. 它就确定是否已安装和启用 Solaris Resource Manager;如果没有,则告诉 PAM 系统忽略该模块。

  2. 它就确定是否用户拥有一个 lnode,如果没有,则调用一个管理员可配置的 "no lnode" 脚本。

  3. 它就确定是否用户拥有使用所请求的服务和设备的许可。

  4. 它就确定是否用户业已超过警告限制;如果是,就拒绝其登录。

  5. 它就调用一个管理员可配置的 "every login" 脚本。

如果上述步骤中有任何一个失败,则剩余的步骤不再执行,且 Solaris Resource Manager 帐户管理 PAM 模块拒绝使用服务。在可能的情况下,会通过服务向用户传递一个解释性的消息。

脚本

缺省的“丢失的 lnode”脚本将为用户创建一个 lnode,并发送电子邮件通知系统管理员已经这样做了。缺省的脚本是 /etc/srm/nolnode,但它可通过编辑文件 /etc/pam.conf 并更改 Solaris Resource Manager 帐户管理模块行上的 nolnode 选项的数值而得到更改。“每次登录”脚本一般不配置。但是,它可通过将 [[everylogin=pathname]] 选项添加到 /etc/pam.conf 中的任何 Solaris Resource Manager 帐户管理模块上而得到配置。脚本是作为 root 用户被调用的。标准输入、输出和错误均被关闭。如果某个脚本以非零状态退出,则登录就被拒绝。所有信息均被作为环境变量被传递,且直接从由服务传递到 PAM 的信息中得到。

USER

提供给程序的登录名称。已通过在口令映射中检索加以鉴别;如果不存在,帐户管理模块则向 PAM 返回一个错误代码。

UID

正在进行鉴别的用户的 UID。对于更改 UID 的服务(如 su),则是调用服务的用户的 UID;对于设置 UID 的服务(如 login),则是目标 UID(例如,USER 的 UID)。

RHOST

对于跨网络的访问企图,其中所包含的是作出该企图的主机的名称。否则其值取决于实施过程。

SERVICE

访问服务的名称,例如,rshloginftp

TTY

服务被调用时所在的 TTY 的名称。(严格来讲)某些没有控制终端的服务(如 ftp)将使用进程信息填充变量(例如,ftp12345,其中 12345ftpd 的进程识别符 (PID);其它程序则保持其为空或者用服务名称代替。

DEBUG

如果 debug 已在 pam.conf 文件中规定,则 DEBUG 被设置为真;否则,它就被设置为假。不再设置其它环境变量,所以任何脚本都必须根据需要设置自己的 PATH 变量。

缺省的 "no lnode" 脚本在缺省的调度组创建 lnode(如果一个此类的用户在口令映射中存在的话,则为 other;否则,为 root),并向系统管理员发出邮件,提醒其将新的 lnode 移到调度分层结构中的适当的位置。系统管理员寄出一份备忘录, 提醒他把新的 lnode 移动到调度层级结构中的正确位置。如要了解脚本示例,请参阅 缺省 'no lnode' 脚本

PAM 与设备组的交互

Solaris Resource Manager PAM 模块在设备分层结构中检索终端和服务名称;如果超过限制或者某一设备标志值为 set,就向其调用者返回一个“拒绝许可”信息。

所检查的设备类别为 terminal,指的是终端名称,services 指的是所请求的服务的种类。例如, rlogin 可能会尝试使用网络设备组中的某个文件,因而为该用户所测试的标志为如下所示(假设所有的标志均设置为 group),这些标志的检查顺序为:

只有其所有的值均为 set 时,才许可访问。另外,还要为相对应的类别检查限制(terminalservices)。

会话管理

对于类似于 login 的服务(即在 utmp 文件中创建一个条目的服务)。如果 PAM 的会话期间管理工具和帐户管理工具两者均在 /etc/pam.conf 中得到配置的话,则全部加以调用。

Solaris Resource Manager 产品的会话期间管理负责设备收费。它查看是否用户业已超过连接时间限制,或者 onelogin 标志值为 set 而已登录;如果是的话,则阻止其登录。

否则,它就会向 limdaemon 进程生成一条消息,将登录以及登录所在的终端的配置费用通知给它。它然后就告知内核,当前的进程是一个登录头目进程,必须告知 limdaemon 进程,当前的进程何时消亡。

limdaemon 进程然后就对连接时间限制进行跟踪,并在其将要被超过时发出警告。