Linux入门之CentOS7内核编译三部曲

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux入门之CentOS7内核编译三部曲相关的知识,希望对你有一定的参考价值。

Linux入门之CentOS7内核编译三部曲(2)

linux系统中,编译完了内核,得到了所需的功能,并不能表示就已经能完美完成我们的所需。因为内核只是做一个核心的硬件及核心代码的支持,而注意的模块支持任然是对应版本的内核模块文件。这些文件决定着平时能否使用哪些功能。这次不会介绍如果添加给上次编译的新内核模块功能,主要介绍模块的功能和作用以及其加载和卸载。

 

查看当前系统以及加载的内核模块命令:lsmod  modinfo

lsmod 命令

lsmod - program to show the status of modules in the Linux Kernel

命令格式:

lsmod #无需选项直接使用会列出的当前系统加载的所有模块

注意:此命令显示的结果从/proc/modules文件读取

使用例子:

[[email protected] ~]# lsmod | head

技术分享 

解析:模块之间也有相应的依赖性,这里libfcoe模块所依赖bnx2tc,tcoe两个模块。

 

modinfo 命令

modinfo - program to show information about a Linux Kernel module

显示一个指令内核模块的具体信息

命令格式:

modinfo [-k kernel] [modulename|filename.....]

  -n:只显示模块文件具体路径

          -p:显示模块参数

  -a:显示author

  -d:显示所在目录

  -l:显示license许可证

  -F,--field Field:根据对应自动来显示

使用例子:

#使用lsmod并过滤出ext4驱动模块

[[email protected] kernel]# lsmod | grep ext4
ext4                  379655  3 
jbd2                   93252  1 ext4
mbcache                 8193  1 ext4

#直接显示ext4具体信息,使用modinfo命令

[[email protected]localhost ~]# modinfo ext4

技术分享 

说明:默认不指定选项会显示此模块的详细信息,完整的路径以及所依赖的其它模块。

#显示ext4模块的详细路径

[[email protected] ~]# modinfo -F filename ext4
/lib/modules/3.10.89/kernel/fs/ext4/ext4.ko
[[email protected] ~]# modinfo -n ext4
/lib/modules/3.10.89/kernel/fs/ext4/ext4.ko


 

模块的加载卸载管理:modprobe   depmod

modprobe 命令

modprobe - Add and remove modules from the Linux Kernel

在当前系统内核添加或移除模块

选项用法:

modprobe  [options]  modulename  #默认不指定为按指定模块名加载此模块

  -n : 显示指定模块

  -q : 静默模式

  -c  :显示所有模块中对应的选项、名称、别名

modprobe  -C config-file [option]#重新配置/etc/modprobe.conf/etc/modprobe.d/*.conf文件

-k  kernel:指定内核版本

使用例子:

#使用lsmod并过滤出vfat格式模块

[[email protected] ~]# lsmod | grep ‘vfat‘
vfat                   17461  0 
fat                    65913  2 vfat,msdos

#卸载此模块

[[email protected] ~]# modprobe -r vfat

#再次查看fat模块相关的

[[email protected] ~]# lsmod | grep fat
fat                    65913  1 msdos

说明:这里只显示了最基本的msdos系统的fat模块,说明支持linux的vfat已经被移除。

#装载刚才卸载的vfat模块

[[email protected] ~]# modprobe vfat

#再次显示fat相关模块

[[email protected] ~]# lsmod | grep fat
vfat                   17461  0 
fat                    65913  2 vfat,msdos

解析:这里加载的都是当前内核模块目录中有的模块,并且为/etc/modprobe.d目录下有的对应关系的模块条目。下面来验证:

#显示诉讼有black相关列表,之取前5个

(1)使用modprobe -c 直接显示所有条目名称进行过滤

[[email protected] kernel]# modprobe -c | grep ‘^black‘ | head -n 5
blacklist i8xx_tco
blacklist aty128fb
blacklist atyfb
blacklist radeonfb
blacklist i810fb

