深度介绍Linux内核是如何工作的(5)

  /proc系统文件

  Linux kernel同样通过/proc系统文件来展示了许多细节。为了说明/proc,我们首先需要扩展我们对于文件的理解。除了认为文件就是存储在硬盘或者CD或者存储空间上的持久信息之外,我们还应当把它理解为任何可以通过传统系统调用如:打开、读、写、关闭等访问的信息,当然它也可以被常见的程序访问。

  /proc之下的"文件"完全是kernel虚拟的一个部分,给我们一个视角可以看到kernel内部的数据结构。实际上,许多Linux的报告工具均能够很好地呈现在/proc下的文件中寻到的格式化版本的信息。比如,一列/proc/modules将展示一列当前加载的模块。

  同样的,/proc/meminfo提供了关于虚拟存储系统当前状态的更多细节信息,而类如vmstat的工具则是以一种更加可理解的方式提供了相同的一些信息;/proc/net/arp显示了系统ARP cache的当前内容,从命令行来说,arp -a显示的也是相同的信息。

  尤其有意思的是/proc/sys下的"文件"。/proc/sys/net/ipv4/ip_forward下的设置告诉我们kernel是否将转发IP数据包,也就是说是否扮演网关的作用。现在,kernel告诉我们这是关闭的:

  # cat /proc/sys/net/ipv4/ip_forward

  0

  当你发现你可以对这些文件写入的时候,你会觉得更加有意思。继续举例来说:

  # echo 1 > /proc/sys/net/ipv4/ip_forward

  将在运行的kernel中打开IP 转发(IP forwarding)

  除了使用cat和echo来检查和更正/proc/sys下的设置以外,你也可以使用sysctl命令:

  # sysctl net.ipv4.ip_forward

  net.ipv4.ip_forward = 0

  这等同于:

  # cat /proc/sys/net/ipv4/ip_forward

  0

  也等同于:

  # sysctl -w net.ipv4.ip_forward=1

  net.ipv4.ip_forward = 1

  还等同于:

  # echo 1 > /proc/sys/net/ipv4/ip_forward

  需要注意的是,以这种方式你所做的设置改变只能影响当前运行的kernel的,当reboot的时候就不再有效。如果想让设置永久有效,将它们放置在/etc/sysctl.conf文件中。在boot time时,sysctl将自动重新确定它在此文件下找到的任何设置。

  /etc/sysctl.conf下的代码行大概是这样的:net.ipv4.ip_forward=1

  性能调优(performance tuning)

  有这样一个说法:/proc/sys下可写入的参数孕育了整个Linux性能调优的亚文化。我个人觉得这种说法有点过夸,但这里会有几个你确实很想一试的例子:Oracle 10g的安装说明()要求你设置一组参数,包括:kernel.shmmax=2147483648 这将公用存储器的大小设置为2GB。(公用存储器是处理期内的通信机制,允许存储单元在多个进程的地址空间内同时可用)

  IBM 'Redpaper'在Linux性能和调优方面的说明()在调教/proc/sys下的参数方面给出了不少建议,包括:vm.swappiness=100 这个参数控制着存储页如何被交换到磁盘。

  一些参数可以被设置从而提高安全性,如net.ipv4.icmp_echo_ignore_broadcasts=1 它"告诉"kernel不必响应ICMP请求,从而使得你的网络免受类如Smurf攻击之类的拒绝服务器(denial-of-service)型攻击。

  net.ipv4.conf.all.rp_filter=1 则是"告诉"kernel加强入站过滤(ingress filtering)和出站过滤(egress filtering)

  那么有没有一个说明能涵盖这所有的参数?好吧,这有一行命令:# sysctl -a 它将展示所有的参数名字和当前值。列表很长,但是你无法知道这些参数是做什么的。另外比较有用的参考是Red Hat Enterprise Linux Reference Guide,对此有整章节的描述,你可以从RedHat.com/docs/manuals/enterprise上下载。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzyyzy.html