如果你有一些用户, 并且想要对他们所使用的系统资源加以限制. FreeBSD 提供了一些系统管理员限制用户访问系统资源的方法. 这些限制通常被分为两种: 磁盘配额, 和其它资源限制.
磁盘配额限制用户对磁盘的使用, 而且它还提供一种快速检查用户使用磁盘数量而不需要时刻计算的方法. 配额将在 Section 12.12讨论.
其它资源限制包括CPU,内存的数量和用户可能会使用的其它资源. 这些是通过对登陆进行分类完成的,下面将做讨论.
登陆的类由/etc/login.conf文件定义. 比较精确的描述超出了本章的范围, 但 login.conf(5) 联机手册会有比较详细的描述. 可以说每个用户都分配到一个登陆类(预设是 default), 每个登陆类都有一套和它相对应的功能. 登陆功能是 名字=值 的配对, 其中名字 是一个众所周知的标识符, 值 是一个根据名字经过处理得到的任意字符串. 设置登陆类和功能相当的直接,在 login.conf(5)联机手册会有比较详细的描述.
资源限制与普通登陆限制是有区别的. 首先, 对于每种限制, 有软限制(比较常见)和硬限制之分. 一个软限制可能被用户调整过, 但不会超过硬限制. 越往后可能越低, 但不会升高. 其次, 绝大多数资源限制会分配每个进程给一个特殊用户, 而不是用户的全部进程. 注意, 这些区别是资源限制的特殊操作所规定的, 不是登陆功能框架的完成(也就是说, 他们实际上 不是一个登陆功能的特例).
不再罗嗦了, 下面是绝大多数资源限制的例子 (与其它所有登陆功能相关的内容, 你也许可以在login.conf(5)找到).
很明显,由程序产生的核心文件大小的限制在磁盘使用上是属于其它限制的(例如, 文件大小, 磁盘配额). 不过, 既然用户自己无法产生核心文件,而且经常不删除它们, 设置这个可以尽量避免由于一个大型应用程序的崩溃所造成的大量磁盘空间的浪费. (例如, emacs) crash.
这是一个用户程序所能消耗掉的最大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).