sysctl与/proc详解

发布时间:2020-07-20 08:45:07 作者:xiexiaojun
来源:网络 阅读:9205

目录

一、sysctl简介

二、sysctl命令使用

三、sysctl配置文件/etc/sysctl.conf详解

四、/proc目录简介

五、/proc/sys下内核文件与配置文件sysctl.conf中变量的对应关系


一、sysctl简介

      sysctl 是一个用来在系统运作中查看及调整系统参数的工具。有的sysctl参数只是用来查看目前的系统状况,例如查看目前已开机时间、所使用的操作系统版本、核心名称等等;而有的可以让我们修改参数以调整系统运作的行为,例如网络暂存内存的大小、最大的上线人数等等。

/etc/sysctl.conf就是sysctl的配置文件,而这些可以调整的参数中必须在一开机系统执行其它程序前就设定好,有的可以在开机完后任意调整。同大多数配置文件一样,我们可以对sysctl.conf进行配置来优化系统的性能.

二、sysctl命令使用

[root@www ~]# sysctl --help
usage:  sysctl [-n] [-e] variable ... 
        sysctl [-n] [-e] [-q] -w variable=value ... 
        sysctl [-n] [-e] -a 
        sysctl [-n] [-e] [-q] -p <file>   (default /etc/sysctl.conf) 
        sysctl [-n] [-e] -A

常用参数:

    -w   临时改变某个指定参数的值,如

          sysctl -w net.ipv4.ip_forward=1

    -a   显示所有的系统参数

    -p   从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

三、sysctl配置文件/etc/sysctl.conf

[root@ElementServer ~]# cat /etc/sysctl.conf|grep -v '^#\|^$'
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 5368760912
kernel.msgmax = 16777216
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 8192
fs.file-max = 6553560

解释一下sysctl.conf文件中参数的意义:

四、/proc目录简介

       大家都知道进程都 是在内存中,而内存中的数据都写入到了/proc/目录中的文件中去了,所以很有必要分析这个文件夹内的内容。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

1、proc文件系统总览 
       在类Unix系统中体现了一种良好的抽象哲学,就是几乎所有的数据实体都被抽象成一个统一的接口--文件来看待,这样我们就可以用一些简单的基本工具完成大量复杂的操作。

在Linux中存在着一类特殊的伪文件系统,用于使用与文件接口统一的操作来完成各种功能,例如ptyfs、devfs、sysfs和procfs。而procfs就是其中应用最广泛的一种伪文件系统。 
      procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或cat这样的文件操作命令对系统信息进行查取和调整了。同时procfs也提供了一个接口,使得我们自己的内核模块或用户态程序可以通过procfs进行参数的传递。在当今的Linux系统中,大量的系统工具也通过procfs获取内核参数,例如ps、lspci等等,没有procfs它们将可能不能正常工作。 
procfs的使用如同常规的文件系统一样,例如加载一个procfs (首先确定你的内核已经支持procfs默认如此): 
# mount -t proc none /proc 
也可以在/etc/fstab中加入如下一行使系统在启动时自动加载procfs(大多数系统中也是默认如此): 
none /proc proc defaults 0 0 
在proc文件系统中,主要包含三大类内容,进程相关部分,系统信息部分,以及系统子系统部分

在下面我们可以看到一个典型的procfs布局: 

[root@www ~]# ls /proc
1     1230  147  2198   283  41   750        cpuinfo      ipmi        misc          slabinfo       vmstat
10    1238  148  22     284  42   8          crypto       irq         modules       softirqs       zoneinfo
1007  1249  15   2265   29   5    8958       devices      kallsyms    mounts        stat
1037  1262  156  22958  293  586  9          diskstats    kcore       mpt           swaps
1046  1264  157  22966  3    6    9271       dma          keys        mtd           sys
1047  1266  158  23     30   7    935        driver       key-users   mtrr          sysrq-trigger
1076  1268  16   23062  31   705  951        execdomains  kmsg        net           sysvipc
1091  1271  17   23215  32   706  acpi       fb           kpagecount  pagetypeinfo  timer_list
11    1273  18   24     33   707  asound     filesystems  kpageflags  partitions    timer_stats
1110  1274  19   25     369  708  buddyinfo  fs           loadavg     sched_debug   tty
1198  1275  2    26     38   709  bus        interrupts   locks       schedstat     uptime
12    13    20   27     39   710  cgroups    iomem        mdstat      scsi          version
1222  14    21   28     4    72   cmdline    ioports      meminfo     self          vmallocinfo