(2)直接查看/etc/modprobe.d/blacklist.conf文件中内容

[[email protected] kernel]# grep ‘^black‘ /etc/modprobe.d/blacklist.conf | head -n 5
blacklist i8xx_tco
blacklist aty128fb
blacklist atyfb
blacklist radeonfb
blacklist i810fb

解析:这里验证了上述说明的modprobe命令就是根据/etc/modprobe.d/中的模块名称对应。下面通过行数统计来证明是否一致:

#统计/etc/modprobe.d/blacklist.conf文件中的black模块名称

[[email protected] kernel]# grep ‘^black‘ /etc/modprobe.d/blacklist.conf | wc -l
24

#同样使用modprobe -c 来过滤出black的相关模块名称

[[email protected] kernel]# modprobe -c | grep ‘^black‘ | wc -l
24

解析:这里显示一样,就说明此命令时依赖于/etc/modprobe.d/目录下的各类模块名称配置。所以说一定不要随意更改这里的模块,触发手动需要添加新模块当当前内核。

 

 

depmod 命令

depmod - program to generate modules.dep and map files.

 内核模块依赖关系文件及系统信息映射文件的生成工具

选项说明:

depmod   /path/to/moddule.ko   #查看指定路径的模块文件的依赖关系

depmod  [option]

-a  : 列出所有数据库中的模块映射输出到modules.dep文件中

-n :只列出当前已经加载的模块输出到modules.dep文件中,如果modules.dep有此条目不处理,没有就添加,相当于修改并追加内容

-e :输出信息但是不输出到文件

使用例子:

#切换到当前内核模块的存放目录

[[email protected] ~]# cd /lib/modules/$(uname -r)
[[email protected] 2.6.32-642.el6.x86_64]# pwd -P
/lib/modules/2.6.32-642.el6.x86_64

#给前依赖关系文件改名

[[email protected] 2.6.32-642.el6.x86_64]# mv modules.dep modules.dep.bak

#重新根据当前内核模块来生成依赖关系文件

[[email protected] 2.6.32-642.el6.x86_64]# depmod -a

#查看是否已经生成modprobe.dep文件

[[email protected] 2.6.32-642.el6.x86_64]# ls -l modules.dep
-rw-r--r--. 1 root root 211745 Aug 17 03:17 modules.dep

#找出ip_table相关的模块依赖关系

[[email protected] ~]# grep --color ‘\<ip_tables*‘ /lib/modules/$(uname -r)/modules.dep

技术分享

#直将指定路径的模块的相应的路径及依赖模块关系写入modules.dep 文件

[[email protected] ~]# depmod `modinfo -n e1000`
[[email protected] ~]# cat /lib/modules/$(uname -r)/modules.dep
kernel/drivers/net/e1000/e1000.ko:

 

 

猜测案例:

上面介绍了一些基本的使用方法,并没有进入到本门的主体,下面通过几个实例来介绍模块以及模块相关在实例的基本用途,下面的例子只是我的猜想:

 

模块加载案例1:  防火墙核心及过滤功能模块

1、没有filter过滤功能的防火墙怎么办?

#查看当前iptables是否被加载

[[email protected] ~]# lsmod | grep ‘\<ip_\?\<tables\?\>‘

解析:没有显示任何信息,说明没有加载此模块。

#手动加载iptables模块ip_tables,记住,必须是iptables服务未启用才行。

[[email protected] ~]# modprobe ip_tables

#查看当前iptables服务,服务虽然启动,但是其FireWall过滤功能没有运行

[[email protected] ~]# service iptables status
iptables: Firewall is not running.

解析:这里说明iptables的FireWall配置没有生效,且没有firewall拦截功能,和使用了iptables -F命令清空了当前访问强规则一样。

#查看当前规则列表

