Red Hat Enterprise Linux 6从入门到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第5章 系统信息与参数调整

proc文件系统是一个虚拟文件系统,也是系统运行状况的动态反映,不占用任何磁盘空间。作为系统内核数据结构的接口,可利用proc文件系统获取进程的内存映像、系统的配置信息、系统的实时运行状态,以及获取或调整系统的内核参数。proc文件系统通常安装在/proc目录下,其中大多数文件只能读,与系统内核变量有关的部分文件可以修改,借以调整系统内核的参数。

proc文件系统中的目录或文件大体上可以分为三部分:第一部分是系统当前所有进程的内存映像;第二部分是系统当前的配置与运行状态信息,第三部分是系统内核的可调参数。

5.1 进程内存映像文件

在/proc目录中,凡是以数字形式命名的目录均为进程的内存映像。系统中当前正在运行的每一个进程,均存在一个对应的目录,目录的名字以相应进程的进程ID命名。其中,目录1对应于著名的init进程。

在以进程ID命名的每个目录中,存在一系列虚拟文件或目录,如cmdline、cwd、environ、exe、fd、fdinfo、limits、maps、mem、root、smaps、stat、statm、status和task等,这些文件可用于考察进程的运行状态。下面以进程1,即init进程为例,简单介绍其中的部分重要文件。

cmdline文件包含进程的完整命令行信息(除非进程已经交换到swap区或处于zombie状态,cmdline文件为空),如命令的名字、选项和参数等,例如:

        # cat /proc/1/cmdline
        /sbin/init#

注意,在/proc目录下的文件中,一个文件可能包含多个环境变量(或命令行参数),每个变量只占一个字段,采用内部格式表示变量的字符串值,以字符“\0”作为字段分隔符或结尾。因此,为了使文件中的字符串数据可读性更强,可以使用“od -c”或“tr "\0" "\n"”命令形式显示相应的文件。此外,也可使用“echo `cat <file>`”的命令形式显示文件的内容。

cwd是一个符号链接文件,指向进程的当前工作目录。例如,为了找出进程1的工作目录,可以使用下列命令(注意,采用Shell内部命令pwd会产生错误的结果,故这里采用外部的pwd命令):

        # cd /proc/1/cwd; /bin/pwd
        /
        #

environ文件包含进程运行环境的变量设置。由于其中的每一个字段中间均以“\0”字符作为分隔符,且最后仍以“\0”字符结束,因此,为了查询进程1的运行环境,可以使用下列命令:

        # cat /proc/1/environ | tr "\0" "\n"
        HOME=/
        TERM=linux
        PATH=/sbin:/bin:/usr/sbin:/usr/bin
        #

exe是一个符号链接文件,其中包含进程命令文件的实际路径,引用这个文件相当于执行相应的命令。对于进程1而言,则相当于执行/sbin/init命令。

fd是一个子目录,其中包含进程打开的每一个文件,以文件描述符命名,其中0表示标准输入,1表示标准输出,2表示标准错误输出等。fdinfo是从Linux内核2.6.22版开始新增的一个目录,其中也包含进程打开的、以文件描述符命名的每一个文件,每个文件通常包含两个字段:pos字段是一个十进制的数字,表示文件读写的偏移值,flags字段是一个八进制的数字,表示文件的访问权限和文件状态(参见open(2)系统调用)。这个文件仅限于进程属主才能读取其中的内容。例如:

        # ls -l /proc/1/fd
        total 0
        lrwx------. 1 root root 64 Dec  8 06:12 0 -> /dev/null
        lrwx------. 1 root root 64 Dec  8 06:12 1 -> /dev/null
        lrwx------. 1 root root 64 Dec  8 06:12 2 -> /dev/null
        lr-x------. 1 root root 64 Dec  8 06:12 3 -> pipe:[8376]
        l-wx------. 1 root root 64 Dec  8 06:12 4 -> pipe:[8376]
        lr-x------. 1 root root 64 Dec  8 06:12 5 -> inotify
        lr-x------. 1 root root 64 Dec  8 06:12 6 -> inotify
        lrwx------. 1 root root 64 Dec  8 06:12 7 -> socket:[8377]
        lrwx------. 1 root root 64 Dec  8 06:12 9 -> socket:[11597]
        # cat /proc/1/fdinfo/4
        pos:   0
        flags:  04001
        #

limits文件包含进程的各种资源的软性限制、硬性限制及其度量单位等,如CPU时间限制、创建文件的容量限制、创建进程的数量限制,以及打开文件的数量限制等。这个文件仅限于进程属主才能读取其中的内容。例如:

        # cat /proc/1/limits
        Limit                   Soft Limit          Hard Limit          Units
        Max cpu time            unlimited           unlimited           seconds
        Max file size           unlimited           unlimited           bytes
        Max data size           unlimited           unlimited           bytes
        Max stack size          10485760            unlimited           bytes
        Max core file size      0                   unlimited           bytes
        Max resident set        unlimited           unlimited           bytes
        Max processes           16018               16018               processes
        Max open files          1024                1024                files
        ……
        #

maps文件包含当前映射的内存区及其访问权限,例如:

        # cat /proc/1/maps
        00346000-00347000 r-xp 00000000 00:00 0            [vdso]
        0040c000-00423000 r-xp 00000000 fd:00 394197       /lib/libnih.so.1.0.0
        00423000-00424000 rw-p 00017000 fd:00 394197       /lib/libnih.so.1.0.0
        00534000-0054b000 r-xp 00000000 fd:00 394127       /lib/libpthread-2.12.so
        0054b000-0054c000 r--p 00016000 fd:00 394127       /lib/libpthread-2.12.so
        0054c000-0054d000 rw-p 00017000 fd:00 394127       /lib/libpthread-2.12.so
        ……
        08048000-08068000 r-xp 00000000 fd:00 142787       /sbin/init
        08068000-0806a000 rw-p 0001f000 fd:00 142787       /sbin/init
        08771000-08792000 rw-p 00000000 00:00 0            [heap]
        b773e000-b7741000 rw-p 00000000 00:00 0
        b7752000-b7753000 rw-p 00000000 00:00 0
        bfc97000-bfcac000 rw-p 00000000 00:00 0            [stack]
        #