在上面中我们可以看到procfs包含的内容: 
* 进程相关部分 (只读) 
      这部分文件都是以数字为名的子目录,这个数字就是相关进程的进程ID,在后面中会详细介绍进程相关子目录的结构和信息。 
需要注意的是procfs中进程子系统部分的一个特殊点,就是/proc/self,它是指向当前执行进程的符号连接,或者说--是指向未来你将要执行指令的心灵感应: 
> cat self/cmdline 
catself/cmdline 
在这个命令中,我们希望它显示当前进程的cmdline参数,它恰恰就显示了当前进程--我们所执行的这条命令,cat self/cmdline。幸好这条指令显示出的信息会忽略空格,导致显示略微的不正常,否则我们倒是可以很容易的使用`cat self/cmdline`这样的命令制造出永远循环执行的进程来。;> 
* 内核信息部分 (只读) 
       这部分文件同样处于/proc的顶层目录,不过它们大部分都是常规、只读的文本文件,可以直接用cat查看信息。作为系统内核执行体的抽象,我们也可以把它看作内核"进程"的信息部分,当然虽然并不存在这个进程实体。这里比较特别的一个文件是 /proc/cmdline : 
>cat cmdline 
ro root=/dev/hda2 
在这个文件中存放的是系统内核引导时的命令行参数。
* 内核各子系统相关部分 (部分可调) 
      这部分是系统内核参数调整的重头戏,在procfs中,除去上面所述的两部分内容外,还有很大一部分信息文件被存放在了一些并非以数字命名的特殊目录中,这些目录下的信息就是内核各个重要子系统的信息和可调参数,

主要有: 
bus 总线信息(只读) 
drivers 驱动信息(只读) 
fs 文件系统特别信息(只读) 
ide IDE接口信息(只读) 
irq IRQ信息(只读) 
net 网络子系统信息(只读) 
scsi SCSI系统信息(只读) 
sysvipc IPC子系统信息(只读) 
tty tty子系统信息(只读) 
sys 系统内核可调参数 (可调) 

作为Linux系统内核参数的抽象文件接口,Linux内核的大部分默认可调参数都被放在了 /proc/sys目录下,这些参数都以常规文件的形式体现,并且可以用echo/cat等文件操作命令进行调整,调整的效果是即时的,并且在系统运行的整个生命周期之间都有效(直到再次改变它们或者系统重启)。 
当然Linux也提供了另外一种途径sysctl来调整这些参数,sysctl是从BSD系统继承而来的一种系统参数动态调整方法,sysctl的使用更为简单,并且可以使用/etc/sysctl.conf保存配置以在下次启动时自动加载这些设置

     在/proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改, 可以通过更改/proc/sys中内核参数对应的文件达到修改内核参数的目的(修改过后,保存配置文件就马上自动生效),不过重新启动机器后之前修改的参数值会失效,所以只能是一种临时参数变更方案(适合调试内核参数优化值的时候使用,如果设置值有问题,重启服务器还原原来的设置参数值了。简单方便。)

      但是如果调试内核参数优化值结束后,需要永久保存参数值,就要通过修改/etc/sysctl.conf内的内核参数来永久保存更改。但只是修改sysctl文件内的参数值,确认保存修改文件后,设定的参数值并不会马上生效,如果想使参数值修改马上生效,并且不重启服务器,可以执行下面的命令:

#sysctl –p 

五、/proc/sys下内核文件与配置文件sysctl.conf中变量的对应关系

由于可以修改的内核参数都在/proc/sys目录下,所以sysctl.conf的变量名省略了目录的前面部分(/proc/sys)。 

即将/proc/sys中的文件转换成sysctl中的变量依据下面两个简单的规则:

1.去掉前面部分/proc/sys

2.将文件名中的斜杠变为点

这两条规则可以将/proc/sys中的任一文件名转换成sysctl中的变量名。 

例如:

/proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward

/proc/sys/kernel/hostname =》 kernel.hostname

可以使用下面命令查询所有可修改的变量名

# sysctl –a


推荐阅读:
  1. iOS安全防护之重签名防护与sysctl反调试的示例分析
  2. 输入 “php -v” 找不到命令怎么办

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sysctl 内核参数 sys%

上一篇:追踪Android源码演变——Activity启动全流程

下一篇:时间服务和chrony

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》