[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

说明:没有任何条目显示,这说明FireWall功能并没有开启,要想开启就要加载对应模块。

#查看有关fileter过滤的模块,使用lsmod只会查看当前已经加载的对应,而这时就需要查看对应的依赖关系。一些两种方法来查看filter对应模块:

(1)如果是使用depmod -a命令完全生成的modules.dep文件,则直接通过过滤查看。

[[email protected] ~]# grep ‘iptable_filter‘ /lib/modules/$(uname -r)/modules.dep
kernel/net/ipv4/netfilter/iptable_filter.ko: kernel/net/ipv4/netfilter/ip_tables.ko

(2)使用modinfo -F 指定depends(此字段所依赖的模块)字段显示

[[email protected] ~]# modinfo -F depends iptable_filter
ip_tables


解析:这里只发现了iptable_filter依赖于ip_tables模块,而没有依赖其它模块,所有直接加载此模块即可。

#手动加载iptable_filter模块

[[email protected] ~]# modprobe iptable_filter

#使用lsmod查看当前加载的模块列表是否有刚才加载的模块

[[email protected] ~]# lsmod | grep ‘\<ip_\?tables\?‘
iptable_filter          2793  0 
ip_tables              17831  1 iptable_filter

#因为服务已经为开启状态,所有虽然有了过滤功能,但是并没有重新加载规则配置

 技术分享

#下面重启 iptables服务

[[email protected] ~]# service iptables restart

技术分享

解析:注意这里的启动,会先选择规则为filter模块功能,然后根据firewall模块功能来设置对应的规则配置文件,最后应用规则文件为设置,下面查看当前规则列表是否已经生效。

[[email protected] ~]# service iptables status

技术分享 

解析:当iptables的默认filter规则配置以及生效,那么就说明filter模块功能以及启用。

 

2、关闭或启动iptables服务,来测试模块自动加载和卸载

注意:在关闭之前,如果此模块正在被进程使用,那么是不能直接进行卸载的,例如:

#使用modprobe直接卸载,这里却报了错误,显示此模块正则被使用中

[[email protected] ~]# modprobe -r iptable_filter
FATAL: Module iptable_filter is in use.

#那么就直接关闭iptables服务

[[email protected] ~]# service iptables stop

技术分享 

解析:最后这里显示了不仅服务被关闭成功,及显示右边绿色的[ ok ],同时也显示了一个提示:Unloading modules,这表示对应的filter模块被自动卸载。

#验证iptable _filter是否被卸载

[[email protected] ~]# lsmod | grep ‘\<ip_\?tables\?‘

解析:发现当前加载中模块列表已经没有了ip_tables.ko和iptable_filter模块,这说明iptables的主要功能为ip_tables模块,而过滤模功能为iptable_filter模块,所以说服务及进程停掉后,那么所需的模块如果没有其它进程去使用,则会被自动关闭及自动卸载所需模块。当然这需要编译内核时选择“动态加载或卸载模块”此项支持。

#最后再次启动iptables服务

[[email protected] ~]# service iptables start

技术分享 

#查看是否会自动加载所需要的模块

[[email protected] ~]# lsmod | grep ‘\<ip_\?tables\?‘
iptable_filter          2793  1 
ip_tables              17831  1 iptable_filter

解析:能匹配到当前加载的iptables所需的核心和过滤模块,说明已经正常了。

 

3、额外补充:根据分析iptables脚步来查看对应判断

#使用一中全屏编辑器来查看/etc/rc.d/init.d/iptables脚步,这里使用vim

[[email protected] ~]# vim /etc/rc.d/init.d/iptables

技术分享 

解析:这里是截取iptables的启动函数中的代码块,上面的$IPTABLS_MODULES为读取到的与iptables服务相关的所有核心及功能模块列表,然后进行在启动此函数也就是启动服务时会循环变量所有所需模块并进行加载,并以没有任何模块失败(失败次数为0)来判断此服务是否成功启动。

 

总结:为什么会想到防火墙模块,因为在某些情况下,iptables服务可能无法启动或者功能不全,这时就需要去加载模块,一般作为一个服务会依赖于一些模块的功能,而内部的服务脚步也就是不断的去调用所需要的内核模块功能来进让此服务功能生效。

 

 

模块加载案例2:网络服务及网卡驱动模块

#使用dmesg命令查看当前所有硬件对应的驱动模块并过滤出网卡模块

[[email protected] ~]# dmesg | grep eth0

技术分享 

解析:这里显示除了eth0所使用的网卡驱动为e1000,并列出了此设备的详细信息。

#查看当前模块是否已经加载

[[email protected] ~]# lsmod | grep ‘\<e1000\>‘
e1000                 134863  0

说明:这里显示说明 e1000网卡驱动已经被加载,右边显示0说明此模块没有依赖于任何其它模块。

#测试当前网络服务并查看其中一个活动的网卡接口

[[email protected] ~]# service network status
[[email protected] ~]# ip addr show eth0

技术分享 

说明:这里显示了活动的设备有eth0网卡和lo本地回环接口,查看的eth0的状态为UP并且已经获取了对应的IP地址及相关信息。

#直接卸载e1000模块的后果

[[email protected] ~]# modprobe -r e1000

技术分享 

#再次查看e1000模块是否被成功卸载

lsmod | grep ‘\<e1000\>’

 技术分享

#查看对应的网络服务是否有影响

server network status

技术分享 

解析:network网络服务并没有因此而停止运行,因为e1000只是对eth0网卡的驱。那么没有了e1000驱动,硬件都没法正常识别了。为了验证,下面再次测试能否获取eth0状态。

#检测使用ip命令来能否查看eth0网卡状态信息

ip addr show eth0

技术分享 

解析:服务本身依赖的都是一些级别的网络功能,而网卡驱动虽然不能影响网络服务的整体,但是对于硬件接口而言,驱动模块则是必须的。这里驱动不到网卡设备,那么即使有其对应的配置文件已经网卡命令规则文件也是无意义的。

#重新加载e1000模块

moprobe e1000

技术分享 

解析:在加载后出现了一些信息,是不是很熟悉,对啊,这就是开始使用dmesg命令查看对应的eth0驱动的信息,同样在加载驱动中显示了找到了对应的eth0网卡,并自动会驱动此硬件。下面使用ip命令来继续查看。

#检测查看ip命令是否能查询到驱动到的 eth0网卡

ip addr show eth0

技术分享 

解析:这里能查询出正常的信息说明已经回归到了正常的网络状态,所有说网卡设备或网络服务中出现问题不一定就是一些配置的错误,可能就是所需要的功能模块或者是对应硬件的驱动模块没有正常加载而导致的。

 

案例总结:

这里发现不同的服务对应相应的所需功能模块是不一样的,在一个服务产生的进程使用了其所需要的模块,那么只要不是则服务模块的核心模块或者其依赖的模块,是无法正常直接卸载掉的。但是有些服务会有很多功能,每个功能对应的所需模块可能各不一样,可能还不是互相依赖的关系,那么这时如果没有成功加载某一个模块的化,只是对其某一个功能

有影响,但在排错时,一般会重启整个服务,或者是直接重开启整个进程组,发现还是不能使用某些功能,如果想用的脚步及配置文件没有问题,那么及有可能就是此功能所需要的目录没有进程正常的加载或则驱动。


本文出自 “孟天霸-IT的垃圾回收站” 博客,请务必保留此出处http://mengzhaofu.blog.51cto.com/10085198/1854127

以上是关于Linux入门之CentOS7内核编译三部曲的主要内容,如果未能解决你的问题,请参考以下文章

Linux入门之CentOS7内核编译三部曲

linux 内核编译

编译安装lamp三部曲之mysql-技术流ken

基于mykernel的一个简单的时间片轮转多道程序内核代码分析

linux内核同步问题

Linux内核分析:完成一个简单的时间片轮转多道程序内核代码