其中,第1个字段是进程占用的地址空间。第2个字段是由r(读)、w(写)、x(执行)、s(共享)和p(专用)等字符表示的访问权限。第3个字段是相对于文件起始位置的读写偏移值。第4个字段是以主次设备号“major:minor”形式表示的设备。第5个字段是文件所在文件系统中的信息节点号(0表示不存在与内存区相关联的信息节点,如bss)。第6个字段是进程的路径文件名。

mem文件反映的是进程的内存页面,可以利用open()、read()和fseek()等系统调用访问mem文件,进而访问进程的内存页面。

root是一个符号链接文件,指向进程的虚拟根目录。虚拟根目录是Linux系统的重要功能特性,利用chroot命令或chroot(2)系统调用,可以针对每个进程设置文件系统的虚拟根目录。在下面的例子中,进程1(也即init进程)的虚拟根目录仍为系统的实际根目录:

        # ls -l /proc/1/root
        lrwxrwxrwx. 1 root root 0 Dec  8 06:29 /proc/1/root -> /
        #

smaps文件反映了每个进程的内存映射的使用情况。在每个进程的内存映射中,第一行输出信息与maps文件的内容完全相同。其他行分别给出了进程内存映射的大小、当前驻留内存部分的大小、共享页面中已处理和尚未写回磁盘的内存大小,以及专用页面中已处理和尚未写回磁盘的内存大小等。例如:

        # cat /proc/1/smaps
        ……
        08048000-08068000 r-xp 00000000 08:02 142579    /sbin/init (deleted)
        Size:              128 kB
        Rss:               104 kB
        Pss:               104 kB
        Shared_Clean:       0 kB
        Shared_Dirty:       0 kB
        Private_Clean:    104 kB
        Private_Dirty:      0 kB
        Referenced:       104 kB
        Swap:                0 kB
        KernelPageSize:     4 kB
        MMUPageSize:        4 kB
        ……
        #

stat文件包含进程的运行状态信息。实际上,ps命令也是利用这个文件输出进程状态信息的。文件内容的第1个字段是进程ID,位于圆括号中的第2个字段是进程的文件名,第3个字段采用一个字符表示进程的当前状态,其中包括R(运行)、S(休眠)、D(等待I/O)、Z(僵尸)、T(跟踪或停止)以及W(页面调度)等,第4个字段是父进程的进程ID,等等(参见ps命令的输出结果)。例如:

        $ cat /proc/1/stat
        1 (init) S 0 1 1 0 -1 4202752 2117 14234819 10 1181 0 208 5106 26326 20 0 1
        0 13 2891776 349 4294967295 134512640 134641011 3220586048 3220585168 6403108
        0 0 4096 536962595 0 0 0 0 0 0 0 21 0 0
        $

statm文件以页面为单位,提供内存的状态信息 —— 从左边第1个字段开始,其输出信息分别为:整个程序的大小、程序内存驻留部分的大小、共享页面数量、代码部分的大小、库函数部分的大小、数据或栈段部分的大小,以及尚未写入磁盘的数据页面数量。例如:

        $ cat /proc/1/statm
        706 349 298 32 0 65 0
        $

status文件提供的信息主要来自/proc/pid/stat和/proc/pid/statm文件,只是以更容易阅读和理解的形式给出,其中包括进程的名字、状态(如R表示运行,S表示休眠等)、PID、有效用户ID、用户组ID、当前分配的文件描述符数量(FDSize),以及各种内存使用情况的详细数据,如虚拟内存的大小(VmSize)、内存驻留部分的大小(VmRSS)、共享库代码部分的大小(VmLib)、代码段(VmExe)、数据段(vmData)及栈段(VmStk)的大小等。例如:

        $ cat /proc/1/status
        Name:   init
        State:  S (sleeping)
        Tgid:   1
        Pid:    1
        PPid:   0
        TracerPid:  0
        Uid:    0   0   0   0
        Gid:    0   0   0   0
        Utrace: 0
        FDSize: 32
        Groups:
        VmPeak:        2876 kB
        VmSize:        2824 kB
        VmLck:            0 kB
        VmHWM:         1408 kB
        VmRSS:         1396 kB
        VmData:         172 kB
        VmStk:           88 kB
        VmExe:          128 kB
        VmLib:         2364 kB
        VmPTE:           48 kB
        VmSwap:           8 kB
        Threads:             1
        ……
        $

task是一个目录。对于一个多线程的进程,其中可能包含若干子目录,每个子目录对应进程的一个线程。在每一个子目录中,也存在一组与进程目录中同名的文件,且其意义也完全相同。

5.2 系统配置信息

通过查询proc文件系统,可以了解当前系统硬件设备的配置信息,如CPU、内存、系统总线、I/O设备、IDE和SCSI磁盘设备、磁盘分区、硬件中断、I/O端口的内存映射以及硬件设备的主次设备号等。

1./proc/cpuinfo文件

/proc/cpuinfo文件含有CPU以及其他系统结构信息,包括CPU的数量、型号、缓存以及时钟频率等。例如:

        $ cat /proc/cpuinfo
        processor       : 0
        vendor_id       : GenuineIntel
        cpu family      : 6
        model           : 37
        model name      : Intel(R) Core(TM) i5 CPU      M 430  @ 2.27GHz
        stepping        : 2
        cpu MHz         : 2261.179
        cache size      : 3072 KB
        fdiv_bug        : no
        hlt_bug         : no
        f00f_bug        : no
        coma_bug        : no
        fpu             : yes
        fpu_exception   : yes
        cpuid level     : 11
        wp              : yes
        flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
        ……
        $

其中的部分内容说明如下:

· processor —— 提供系统配备的每个CPU的标识号。在只有一个CPU的系统中,其标识号为0。

· cpu family —— CPU系列的标识号。对于Intel x86系列的计算机系统而言,把这个数字加到“86”前面,即可确定CPU的系列类型。在老式的586、486甚至386系统中,这个数值是特别有用的。有些软件包是针对特定的CPU结构编译的,因此,这个数值有助于用户正确选择应安装的软件包。

· model name —— CPU的通用名字。

· cpu MHz —— CPU的时钟频率(MHz),精确到小数点后三位。

· cache size —— CPU二级缓存的大小。

· fpu —— 浮点运算单元。

· flags —— 说明CPU的品质,如是否包括浮点运算单元(FPU),以及是否具有处理MMX指令的能力等。

2./proc/filesystems文件

