如果您有一些用户, 并想要对他们所使用的系统资源加以限制, FreeBSD 提供了一些系统管理员限制用户访问系统资源的方法。 这些限制通常被分为两种: 磁盘配额, 以及其它资源限制。
磁盘配额限制用户对磁盘的使用, 而且它还提供一种快速检查用户使用磁盘数量而不需要时刻计算的方法。 配额将在 Section 16.14讨论.
其它资源限制包括CPU、 内存以及用户可能会使用的其它资源。 这些是通过对登录进行分类完成的, 下面将做讨论。
登录的类由 /etc/login.conf 文件定义。 比较精确的描述超出了本章的范围, 但 login.conf(5) 联机手册会有比较详细的描述。 可以说每个用户都分配到一个登录类 (默认是 defalut), 每个登录类都有一套和它相对应的功能。 登录功能是 名字=值 这样的一对值, 其中名字 是一个众所周知的标识符, 值 是一个根据名字经过处理得到的任意字符串。 设置登录类和功能相当简单, 在 login.conf(5) 联机手册会有比较详细的描述。
Note: 系统并不直接读取 /etc/login.conf 中的配置, 相反, 它读取数据库文件 /etc/login.conf.db。 为了从 /etc/login.conf 生成 /etc/login.conf.db, 需要执行下面的命令:
# cap_mkdb /etc/login.conf
资源限制与普通登录限制是有区别的。 首先, 对于每种限制, 有软限制 (比较常见) 和硬限制之分。 一个软限制可能被用户调整过, 但不会超过硬限制。 越往后可能越低, 但不会升高。 其次, 绝大多数资源限制会分配特定用户的每个进程, 而不是该用户的全部进程。 注意, 这些区别是资源限制的特殊操作所规定的, 不是登录功能框架的完成 (也就是说, 他们实际上 不是一个登录功能的特例)。
不再罗嗦了, 下面是绝大多数资源限制的例子 (您可以在 login.conf(5) 找到其它与登录功能相关的内容)。
很明显, 由程序产生的核心文件大小的限制在磁盘使用上是属于其它限制的 (例如, 文件大小, 磁盘配额)。 不过, 由于用户自己无法产生核心文件, 而且通常并不删除它们, 设置这个可以尽量避免由于一个大型应用程序的崩溃所造成的大量磁盘空间的浪费。 (例如, emacs) 崩溃。
这是一个用户程序所能消耗掉的最大CPU时钟数量. 一些不理想的进程会被内核杀掉.
Note: 这是一个有关CPU消耗的时钟 限制, 不是top(1) 和 ps(1) 命令时屏幕上显示的CPU消耗的百分比。 在写此说明时, 后者的限制是是不太可能和没有价值的: 编译器 -- 编译一个可能是合法的工作 -- 可以在某一时刻轻易的用掉 100% 的 CPU。
这是用户可以处理一个文件的最大值。 不象 磁盘配额, 这个限制是对单个文件强制执行的, 不是用户自己的所有文件。
这是一个用户可以运行的最大进程数。 这包括前台和后台进程。 很明显, 这不可能比系统指定 kern.maxproc sysctl(8) 的限制要大。 同时也要注意, 设置的过小会妨碍用户的处理能力: 可能需要多次登录或执行多个管道。 一些任务, 例如编译一些大的程序, 也可能会产生很多进程 (例如, make(1), cc(1) 以及其它一些预处理程序)。
这是一个进程可能会被锁定到主存中的最大内存数量 (参见 mlock(2))。 大型程序, 例如像 amd(8) 在遇到问题时, 它们得到的巨大交换量无法传递给系统进行处理。
这是在给定时间内一个进程可能消耗的最大内存数量。 它包括核心内存和交换内存。 在限制内存消耗方面, 这不是一个完全的限制,但它是一个好的开始。
这是一个进程可以打开的最大文件数。 在FreeBSD中, 文件可以被表现为套接字和IPC通道; 注意不要把这个数设置的太小。 系统级的限制是由 kern.maxfiles 定义的, 详情参见 sysctl(8)。
这是网络内存数量的限制, 这主要是针对通过创建许多套接字的老式 DoS 攻击的, 但也可以用来限制网络通信。
这是一个进程堆栈可能达到的最大值。 它不能单独的限制一个程序可能使用的内存数量; 所以, 需要与其它的限制手段配合使用。
在设置资源限制时, 有一些其他的事需要注意。 下面是一些通常的技巧、 建议和注意事项。
系统启动的进程/etc/rc会被指派给 守护程序 的登录类.
虽然 /etc/login.conf 文件是一个对绝大多数限制做合理配置的资源文件, 但只有您也就是系统管理员,才知道什么最适合您的系统。 设置的太高可能会因为过于开放而造成系统的被人滥用, 设置的过低则会降低效率。
使用 X Window 的用户可能要比其他用户使用更多的资源。 因为X11本身就使用很多资源, 而且它鼓励用户同时运行更多的程序。
要记得许多限制会被用于单个进程, 不是用户的所有进程。 例如, 将 openfiles 设置为 50 意味着每个用户进程最高只能打开 50 个文件。 然而, 用户可以打开的文件的总的大小是根据 maxproc 值逐步增加的 openfiles 值。 同样的规则也适用于内存相关的限制。
有关资源限制,登录类的更深入信息可以查看相关联机手册: cap_mkdb(1), getrlimit(2), login.conf(5).