使用 /proc 文件系统来控制系统
来源:网络转载 日期:2006/05/20 15:51
-->
级别:中级
作者:Graham White(gwhite at uk.ibm.com)
IT 专家,Hursley,IBM
2003 年 8 月
/proc 文件系统是 Linux 的优秀特性之一,本文向你周详讲述了他的一些最实用的基础知识。使用 /proc,你再也不用关闭并重新引导机器来管理操作系统的许多细节问题,这对那些需求系统的可用性尽可能高的管理员来说非常有用。
所有管理过具有商业重要性的系统的人都知道计算机正常运行时间的价值 - 或反过来讲,知道用户因故障时间会给你带来诸多头痛问题。公司采用 UNIX 服务器的主要原因之一是由于他的可靠性和稳定性。如果仔细管理,通常能非常长时间不需重启这些服务器。为了做到尽善尽美,你能实时执行一些管理任务,甚至是内核这一级别的任务,从而保持服务器的可用性。虽然因升级硬件或因某人踢掉电源线而仍需要重启系统,但了解到许多管理任务能在不干扰服务的情况下执行,总是有益的。
本文提供了不必重新引导就能够执行关于各种管理任务和更改系统的提示和技巧。Linux 提供了各种方法,用以在保持系统正常运行的情况下,更改底层操作系统的值和设置。这些方法有两种基本形式,一种形式对于所有 Linux 系统都是通用的,并在 Linux 内核中提供这一形式(你能在 Linux Kernel Archives 上查找更多关于 Linux 内核的信息和下载内核原始码;请参阅参考资料,里面有至 Linux Kernel Archives 的链接),更有一种形式是各分发版所独有的,并且由供给商提供。本文将讨论这两种方法。
更改运行中的内核的参数
Linux 向管理员提供了非常好的方法,使他们能在系统运行时更改内核,而不必重新引导内核/系统。这是通过 /proc 虚拟文件系统实现的。Linux Gazette 给出了一份有关 /proc 的参考,他是我所看到过的最简单且最容易的参考之一。(请参阅参考资料,其中有至这篇文章的链接。)/proc 文件系统主要能让你查看运行中的内核,这一点对于监视性能、查找系统信息、了解系统是怎么设置的及更改该设置非常有用。该文件系统被称为虚拟文件系统,因为他实际上根本不是个文件系统。他只是内核提供的一个映射,被附加在通常的文件系统结构之上,从而使你能够访问他。
我们能采用某种方法在系统正常运行的同时更改运行中的内核的参数,这一事实赋予了系统管理员在更改内核设置方面强大的能力和高的灵活性。这种实现是出自部分 Linux 内核研发人员富有灵感的想法。但能力太大会是一件坏事吗?有时确实如此。如果准备更改 /proc 文件系统中的所有内容,你必须确保自己知道在更改什么及这会对系统产生什么影响。这些技术确实有用,但错误的举动会带来完全不希望得到的结果。如果你不熟悉这方面的内容,或不确定你所做的某项更改会带来什么影响,那么请在一台对你或你公司不重要的机器上进行实践。
怎么更改
首先,考虑怎样做不会对内核进行更改。有两条充分的理由说明了为什么不能直接转换至 /proc 文件系统,用文本编辑器打开一个文件,做一系列更改,然后保存该文件,再退出。这两条理由是:
数据完整性:所有这些文件描述了运行中的系统,由于内核能随时更改这些文件中的所有一个,因此如果打开一个编辑器,然后更改某些数据,而同时,系统也正在底层更改这些数据,那么无论你保存下来的所有内容都不可能是内核所期望的内容。
虚拟文件:所有这些文件实际上都不存在。怎么使保存的数据同步,等等?
所以,解决办法是,不使用编辑器来更改所有这些文件。每当更改 /proc 文件系统中的所有内容时,应该使用 echo 命令,然后从命令行将输出重定向至 /proc 下所选定的文件中。例如:
echo "Your-New-Kernel-Value" > /proc/your/file
类似的,如果希望查看 /proc 中的信息,应该使用专门用于此用途的命令,或使用命令行下的 cat 命令。
更改什么
要非常好地使用 /proc 不必你是一位内核方面的高手,只需基本了解这个文件系统的结构就能极大地帮助你。直到有一天用户向你询问某些特定的功能,使你非常高兴曾下功夫了解过在哪里进行更改,你才可能会觉得有必要知道关于 /proc 中的所有事情。在这方面,/proc 文件系统通过其结构和文件许可权帮助系统管理员。
/proc 中的每个文件都有一组分配给他的非常特别的文件许可权,并且每个文件属于特定的用户标识。这一点实现得非常仔细,从而提供给管理员和用户正确的功能。下面这个列表汇总了各个文件上有哪些特定的许可权:
只读:所有用户都不能更改该文件;他用于表示系统信息
root 写:如果 /proc 中的某个文件是可写的,则通常只能由 root 用户来写
root 读:有些文件对一般系统用户是不可见的,而只对 root 用户是可见的
其他:出于各种原因,你可能会看到不同于上面常见的三种许可权的组合
关于 /proc,你会发现最通常的情况是,他的大多数文件是只读的,除了 /proc/sys 目录。该目录下存放着大多数的内核参数(而不是信息),并且设计成能在系统运行的同时进行更改。因此这个目录是本文的主旨所在。
就更改 /proc 中什么内容而言,要了解的最后一点是,应该向这些文件实际写些什么。当查看 /proc 中各种文件时,会发现其中一些文件对我们来说是可读的,一些文件是数据文件。通过用特定的实用程式(譬如 top、lspci 和 free),这些数据文件仍然也可读。你还会注意到,对我们来说可读文件有两种不同格式:一些是二进制开关,另一些包含其他信息。二进制开关文件只包含代表特定内核功能的 0(关)或 1(开)。
进行更改
周详介绍有关 /proc 中每个文件的用法和确切信息超出了本文所涉及的范围。要获得所有关于本文没有涉及到的 /proc 文件的其他信息,一个最佳来源就是 Linux 内核原始码本身,他包含了一些非常优秀的文件。对于系统管理员,/proc 中的以下文件较有用。这不意味着他是一份详尽的说明,而只是日常使用中便于查阅的参考。
/proc/scsi
/proc/scsi/scsi
作为系统管理员,需要了解的最有用内容是,在有热交换驱动器情况下,怎么不重启系统就能添加更多磁盘空间。假使不使用 /proc,你能插入驱动器,但为了使系统识别新磁盘,必须随即重新引导系统。这里,能用以下命令来使系统识别新的驱动器:
echo "scsi add-single-device w x y z" > /proc/scsi/scsi
为使该命令正常运行,必须指定正确的参数值 w、x、y 和 z,如下所示:
w 是主机适配器标识,第一个适配器为零(0)
x 是主机适配器上的 SCSI 通道,第一个通道为零(0)
y 是设备的 SCSI 标识
z 是 LUN 号,第一个 LUN 为零(0)
一旦将磁盘添加到系统中之后,能挂装所有先前已格式化的文件系统,也能开始对他进行格式化等。例如,如果不确定磁盘是什么设备,或想检查所有先前已有的分区,则能用如 fdisk -l 这样的命令来向你报告这方面的信息。
相反的,在不重新引导系统的情况下将设备从系统中除去的命令是:
echo "scsi remove-single-device w x y z" > /proc/scsi/scsi
在输入这条命令并将热交换 SCSI 磁盘从系统中除去之前,请确保首先卸下已从该磁盘安装的所有文件系统。
/proc/sys/fs/
/proc/sys/fs/file-max
该文件指定了能分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开文件数已达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。可将这个值设置成有任意多个文件,并且能通过将一个新数字值写入该文件来更改该值。
缺省设置:4096
/proc/sys/fs/file-nr
该文件和 file-max 相关,他有三个值:
已分配文件句柄的数目
已使用文件句柄的数目
文件句柄的最大数目
该文件是只读的,仅用于显示信息。
/proc/sys/fs/inode-*
所有以名称"inode"开头的文件所执行的操作和上面那些以名称"file"开头的文件所执行的操作相同,但所执行的操作和索引节点有关,而和文件句柄无关。
/proc/sys/fs/overflowuid 和 /proc/sys/fs/overflowgid
这两个文件分别保存那些支持 16 位用户标识和组标识的所有文件系统的用户标识(UID)和组标识(GID)。能更改这些值,但如果你确实觉得需要这样做,那么你可能会发现更改组和密码文件项更容易些。
缺省设置:65534
/proc/sys/fs/super-max
该文件指定终极块处理程式的最大数目。挂装的所有文件系统需要使用终极块,所以如果挂装了大量文件系统,则可能会用尽终极块处理程式。
缺省设置:256
/proc/sys/fs/super-nr
该文件显示当前已分配终极块的数目。该文件是只读的,仅用于显示信息。
/proc/sys/kernel
/proc/sys/kernel/acct
该文件有三个可设置值,根据包含日志的文件系统上可用空间的数量(以百分比表示),这些值控制何时开始进行进程记帐:
如果可用空间低于这个百分比值,则停止进程记帐
如果可用空间高于这个百分比值,则开始进程记帐
检查上面两个值的频率(以秒为单位)
要更改这个文件的某个值,应该回送用空格分隔开的一串数字。
缺省设置:2 4 30
如果包含日志的文件系统上只有少于 2% 的可用空间,则这些值会使记帐停止,如果有 4% 或更多可用空间,则再次启动记帐。每 30 秒做一次检查。
/proc/sys/kernel/ctrl-alt-del
该文件有一个二进制值,该值控制系统在接收到 ctrl alt delete 按键组合时怎么反应。这两个值表示:
零(0)值表示捕捉 ctrl alt delete,并将其送至 init 程式。这将允许系统能完美地关闭和重启,就好象你输入 shutdown 命令相同。
壹(1)值表示不捕捉 ctrl alt delete,将执行非干净的关闭,就好象直接关闭电源相同。
缺省设置:0
/proc/sys/kernel/domainname
该文件允许你设置网络
域名。他没有缺省值,也许已设置了
域名,也许没有设置。
/proc/sys/kernel/hostname
该文件允许你设置网络主机名。他没有缺省值,也许已设置了主机名,也许没有设置。
/proc/sys/kernel/msgmax
该文件指定了从一个进程发送到另一个进程的消息的最大长度。进程间的消息传递是在内核的内存中进行,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。
缺省设置:8192
/proc/sys/kernel/msgmnb
该文件指定在一个消息队列中最大的字节数。
缺省设置:16384
/proc/sys/kernel/msgmni
该文件指定消息队列标识的最大数目。
缺省设置:16
/proc/sys/kernel/panic
该文件表示如果发生"内核严重错误(kernel panic)",则内核在重新引导之前等待的时间(以秒为单位)。零(0)秒设置在发生内核严重错误时将禁止重新引导。
缺省设置:0
/proc/sys/kernel/printk
该文件有四个数字值,他们根据日志记录消息的重要性,定义将其发送到何处。关于不同日志级别的更多信息,请阅读 syslog(2) 联机帮助页。该文件的四个值为:
控制台日志级别:优先级高于该值的消息将被打印至控制台
缺省的消息日志级别:将用该优先级来打印没有优先级的消息
最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)
缺省的控制台日志级别:控制台日志级别的缺省值
缺省设置:6 4 1 7
/proc/sys/kernel/shmall
该文件是在所有给定时刻系统上能使用的共享内存的总量(以字节为单位)。
缺省设置:2097152
/proc/sys/kernel/shmax
该文件指定内核所允许的最大共享内存段的大小(以字节为单位)。
缺省设置:33554432
/proc/sys/kernel/shmmni
该文件表示用于整个系统共享内存段的最大数目。
缺省设置:4096
/proc/sys/kernel/sysrq
如果该文件指定的值为非零,则激活 System Request Key。
缺省设置:0
/proc/sys/kernel/threads-max
该文件指定内核所能使用的线程的最大数目。
缺省设置:2048
/proc/sys/net
/proc/sys/net/core/message_burst
写新的警告消息所需的时间(以 1/10 秒为单位);在这个时间内所接收到的其他警告消息会被丢弃。这用于防止某些企图用消息"淹没"你系统的人所使用的拒绝服务(Denial of Service)攻击。
缺省设置:50(5 秒)
/proc/sys/net/core/message_cost
该文件存有和每个警告消息相关的成本值。该值越大,越有可能忽略警告消息。
缺省设置:5
/proc/sys/net/core/netdev_max_backlog
该文件指定了,在接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
缺省设置:300
/proc/sys/net/core/optmem_max
该文件指定了每个套接字所允许的最大缓冲区的大小。
/proc/sys/net/core/rmem_default
该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)。
/proc/sys/net/core/rmem_max
该文件指定了接收套接字缓冲区大小的最大值(以字节为单位)。
/proc/sys/net/core/wmem_default
该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。
/proc/sys/net/core/wmem_max
该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。
/proc/sys/net/ipv4
所有 IPv4 和 IPv6 的参数都被记录在内核原始码文件中。请参阅文件 /usr/src/linux/Documentation/networking/ip-sysctl.txt。
/proc/sys/net/ipv6
同 IPv4。
/proc/sys/vm
/proc/sys/vm/buffermem
该文件控制用于缓冲区内存的整个系统内存的数量(以百分比表示)。他有三个值,通过把用空格相隔的一串数字写入该文件来设置这三个值。
用于缓冲区的内存的最低百分比
如果发生所剩系统内存不多,而且系统内存正在减少这种情况,系统将试图维护缓冲区内存的数量。
用于缓冲区的内存的最高百分比
缺省设置:2 10 60
/proc/sys/vm/freepages
该文件控制系统怎么应对各种级别的可用内存。他有三个值,通过把用空格相隔的一串数字写入该文件来设置这三个值。
如果系统中可用页面的数目达到了最低限制,则只允许内核分配一些内存。
如果系统中可用页面的数目低于这一限制,则内核将以较积极的方式启动交换,以释放内存,从而维持系统性能。
内核将试图保持这个数量的系统内存可用。低于这个值将启动内核交换。
缺省设置:512 768 1024
/proc/sys/vm/kswapd
该文件控制允许内核怎么交换内存。他有三个值,通过把用空格相隔的一串数字写入该文件来设置这三个值:
内核试图一次释放的最大页面数目。如果想增加内存交换过程中的带宽,则需要增加该值。
内核在每次交换中试图释放页面的最少次数。
内核在一次交换中所写页面的数目。这对系统性能影响最大。这个值越大,交换的数据越多,花在磁盘寻道上的时间越少。然而,这个值太大会因"淹没"请求队列而反过来影响系统性能。
缺省设置:512 32 8
/proc/sys/vm/pagecache
该文件和 /proc/sys/vm/buffermem 的工作内容相同,但他是针对文件的内存映射和一般高速缓存。
使内核设置具有持久性
这里提供了一个方便的实用程式,用于更改 /proc/sys 目录下的所有内核参数。他使你能更改运行中的内核(类似于上面用到的 echo 和重定向方法),但他更有一个在系统引导时执行的设置文件。这使你能更改运行中的内核,并将这些更改添加到设置文件,以便于在系统重新引导之后,这些更改仍然生效。
该实用程式称为 sysctl,在 sysctl(8) 的联机帮助页中,对这个实用程式进行了完整的文件说明。sysctl 的设置文件是 /etc/sysctl.conf,能编辑该文件,并在 sysctl.conf(8) 下记录了该文件。sysctl 将 /proc/sys 下的文件视为能更改的单个变量。所以,以 /proc/sys 下的文件 /proc/sys/fs/file-max 为例,他表示系统中所允许的文件句柄的最大数目,这个文件被表示成 fs.file-max。
这个示例揭示了 sysctl 表示法中的一些奇妙事情。由于 sysctl 只能更改 /proc/sys 目录下的变量,并且人们始终认为变量是在这个目录下,因此省略了变量名的那一部分(/proc/sys)。另一个要说明的更改是,将目录分隔符(正斜杠 /)换成了英文中的句号(点 .)。
将 /proc/sys 中的文件转换成 sysctl 中的变量有两个简单的规则:
去掉前面部分 /proc/sys。
将文件名中的正斜杠变为点。
这两条规则使你能将 /proc/sys 中的任一文件名转换成 sysctl 中的任一变量名。一般文件到变量的转换为:
/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file
能使用命令 sysctl -a 查看所有能更改的变量和其当前设置。
用 sysctl 还能更改动量,他所做的工作和上面所用的 echo 方法完全相同。其表示法为:
sysctl -w dir.file="value"
还是用 file-max 作为示例,使用下面两种方法中的一种将该值更改为 16384:
sysctl -w fs.file-max="16384"
或:
echo "16384" > /proc/sys/fs/file-max
不要忘记 sysctl 不会将所做的更改添加到设置文件中;这要你用手工来完成。如果你希望在重新引导之后,前面所做的更改仍然有效,则必须维护这个设置文件。
注:不是所有的分发版都提供 sysctl 支持。如果你的特定系统属于这种情况,则能用上面所描述的 echo 和重定向方法,将这些命令添加到启动脚本中,这样系统每次引导时,都会执行他们。
用于设置系统的命令
在系统运行的同时更改其他非内核系统参数,而且在不重新引导系统的情况下使这些设置生效,这种做法是可能的。在 /etc/init.d 目录中列出了包含这些参数的文件,他们主要按服务、守护程式和服务器来分类。由于越来越多各方面的脚本能罗列在这个目录下,所以这里不可能讨论所有各种设置。不过,下面列举了一些示例,这些示例讨论了怎么在不同的 Linux 分发版上操作 /etc/init.d 下的脚本。这里的示例可能非常有用,其中讨论了更改守护程式,然后在不重新引导系统的情形下重新装入设置:
更改 Web 服务器设置,然后重新装入 Apache
除去不必的 inetd 登录服务
操作网络设置
通过 NFS 导出新的文件系统
启动/停止防火墙
首先,常见的方法是,直接通过 /etc/init.d 中的脚本来操作系统服务。这些脚本用参数来操作他们所控制的服务;能通过输入脚本名但不带所有参数这种方法来查看有哪些有效的选项。常见的参数有:
start:启动已停止的服务
stop:停止正在运行的服务
restart:停止正在运行的服务,然后再重启该服务;他将启动已停止的服务
reload:在不中断所有连接的情况下,重新装入服务设置
status:报告服务处于运行状态,还是停止状态
例如,下面这条命令将在不终止所有已连接的用户会话的情形下,重新装入 xinetd 设置(如果你更改了 /etc/xinetd.conf,那么这条命令非常有用):
/etc/init.d/xinetd reload
Red Hat 提供了 service 这条命令,他能为你操作服务。service 命令提供的功能和输入脚本名本身的功能相同。他的语法如下所示:
service script-name [parameter]
例如:
service xinetd reload
SuSE 也提供名为 rc 的命令。该命令类似于上面的 service 命令,但该命令和脚本名之间没有空格。他的语法如下所示:
rc{script-name} parameter
例如:
rcapache start
和更改内核参数类似,一旦重新引导系统,则对这些服务的更改将会丢失。目前越来越多的分发版开始采用 chkconfig 命令,他管理在各种运行级别下(包括引导时)启动的服务。在撰写本文时,chkconfig 命令的语法会因 Linux 版本的不同而略有差异,不过如果输入不带所有参数的命令 chkconfig,则会显示一个怎么使用该命令的列表。也能通过 chkconfig(8) 的联机帮助页找到更多有关 chkconfig 的信息。
结束语
使用 /proc 文件系统实时设置 Linux 内核不是一件轻松的事情,然而一旦了解了该文件系统的结构,及掌控了怎么操作各种文件和参数,则你就拥有了一个功能强大的工具,使你的服务器在所有时候都可用。
致谢
我十分感谢 Adrian Fewings 先生对本文的校对。
关于作者
Graham 于 2000 年 7 月获得了 Exeter 大学计算机科学和管理科学的理学士学位(荣誉)。在毫无一点经验的情况下,他于 2000 年 9 月加入了 IBM,从事 IT 支持工作,并且开始学习 Linux。一年后,于 2001 年 9 月,他获得了 Red Hat 认证工程师。他所从事的工作和个人爱好使他具有了在各个平台上运行各种版本的 Linux 的经历,来支持 IBM 位于英国的 Hursley Laboratory 的研发社区。最近,他已撰写了一些关于 Linux 方面的文章,他的第一部也是唯一的一部出版物被收录在 Linux Documentation Project 的指南中。能通过 gwhite at uk.ibm.com 和 Graham 联系。