/proc/filesystems文件包含系统内核当前支持的文件系统列表,表示相应的文件系统支持模块已编译进系统内核。在安装文件系统时,如果未指定文件系统的类型,mount命令将会依次使用这个文件中的信息确定文件系统的类型,尝试安装文件系统。例如:

        $ cat /proc/filesystems
        nodev       sysfs
        nodev       rootfs
        nodev       bdev
        nodev       proc
        ……
        nodev       usbfs
        nodev       pipefs
        ……
                    iso9660
        nodev       mqueue
        nodev       selinuxfs
                    ext4
        ……
        $

在上述输出信息中,第1列表示文件系统是否位于块设备中,如果第1列为nodev,意味着相应的文件系统并非基于磁盘设备的文件系统;第2列给出的是Linux系统支持的文件系统的名字。

/proc/iomem文件包含I/O内存映射,例如:

        $ cat /proc/iomem
        00000000-0000ffff : reserved
        00010000-0009f7ff : System RAM
        0009f800-0009ffff : reserved
        000a0000-000bffff : Video RAM area
        000c0000-000c7fff : Video ROM
        000ca000-000cbfff : reserved
        000ca000-000cafff : Adapter ROM
        000dc000-000e3fff : reserved
        000e8000-000fffff : reserved
        000f0000-000fffff : System ROM
        00100000-3feeffff : System RAM
        00400000-00812005 : Kernel code
        00812006-00a3d007 : Kernel data
        00ac5000-00bd18a3 : Kernel bss
        ……
        $

3./proc/partitions文件

/proc/partitions文件包含磁盘与磁盘分区的主次设备号、存储容量(数据块数量)以及设备文件名。其内容类似于“fdisk -l”命令的输出结果。

        # cat /proc/partitions
        major  minor     #blocks   name
          8      0      78150744   sda
          8      1      20482843   sda1
          8      2      28667992   sda2
          8      3        512000   sda3
          8      4              1  sda4
          8      5      28486656   sda5
        ……
        # fdisk –l /dev/sda
        ……
        Device Boot        Start       End        Blocks    Id  System
        /dev/sda1   *           1      2550    20482843+     7  HPFS/NTFS
        /dev/sda2            2551      6119    28667992+     7  HPFS/NTFS
        /dev/sda3            6120      6183       512000    83  Linux
        /dev/sda4            6183      9730     28487680     5  Extended
        /dev/sda5            6183      9730     28486656    8e  Linux LVM
        #

在上述partitions文件的输出信息中,每个字段的意义简述如下:

· major —— 磁盘以及磁盘分区的主设备号。

· minor —— 磁盘以及磁盘分区的次设备号。

· #blocks —— 磁盘以及磁盘分区中包含的物理磁盘数据块数量。

· name —— 磁盘以及磁盘分区的设备名。

4./proc/modules文件

/proc/modules文件包含已经加载到系统内核的所有模块列表,其内容等同于lsmod命令的输出结果。下面是modules文件中的部分内容,以及lsmod命令的部分输出结果:

        $ cat /proc/modules
        nls_utf8    1005    1   -   Live    0xf7e7d000
        fuse        56128   0   -   Live    0xf7e3f000
        vmblock     10322   1   -   Live    0xf9017000
        vsock       36366   0   -   Live    0xf8f2d000
        vmhgfs      47641   0   -   Live    0xf8e01000
        ……
        $ lsmod
        Module              Size   Used by
        nls_utf8            1005   1
        fuse               56128   0
        vmblock            10322   1
        vsock              36366   0
        vmhgfs             47641   0
        ……
        $

在上述输出信息中,第1列是模块的名字;第2列是模块占用的内存字节数;第3列表示当前已经加载了多少个模块实例(0表示模块尚未加载);第4列表明相应的模块是否依赖于其他模块的存在才能正常运行,如是,则列出依赖的模块;第5列是模块的加载状态,如Live、Loading或Unloading;第6列是加载的模块相对于当前系统内核起始内存地址的偏移值(这个信息可用于调试模块)。

5./proc/mounts文件

/proc/mounts文件能够提供系统当前安装的所有文件系统信息,其输出数据类似于/etc/mtab文件的内容,只是其数据总是保持最新状态(实际上,/proc目录中的所有文件总是保持最新状态)。这个文件的数据格式完全遵循fstab(5)文件的格式规定,示例如下:

        $ cat /proc/mounts
        rootfs / rootfs rw 0 0
        /proc /proc proc rw,relatime 0 0
        ……
        /dev/mapper/vg_iscas-lv_root / ext4 rw,seclabel,relatime,barrier=1, data=ordered 0 0
        ……
        /dev/sda3 /boot ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
        ……
        $

在上述输出信息中,第1列是安装的设备名,第2列是安装点,第3列是文件系统的类型,第4列表示安装方式,如只读(ro)或读写(rw)等,第5列和第6列并没有实际的意义,其目的只是为了保持与/etc/mtab文件格式一致而已。

6./proc/version文件

/proc/version文件含有当前运行的Linux系统内核(包括gcc)的版本信息。其中也提供了操作系统类型(参见/proc/sys/kernel/ostype文件)及版本(参见/proc/sys/kernel/osrelease与/proc/sys/kernel/version文件)等信息。例如:

        $ cat /proc/version
        Linux version 2.6.32-71.el6.i686 (mockbuild@x86-004.build.bos.redhat.com)
        (gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC) ) #1 SMP Wed Sep 1 01:26:34
        EDT 2010
        $ cat /proc/sys/kernel/ostype
        Linux
        $ cat /proc/sys/kernel/osrelease
        2.6.32-71.el6.i686
        $ cat /proc/sys/kernel/version
        #1 SMP Wed Sep 1 01:26:34 EDT 2010
        $

5.3 系统运行状态信息

1./proc/cmdline文件

/proc/cmdline文件含有启动系统时传递给Linux内核的引导参数,例如:

        $ cat /proc/cmdline
        ro root=/dev/mapper/vg_iscas-lv_root rd_LVM_LV=vg_iscas/lv_root rd_LVM_LV=
        vg_iscas/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=zh_CN.UTF-8 KEYBOARDTYPE=
        pc KEYTABLE=us rhgb quiet
        $

2./proc/fs/nfsd/exports文件

