lsmod,modprobe和sysctl的说明

lsmod

我们经常听到linux内核,非常的高大上,内核中包含很多模块组件,构成了整个完整的内核。

如何查看linux装载的内核?很简单,用 lsmod 命令,然后会显示一大堆内核中内含的模块,我们想要看某一个模块有没有,可以用如下的命令,举例:

lsmod | grep ip_tables
ip_tables              27126  2 iptable_filter,iptable_nat

出来3列,这3列的名称我们先用一个例子举出来,然后再来解释:

lsmod | egrep 'Module|ip_tables'
Module                  Size  Used by
ip_tables              27126  2 iptable_filter,iptable_nat

Module: 模块名称
Size: 模块的大小
Used by:第1个数字表示这个模块被其他的几个模块所使用(其实表示了依赖关系),后面的是依赖这个模块的其他模块

modprobe

用来加载和移除模块的命令,比如:

modprobe br_netfilter  #加载
modprobe -r br_netfilter  #移除

sysctl

上面说了加载模块,现在来了问题了,每个模块都有参数需要设定的,那么如何修改这些参数,这些参数又是存储在哪里的,这个就是 sysctl 的作用了。

sysctl 说简单点就是用来修改内核模块参数的,嗯,非常好理解。可以看这篇介绍sysctl的文章:sysctl介绍,基本上该有的都有了,下面是对这篇文章的一些小补充:

  1. 内核模块的参数存储在 /proc/sys 这个目录下面,比如我们修改:
    sysctl -w net.ipv4.ip_forward=1
    那么实际上是 net.ipv4.ip_forward 按照 . 这个句号进行切分,前面的是目录,最后一个是文件,所以这个参数的位置在
    /proc/sys/net/ipv4/ip_forward这个文件中,一个参数一个文件,每个文件就是含有这个参数的值,所以,我们可以直接用下面的命令也是和sysctl一样的作用:
    echo 1 > /proc/sys/net/ipv4/ip_forward
  2. 按照上文中说,sysctl -w net.ipv4.ip_forward=1 中的 -w 是临时的意思,其实不是,w的意思是写到 /proc/sys/net/ipv4/ip_forward 这个文件中。
  3. 当系统重启,或者服务重启后,这个文件中的配置将丢失,为了使得重启后还是生效的,上文中说写在 /etc/sysctl.conf 这个文件中,其实按照标准的做法,应该是在 /etc/sysctl.d/这个目录中增加一个文件,文件名随便,然后将 net.ipv4.ip_forward=1 写在这个文件中。这种模式就好比 nginx 的配置文件一样,也不知道是 nginx 学习 linux 的呢,还是 linux 学习 nginx。这种配置非常合理,大家不用挤在 sysctl.conf 这一个文件中来修改。