/proc/fs目录包含对外公布的共享文件系统,如果系统正在运行NFS服务器软件,使用cat命令显示/proc/fs/nfsd/exports文件,可以看到当前系统提供的共享资源,以及赋予目录或文件系统的访问权限及安装要求。例如:

        $ cat /proc/fs/nfsd/exports
        # Version 1.2
        # Path Client(Flags) # IPs
        /share/docs    *,192.168.90.0/24(rw,no_root_squash,sync,wdelay,no_subtree_
        check,uuid=db2619ff:22d98ac6:00000000:00000000)
        /          *,192.168.90.0/24(ro,no_root_squash,sync,no_wdelay,no_subtree_
        check, v4root,fsid=0,uuid=db2619ff:22d98ac6:00000000:00000000)
        /share  *,192.168.90.0/24(ro,no_root_squash,sync,no_wdelay,no_subtree_
        check,v4root,uuid=db2619ff:22d98ac6:00000000:00000000)
        $

3./proc/kallsyms文件

/proc/kcore文件含有系统内核声明的各种模块定义,以便模块处理工具能够动态地连接与加载。

4./proc/kcore文件

/proc/kcore文件是系统物理内存的映像,采用ELF文件格式存储。利用这个虚拟文件与完整的二进制内核文件(/usr/src/linux/vmlinux),可以使用gdb等工具考察任何内核数据结构的当前状态。文件的大小等于物理内存的大小再加上4KB,以字节为单位。

5./proc/kmsg文件

/proc/kmsg文件用于存储系统内核生成的各种信息。注意,只有超级用户才能读取这个文件,且同时只能有一个进程读取这个文件。因此,如果采用syslog(2)系统调用读取并记录系统内核信息的syslog进程正在运行,则不应当读取这个文件,否则将处于等待状态,因而读不到任何数据。通常应使用dmesg命令读取这个文件中的系统信息。

6./proc/loadavg文件

/proc/loadavg文件的前3个字段是最近1分钟、5分钟以及15分钟之内系统负载的平均值。所谓的系统负载指的是位于运行队列(状态为R)或等待I/O完成(状态为D)的进程数量。这3个字段值与uptime命令输出结果中的最后3个系统负载平均值是相同的。第4个字段包括一对数值,中间增加一个斜杠“/”分隔字符,其中的第1个数值是系统中当前调度执行的进程或线程的数量,这个数值应小于或等于系统配置的CPU数量;第2个数值是系统当前调度运行的进程或线程的总数。第5个字段是系统中最近一次创建的进程ID。例如:

        $ cat /proc/loadavg
        0.02 0.02 0.00 1/211 5665
        $ uptime
        06:43:33 up  1:43,  2 users,  load average: 0.01, 0.02, 0.00
        $

7./proc/meminfo文件

/proc/meminfo文件提供了系统中整个内存、空闲内存和已用内存(包括实际内存和虚拟内存)的数量,以及系统内核使用的共享内存和缓冲区的数量。事实上,这个文件的内容与free命令的输出结果完全一致,不过free命令给出的只是其中的一部分,示例如下:

        $ cat /proc/meminfo
        MemTotal:          2063440 kB
        MemFree:           1469496 kB
        Buffers:             47140 kB
        Cached:             310104 kB
        SwapCached:              0 kB
        Active:             193184 kB
        Inactive:           271044 kB
        ……
        HighTotal:         1181592 kB
        HighFree:           749208 kB
        LowTotal:           881848 kB
        LowFree:            720288 kB
        SwapTotal:         4128760 kB
        SwapFree:          4128760 kB
        Dirty:                   0 kB
        Writeback:               0 kB
        AnonPages:          107000 kB
        Mapped:              61536 kB
        Shmem:               25188 kB
        Slab:               103412 kB
        ……
        VmallocTotal:       122880 kB
        VmallocUsed:         13768 kB
        VmallocChunk:        94424 kB
        ……
        $ free
                           total      used      free   shared   buffers    cached
        Mem:             2063440    594316   1469124         0     47204   310208
        -/+               236904   1826536
        buffers/cache:
        Swap:            4128760         0   4128760
        $

由于其中提供了大量有价值的系统内存及其使用情况,这个文件是/proc目录最常用的文件之一,free、top和ps等命令的许多输出信息大都取自这个文件。

· MemTotal —— 系统配备的物理内存的总和(以KB为单位)。

· MemFree —— 系统中空闲物理内存的数量(以KB为单位)。

· Buffers —— 系统中用做文件缓冲区的物理内存数量(以KB为单位)。

· Cached —— 系统中用做缓冲区内存的物理内存数量(以KB为单位)。

· SwapCached —— 用做缓冲区内存的交换区的数量(以KB为单位)。

· Active —— 当前正在使用的缓冲区或页面内存(即最近一直在用,通常无法回收利用的内存)的总和(以KB为单位)。

· Inactive —— 空闲可用的缓冲区或页面内存(即最近一直没有使用,因而可以回收利用的内存)的总和(以KB为单位)。

· HighTotal —— 没有直接映射为系统内核空间的内存总和(以KB为单位)。

· HighFree —— 非系统内核映射空间中的空闲内存数量(以KB为单位)。

· LowTotal —— 直接映射为系统内核空间的内存总和(以KB为单位)。

· LowFree —— 系统内核映射空间中的空闲内存数量(以KB为单位)。

· SwapTotal —— 可用交换区的容量总和(以KB为单位)。

· SwapFree —— 空闲交换区的容量总和(以KB为单位)。

· Dirty —— 其中的数据正等待写入磁盘的内存总和(以KB为单位)。

· Writeback —— 其中的数据正在写入磁盘的内存总和(以KB为单位)。

· Mapped —— 使用mmap命令映射设备、文件或库函数后占用的内存总和(以KB为单位)。

· Slab —— 系统内核使用的数据结构缓冲区占用的内存总和(以KB为单位)。

· VMallocTotal —— 分配用做虚拟地址空间的内存总和(以KB为单位)。

· VmallocUsed —— 已用于虚拟地址空间的内存总和(以KB为单位)。

· VMallocChunk —— 虚拟地址空间可用的最大连续内存块(以KB为单位)。

8./proc/net子目录

/proc/net子目录包括各种网络文件,这些文件给出了每个网络层的状态信息。文件的内容均为普通的ASCII数据,因而可以利用cat等命令进行查询。实际上,netstat和ifconfig等命令就是利用这些文件作为其信息源,提供各种统计数据的。而且,netstat等命令提供的数据可读性更强,显示格式更规范,故这里仅以两个文件为例予以说明。

(1)/proc/net/arp文件

/proc/net/arp文件包含系统内核实现地址解析的ARP表。其中的ARP解析项或者是预定义的,或者是动态获取的。在下述输出信息中,有关“HW type”和“Flags”字段的详细说明,可以参考/usr/include/linux/if_arp.h文件,也可以比照netstat命令的输出信息。

        $ cat /proc/net/arp
        IP address      HW type   Flags     HW address           Mask    Device
        192.168.90.101  0x1        0x2       00:01:4a:03:c3:0c   *       eth0
        $

(2)/proc/net/dev文件

/proc/net/dev文件含有网络设备的状态统计信息,包括发送与接收的分组数据统计、错误与碰撞的统计数据,以及其他统计数据。dev文件的内容类似于ifconfig命令的输出结果,但ifconfig命令的输出信息可读性更强。例如:

        $ cat /proc/net/dev
        Inter-|   Receive                                          |  Transmit
        face|bytes   packets errs drop fifo frame compressed multicast|bytes  packets errs
        drop fifo colls carrier compressed
            lo:  53314   583   0    0    0    0         0        0  53314    583   0
            0    0     0        0          0
        eth0:  131956  1485   0    0    0    0         0       28  146858   1291   0
            0    0     0        0          0
        $ ifconfig
        eth0    Link encap:Ethernet  HWaddr 00:0F:FE:22:29:D2
                inet addr:192.168.90.100  Bcast:192.168.90.255  Mask:255.255.255.0
                inet6 addr: fe80::20f:feff:fe22:29d2/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:1505 errors:0 dropped:0 overruns:0 frame:0
                TX packets:1304 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:133454 (130.3 KiB)  TX bytes:148473 (144.9 KiB)
                Interrupt:17
        lo      Link encap:Local Loopback
                inet addr:127.0.0.1  Mask:255.0.0.0
                inet6 addr: ::1/128 Scope:Host
                UP LOOPBACK RUNNING  MTU:16436  Metric:1
                RX packets:583 errors:0 dropped:0 overruns:0 frame:0
                TX packets:583 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0
                RX bytes:53314 (52.0 KiB)  TX bytes:53314 (52.0 KiB)
        $

9./proc/stat文件

/proc/stat文件提供了自最近一次系统启动以来,系统内核收集的各种统计信息,其输出内容也可以从vmstat和iostat等命令中获得,只不过stat文件包含的是分类时间统计信息,而iostat(注意,运行iostat命令之前需要安装sysstat软件包)和vmstat命令给出的是每一类统计数据占整个时间的百分比。示例如下:

        $ cat /proc/stat
        cpu  6972 0 2128 199953 4405 9 36 0 0
        cpu0 6972 0 2128 199953 4405 9 36 0 0
        intr 160570 144 46 0 0 2 0 0 0 1 0 0 0 4 0 6899 0 499 1379 0 18017 2 3936 0 0 0
        ……
        ctxt 228059
        btime 1295610457
        processes 2797
        procs_running 1
        procs_blocked 0
        softirq 274334 0 121296 423 1589 19155 0 40 0 28 131803
        $ iostat
        Linux 2.6.32-71.el6.i686 (iscas)       01/21/11       _i686_  (1 CPU)
        avg-cpu:  %user         %nice      %system    %iowait     %steal    %idle
                  3.26          0.00         1.02       2.06       0.00    93.67
        Device:     tps    Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
        sda        8.41        263.95        10.89     565034      23322
        scd0       0.02          0.10         0.00        216           0
        dm-0      11.07        257.78        10.89     551834      23304
        dm-1       0.15          1.20         0.00       2576           0
        $ vmstat
        procs -----------memory----------- ---swap-- -----io---- --system-- -----cpu-----
        r  b   swpd   free   buff  cache   si   so   bi   bo   in   cs us sy id wa st
        0  0     0 1379652  67340 235608  22    0    0   133   75  107  3  1 94  2  0
        $

在/proc/stat文件的输出信息中,每个字段的意义简述如下:

· cpu —— 其中前7个数据分别是CPU处于用户模式、低优先级用户模式(nice)、系统模式、空闲状态、等待I/O完成、处理硬件中断及处理软件中断的时间(对于Intel x86系列计算机而言,时间计数单位为1/100秒)。其中第1行是所有CPU的累加值,随后依次给出每一个CPU的统计信息。上述例子表示当前系统仅配有一个CPU。

· intr —— 自系统启动以来处理中断的数量。其中第1列是中断处理的总和,随后的数字是针对每一类中断的分类统计。

· ctxt —— 系统经历的CPU上下文切换的次数。

· btime —— 系统启动的时间,其数值是从1970年1月1日算起的时间累加值(秒数)。

· processes —— 自启动以来系统创建的进程总和。

· procs_running —— 处于可运行状态的进程数量。

· procs_blocked —— 因等待I/O完成而处于等待状态的进程数量。

10./proc/swaps文件

swaps文件包含交换区存储空间的配置及其使用情况。其中包括每个交换区的文件名、交换区存储空间的类型、交换区的总容量(KB)、当前占用的交换区容量(KB),以及交换区的优先级。优先级越低,交换区的选用越优先。如果系统中仅配备一个交换区,其输出信息如下:

        $ cat /proc/swaps
        Filename            Type            Size        Used        Priority
        /dev/sda3           partition       2064376     0           -1
        $

11./proc/sysvipc子目录

/proc/sysvipc子目录包含三个虚拟文件:msg、sem和shm,分别用于查询消息队列、信号灯和共享内存的运行状态信息。这些文件的内容类似于ipcs命令的输出结果。例如:

        $ cat /proc/sysvipc/shm
              key     shmid perms      size  cpid  lpid nattch   uid   gid  cuid  cgid
        atime     dtime     ctime
                0    131072  1600    393216 14459 14488     2   500   500   500   500
        1291813562 1291813562 1291813561
                0    163841  1600    393216 14482 14625     2   500   500   500   500
        1291813907 1291813907 1291813564
                0    196610  1600    393216 14502 14213     2   500   500   500   500
        1291813567          0 1291813567
        ……
        $

12./proc/uptime文件

/proc/uptime文件包含两个数值:系统自最近一次启动迄今为止的运行时间(秒)和系统的空闲时间(秒)。uptime文件第1个字段的值等同于uptime命令输出的第3个字段的值。只不过两者的时间单位及表示形式不同。例如:

        $ cat /proc/uptime
        6900.03 6103.16
        $ uptime
        06:55:30 up  1:55,  2 users,  load average: 0.01, 0.03, 0.00
        $

13./proc/vmstat文件

/proc/vmstat文件包含各种虚拟内存的统计信息,参见vmstat命令。

5.4 系统可调参数

/proc/sys是一个非常重要的目录,其中含有大量的文件,分别位于fs、kernel和net等子目录中,每个文件对应于系统内核的一个或多个可调参数变量。

利用kernel与net等目录中的文件,可以查询系统内核的可调参数值。作为超级用户,可以利用sysctl命令或sysctl()系统调用,修改系统内核的可调参数,也可以使用echo等命令把新的参数值直接写到相应的参数变量文件中(注意,不能使用sudo运行这里介绍的echo命令。为方便起见,可首先运行“sudo -i”命令,进入超级用户的Shell环境)。例如:

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

但需要记住的是,这种内核参数的修改方式是临时性的,仅对当前的运行系统有效,一旦重新启动,系统将会重新恢复默认的内核参数设置。为了使定制的系统内核参数总是保持有效,详见最后一节的介绍。

5.4.1 文件系统可调参数

/proc/sys/fs目录主要包含与文件系统有关的系统内核参数。其中的file-max文件定义了系统范围内所有进程能够打开的文件数量,其默认值如下:

        $ cat /proc/sys/fs/file-max
        202387
        $

如果在运行过程中经常出现文件描述符不足等错误信息,可以采用下列命令增加打开文件的数量限制(也可以使用setrlimit(2)系统调用设置每个进程能够打开的文件数量限制):

        # echo 150000 > /proc/sys/fs/file-max
        #

注意,设置file-max文件中的参数值时不能超过内核变量NR_OPEN规定的上限,参见/usr/include/linux/fs.h文件。

/proc/sys/fs/file-nr是一个只读文件,其中给出了3个重要的参数值:已分配的文件描述符的数量、空闲文件描述符的数量,以及文件描述符的最大数量。Linux系统内核采用动态的方式分配文件描述符,而且不会释放,因而无法回收再使用。如果已分配的文件描述符的数量接近于最大值,应当考虑增加最大值,例如:

        $ cat /proc/sys/fs/file-nr
        5408   0      202387
        $

/proc/sys/fs/inode-state文件含有7个数值:nr_inodes、nr_free_inodes、preshrink和4个空值(/proc/sys/fs/inode-nr文件只包含前两个参数值)。nr_inodes是系统已经分配的信息节点的数量(这个参数可能稍微大于inode-max,因为Linux系统分配信息节点采用的是一次分配一个整页面的方式)。nr_free_inodes是空闲信息节点的数量。例如:

        $ cat /proc/sys/fs/inode-state
        44224   27  0   0   0   0   0
        $

5.4.2 系统内核可调参数

/proc/sys/kernel是一个非常重要的子目录,其中的文件表示系统内核的可调参数。常见的或经常需要调整的内核参数包括msgmax、msgmnb、msgmni、sem、shmall、shmmax和shmmni等。

1.消息队列

/proc/sys/kernel/msgmax文件定义了系统范围内单个System V消息的最大字节数。/proc/sys/kernel/msgmni文件定义了系统范围内消息队列标识符的最大数量限制。/proc/sys/kernel/msgmnb文件定义了系统范围内可以写入消息队列的最大字节数。下面的例子给出了系统的默认值:

        $ cat /proc/sys/kernel/msgmax
        8192
        $ cat /proc/sys/kernel/msgmni
        1722
        $ cat /proc/sys/kernel/msgmnb
        16384
        $

/proc/sys/fs/mqueue目录包括3个文件:msg_max、msgsize_max和queues_max,用于控制POSIX消息队列使用的资源。POSIX消息队列是一个全新的消息队列,与System V的消息队列完全不同,详见mq_overview(7)的说明。下面的例子给出了3个消息队列参数的默认值:

        $ cat /proc/sys/fs/mqueue/msg_max
        10
        $ cat /proc/sys/fs/mqueue/msgsize_max
        8192
        $ cat /proc/sys/fs/mqueue/queues_max
        256
        $

2.共享内存

/proc/sys/kernel/shmall文件包含系统范围内共享内存页面的数量限制。示例如下:

        $ cat /proc/sys/kernel/shmall
        2097152
        $

/proc/sys/kernel/shmmax文件可用于查询和设置用户当前能够创建和使用的最大共享内存段的大小限制。Linux系统内核当前支持的最大共享内存段为1GB。示例如下:

        $ cat /proc/sys/kernel/shmmax
        33554432
        $

/proc/sys/kernel/shmmni文件用于指定系统范围内用户能够创建和使用的共享内存段的最大数量限制。示例如下:

        $ cat /proc/sys/kernel/shmmni
        4096
        $

3.信号灯

/proc/sys/kernel/sem文件包含4个IPC信号灯参数值:SEMMSL表示每个信号灯集合支持的最大信号灯数量;SEMMNS表示系统范围内所有信号灯集合能够支持的最大信号灯数量限制;SEMOPM表示每个semop()系统调用中能够指定的最大信号灯操作数量;SEMMNI表示系统范围内信号灯标识符的最大数量限制。示例如下:

        $ cat /proc/sys/kernel/sem
        250    32000   32     128
        $

4.网络可调参数

/proc/sys/net/ipv4目录包括的虚拟文件涉及各种网络设置,可用于查询和修改IP、TCP以及UDP等网络协议方面的可调参数。其中的许多设置可用于防止系统攻击,或设置系统的路由功能。

下面是/proc/sys/net/ipv4目录中的部分重要文件:

· icmp_echo_ignore_all —— 表示系统内核是否忽略任何主机(包括自己)的ICMP ECHO分组数据。这个参数的默认值为0,意味着系统应响应ICMP ECHO分组数据。1表示忽略所有的ICMP ECHO请求。此时,任何主机都无法使用ping命令或其他类似的工具联系当前的主机系统。

          $ cat /proc/sys/net/ipv4/icmp_echo_ignore_all
          0
          $

· icmp_echo_ignore_broadcasts —— 除了区分是否发至广播或多播地址的ICMP分组数据外,其意义同上。这个参数的默认值为1。

          $ cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
          1
          $

· ip_default_ttl —— 用于设置默认的生存时间(Time To Live,TTL)参数,限制在到达目的主机之前,分组数据能够跳转的网络数量。ip_default_ttl的默认值为64。注意,增加这个参数值可能会降低系统的性能。每当经由一个路由器或网关时,分组数据的TTL值将减1。若TTL值减为0时仍未到达目的主机,分组数据将被扔掉。示例如下:

          $ cat /proc/sys/net/ipv4/ip_default_ttl
          64
          $

· ip_forward —— 用于启用或禁用IP转发功能,即允许或禁止系统中的网络接口向另外一个网络接口转发分组数据。这个参数的默认值为0(即禁止转发分组数据)。如果把这个参数设置为1,表示允许转发网络分组数据。利用这个参数,可以启用或关闭在网络接口之间转发分组数据的功能,允许Linux系统作为一个防火墙或路由器。注意,这是一个极其重要的特殊变量,可用于设置NAT、防火墙、路由和伪装等。一旦改动这个参数值,能够导致其他配置参数的重置,使其恢复到默认状态。

· ip_local_port_range —— 用于指定TCP或UDP使用的端口范围。第1个数值是可用的最低端口号,第2个数值是可用的最高端口号。对于任何系统,当默认的端口号1024~4999仍不能满足要求时,可以利用这个参数,在32 768~61 000之间选定一个端口号范围。示例如下:

          $ cat /proc/sys/net/ipv4/ip_local_port_range
          32768   61000
          $

· tcp_keepalive_probes —— 这个参数值告诉系统内核,在确认一个网络连接已经断开之前应发出多少keepalive试探分组数据。tcp_keepalive_probes的默认值为9,即在发出9个keepalive试探分组数据仍未收到回应时,可据此断定网络连接已经断开。示例如下:

          $ cat /proc/sys/net/ipv4/tcp_keepalive_probes
          9
          $

· tcp_keepalive_intvl ——用于指定链路空闲时仍然保持网络连接存活状态的时间长度(秒)。tcp_keepalive_intvl的默认值为75秒。这个参数值告诉系统内核,对于发出的每一个keepalive试探分组数据,能够容忍的等待回应时间有多长。这个参数值也用于计算网络连接的超时值。按照tcp_keepalive_probes的默认值为9计算,则默认的等待时间约为11分钟(75秒× 9),超过此限,则断开连接。示例如下:

          $ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
          75
          $

· tcp_keepalive_time —— 这个参数告诉TCP/IP协议栈,如果网络连接一直空闲,应以何种时间频率(以秒为单位)发送TCP keepalive分组数据,以便保持网络连接的存活。tcp_keepalive_time的默认值为7200秒,也即2小时。如果需要调整,通常不应低于默认值,否则会造成不必要的网络资源消耗。示例如下:

          $ cat /proc/sys/net/ipv4/tcp_keepalive_time
          7200
          $

5.其他系统可调参数

/proc/sys/kernel/ctrl-alt-del文件中的参数值用于控制怎样处理控制台键盘的Ctrl-Alt-Del组合键。当ctrl-alt-del文件中的参数值为0时,系统会随时检测Ctrl-Alt-Del组合键,一旦按下此组合键,将会把这一信号发送给init进程处理。init进程的默认处理方式是从容地重新启动系统。当这个参数值大于0时,将会立即重新启动系统。例如:

        $ cat /proc/sys/kernel/ctrl-alt-del
        0
        $

/proc/sys/kernel/domainname和/proc/sys/kernel/hostname文件用于查询和设置当前系统的域名和主机名,其作用相当于执行domainname和hostname命令。例如,执行下面两个命令:

        # echo "iscas" > /proc/sys/kernel/hostname
        # echo "mydomain" > /proc/sys/kernel/domainname
        相当于执行下面两个命令:
        # hostname "iscas"
        # domainname "mydomain"

/proc/sys/kernel/panic文件含有panic_timeout内核参数值。如果这个参数值为0,在遇到致命的故障时,系统将会处于暂停状态。如果这个参数值为非0值,系统将会在遇到故障时暂停参数值指定的时间(秒),然后重新引导系统。默认的参数值如下:

        $ cat /proc/sys/kernel/panic
        0
        $

/proc/sys/kernel/panic_on_oops文件用于控制系统遇到故障时的下一步处理动作。如果这个文件的参数值为0,系统将会尝试继续运行。如果参数值为1,系统将会在延迟数秒(以便klogd有时间记录错误信息)之后停机。如果/proc/sys/kernel/panic文件的参数值也是一个非0值,将会重新启动系统。默认的参数值如下:

        $ cat /proc/sys/kernel/panic_on_oops
        1
        $

/proc/sys/kernel/pid_max文件用于指定进程ID循环计数的最大值。在一个32位字长的系统中,这个参数的默认值是32768,进程的ID号不能超过这个参数值指定的范围。当达到这个文件指定的数值时,系统将会从头开始重新分配进程的ID号。例如:

        $ cat /proc/sys/kernel/pid_max
        32768
        $

/proc/sys/kernel/printk文件包含4个数值:console_loglevel、default_message_loglevel、minimum_console_level和default_console_loglevel。这4个参数值用于设定控制台错误信息输出或日志记录的级别。有关日志记录级别的说明详见syslog(2)。按照顺序,日志级别可以分为下列7种类型:

· 0 —— 内核紧急状态信息,系统已无法运行;

· 1 —— 严重内核警报信息,必须立即采取修复措施;

· 2 —— 严重内核错误信息;

· 3 —— 普通内核错误信息;

· 4 —— 普通内核警告信息;

· 5 —— 普通内核提醒信息;

· 6 —— 内核提示信息;

· 7 —— 内核调试信息。

如果信息的级别高于console_loglevel定义的级别,相应的信息就能够输出到控制台。没有明显定义级别的信息将会按照default_message_level级别处理。minimum_console_loglevel是console_loglevel能够设置的最小值。default_console_loglevel是console_loglevel的默认值。示例如下:

        $ cat /proc/sys/kernel/printk
        4      4      1      7
        $

/proc/sys/kernel/pty目录存在两个文件,其中max文件定义了系统当前支持的最大伪终端设备数量,只读文件nr表示系统当前正在使用的伪终端设备数量。例如:

        $ cat /proc/sys/kernel/pty/max
        4096
        $ cat /proc/sys/kernel/pty/nr
        4
        $

/proc/sys/kernel/sysrq文件用于激活系统请求键SysRq。其默认值为0,表示禁用系统请求键。任何非零值表示激活系统请求键。

利用SysRq组合键,用户能够直接与系统内核交互,请求系统立即作出适当的响应。例如,可以使用SysRq组合键立即关机或重新启动系统、同步安装的所有文件系统,以及把重要的系统内核信息转储到系统控制台等。若想使用SysRq组合键,可以按下Alt-SysRq-<system request code>组合键,其中的<system request code>定义如下:

· r —— 禁止键盘的原始方式输入,把键盘设置成一个有限的小键盘方式,其中不支持Alt、Ctrl或Shift等键。

· k —— 终止虚拟控制台中的所有活动进程。

· b —— 立即重新引导系统,之前既不卸载也不同步文件系统。

· c —— 令系统立即处于瘫痪状态,之前既不卸载也不同步文件系统。

· o —— 关机。

· s —— 尝试同步已安装的文件系统。

· u —— 尝试卸载并以只读方式重新安装所有的文件系统。

· p —— 在控制台上输出所有的标志和寄存器内容。

· t —— 在控制台上输出进程列表。

· m —— 在控制台上显示内存统计信息。

· 0~9 —— 设置在控制台上输出的日志级别。

· e —— 利用SIGTERM信号,终止除init之外的所有进程。

· i —— 利用SIGKILL信号,终止除init之外的所有进程。

· l —— 利用SIGKILL信号,终止所有的进程,包括init进程)。在按下这个系统请求键之后,系统将处于不可用状态。

· h —— 显示SysRq组合键使用方法的求助信息。

在开发或调试系统内核,或系统处于非正常运行状态时,上述组合键是非常有用的。但请注意,启用系统请求键提供一个系统访问机会,因而是有安全风险的。因此,默认情况下系统请求键是禁用的,示例如下:

        # cat /proc/sys/kernel/sysrq
        0
        #

5.4.3 sysctl命令

在查询、修改系统可调参数时,除了能够使用前述的cat和echo命令之外,比较正规的方法是采用sysctl命令和sysctl.conf配置文件替代echo命令,修改/proc/sys目录中的任何文件,设置相应的系统参数。例如,可以使用下列sysctl命令:

        # sysctl -w kernel.hostname=iscas
        kernel.hostname = iscas
        #

代替下列echo命令,设置系统的主机名:

        # echo iscas > /proc/sys/kernel/hostname
        #

sysctl命令可用于查询、动态地设置所有的系统内核参数,可以在系统运行期间观察、修改位于/proc/sys目录中的任何文件。sysctl命令的语法格式如下:

        sysctl [-n] [-e] variable
        sysctl [-n] [-e] [-q] -w variable=value
        sysctl [-n] [-e] [-q] -p file
        sysctl [-n] [-e] [-a | -A]

其中,“-n”选项表示仅输出系统可调参数的值;“-N”选项表示仅输出系统可调参数的参数名;“-e”选项表示忽略参数名字等出错信息;“-q”选项表示安静方式,禁止输出设置的系统可调参数值;“-a”选项表示输出系统内核的所有参数值;“-A”选项表示以表格形式输出系统内核的所有参数值。

variable是表示系统可调参数的变量,由/proc/sys子目录直至文件的完整路径组成,但需要把路径中的斜杠“/”换成句点“.”(实际上不替换也可以)。例如,为了查询当前的最大共享内存设置,可以使用下列命令:

        $ sysctl kernel.shmmax
        kernel.shmmax = 33554432
        $

为了查询当前的TCP/IP设置是否支持路由功能,可以使用下列命令:

        $ sysctl net.ipv4.ip_forward
        net.ipv4.ip_forward = 0
        $

“-w variable=value”选项用于修改系统内核参数。其中,variable是系统内核参数的关键字,value是准备设置的值。如果value中包含引号或易被Shell解析的元字符,则需要使用双引号。注意,等号“=”前后不能有空格。例如,为了设置系统内核参数kernel.hostname,修改系统的节点名,可以采用下列命令:

        # sysctl -w kernel.hostname=iscas
        kernel.hostname = iscas
        #

如果想要了解系统提供哪些变量,能够用于设置系统内核的可调参数,可以访问/proc/sys目录,也可以使用“sysctl -a”或“sysctl -A”命令。例如:

        $ sysctl –a | grep kernel
        ……
        kernel.hostname = iscas
        kernel.domainname = (none)
        kernel.shmmax = 33554432
        kernel.shmall = 2097152
        kernel.shmmni = 4096
        kernel.msgmax = 8192
        kernel.msgmni = 1722
        kernel.msgmnb = 16384
        ……
        $

上面介绍的任何方法都是一种临时性的设置,仅对当前正在运行的系统有效,一旦关机后重新启动系统,系统将会恢复默认的设置,故仅能用于测试的目的。为了一劳永逸地设定系统的可调参数,可以利用sysctl命令的“-p file”选项,借助/etc/sysctl.conf文件实现。“-p file”选项表示从指定的文件(默认的文件为/etc/sysctl.conf)中读入并设置其中列出的所有系统参数。

每次引导系统时,init进程都会运行/etc/rc.d/rc.sysinit脚本,其中间接执行sysctl命令,并以/etc/sysctl.conf文件作为参数,设置系统的可调参数。下面是取自/etc/rc.d/rc.sysinit脚本文件的代码片段:

        $ cat /etc/rc.d/rc.sysinit
        ……
        # Configure kernel parameters
        update_boot_stage RCkernelparam
        sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
        ……
        $

因此,/etc/sysctl.conf文件中的任何参数设置都会在系统的启动过程中开始生效。如果需要改变系统内核参数的默认设置,如增加系统的共享内存,或使系统支持路由功能等,可以把有关的参数设置加到/etc/sysctl.conf文件中,从而在系统的启动过程中设定系统内核的可调参数。下面是系统提供的/etc/sysctl.conf文件的部分内容:

        $ cat /etc/sysctl.conf
        ……
        # Controls IP packet forwarding
        net.ipv4.ip_forward = 0
        # Controls source route verification
        net.ipv4.conf.default.rp_filter = 1
        # Do not accept source routing
        net.ipv4.conf.default.accept_source_route = 0
        # Controls the System Request debugging functionality of the kernel
        kernel.sysrq = 0
        # Controls whether core dumps will append the PID to the core filename.
        # Useful for debugging multi-threaded applications.
        kernel.core_uses_pid = 1
        ……
        $