Linux学习-73-内核模块管理(查看、添加和删除)

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 Linux学习-73-内核模块管理(查看、添加和删除),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

16.16 内核模块管理(查看、添加和删除)

  • Linux 的内核会在启动过程中自动检验和加载硬件与文件系统的驱动。一般这些驱动都是用模块的形式加载的,使用模块的形式保存驱动,可以不直接把驱动放入内核,有利于控制内核大小。

  • 模块的全称是动态可加载内核模块,它是具有独立功能的程序,可以被单独编译,但不能独立运行。模块是为内核或其他模块提供功能的代码集合。这些模块可以是 Linux 源码中自带的,也可以是由硬件厂商开发的(可以想象成驱动)。不过内核因为发布时间较长,所以自带的模块可能版本较低,还有一些新硬件可能就不自带模块了,只能由硬件厂商在发布硬件的同时发布新模块。

  • 也就是说,安装模块一般有两种方法:

    • 第一种方法在编译内核时,手工调整内核模块功能,加入所需的模块。这种方法有一个问题,就是内核必须支持这个硬件或功能才可以通过编译内核加入模块。如果硬件比内核新,内核本身并不支持硬件,就不能通过重新编译内核来加入新的硬件的支持。
    • 第二种方法就是下载厂商发布的新硬件的驱动模块,或下载驱动程序,再编译成驱动模块,然后手工安装。
  • 如果是新硬件的驱动,则可以到硬件官方网站下载内核驱动或内核模块。如果下载的是内核模块,则直接安装即可;如果下载的是内核驱动源码,则只需要编译源码包,就会生成模块(具体编译过程和源码包安装非常类似,可以查看驱动的说明)。如果需要加入的模块不是硬件的驱动,而只是内核中的某项功能,那么,只要部分重新编译内核,就可以生成新功能的模块(我们会通过 NTFS 文件系统支持来学习这种方法),然后安装这个模块即可。

16.16.1 内核模块保存位置与模块保存文件
  • 内核模块保存在 /lib/modules/ 内核版本 /kernel/ 目录中,在 CentOS 7.x 中这个目录就是:
[root@CncLucZK ~]# ll /lib/modules/4.18.0-80.el8.x86_64/kernel
total 40
drwxr-xr-x.  3 root root 4096 Nov 26  2019 arch				#与硬件相关的模块
drwxr-xr-x.  3 root root 4096 Nov 26  2019 crypto			#内核支持的加密技术的相关模块
drwxr-xr-x. 65 root root 4096 Nov 26  2019 drivers			#硬件的驱动程序模块,如显卡、网卡等
drwxr-xr-x. 24 root root 4096 Nov 26  2019 fs				#文件系统模块,如 fat、vfat、nfs等
drwxr-xr-x.  3 root root 4096 Nov 26  2019 kernel
drwxr-xr-x.  4 root root 4096 Nov 26  2019 lib				#函数库
drwxr-xr-x.  2 root root 4096 Nov 26  2019 mm
drwxr-xr-x. 36 root root 4096 Nov 26  2019 net				#网络协议相关模块
drwxr-xr-x. 12 root root 4096 Nov 26  2019 sound			#音效相关模块
drwxr-xr-x.  3 root root 4096 Nov 26  2019 virt

  • Linux 中所有的模块都存放在 /lib/modules/4.18.0-80.el8.x86_64/modules.dep文件中,在安装模块时,依赖这个文件査找所有的模块,所以不需要指定模块所在位置的绝对路径,而且也依靠这个文件来解决模块的依赖性。如果这个文件丢失了怎么办?不用担心,使用 depmod 命令会自动扫描系统中已有的模块,并生成 modules.dep 文件。命令格式如下:
[root@localhost ~]# depmod [选项]
#不加选项,depmod命令会扫描系统中的内核模块,并写入modules.dep文件
  • 选项:

    • -a:扫描所有模块;
    • -A:扫描新模块,只有有新模块时,才会更新modules.dep文件;
    • -n:把扫描结果不写入modules.dep文件,而是输出到屏幕上;
  • 我们把 modules.dep 文件删除,看看使用 depmod 命令是否可以重新生成这个文件。命令如下:

[root@CncLucZK ~]# cd /lib/modules/4.18.0-80.el8.x86_64/
#进入模块目录
[root@CncLucZK 4.18.0-80.el8.x86_64]# rm -rf modules.dep
#删除 modules.dep文件
[raot@CncLucZK 4.18.0-80.el8.x86_64]# depmod
#重新扫描模块
[root@CncLucZK 4.18.0-80.el8.x86_64]# ls -l modules.dep
-rw-r--r--. 1 root root 191899 10 月 23 10:09 modules.dep
#再查看一下,modules.dep文件又生成了
  • depmod 命令会扫描系统中所有的内核模块,然后把扫描结果放入 modules.dep 文件。后续的模块安装或删除就依赖这个文件中的内容。也就是说,如果我们要手工安装一个模块,则需要先把模块复制到指定位置,一般复制至 /lib/modules/4.18.0-80.el8.x86_64/kernel/ 目录中,使用 depmod 命令扫描之后,才能继续安装。
16.16.2 内核模块的查看
  • 使用 lsmod 命令可以查看系统中到底安装了哪些内核模块。命令如下:
[root@CncLucZK ~]# lsmod
Module                  Size  Used by
binfmt_misc            20480  1
tcp_diag               16384  0
inet_diag              20480  1 tcp_diag
nft_fib_inet           16384  1
nft_fib_ipv4           16384  1 nft_fib_inet
nft_fib_ipv6           16384  1 nft_fib_inet
nft_fib                16384  3 nft_fib_ipv6,nft_fib_ipv4,nft_fib_inet
nft_reject_inet        16384  4
nf_reject_ipv4         16384  1 nft_reject_inet
nf_reject_ipv6         16384  1 nft_reject_inet
nft_reject             16384  1 nft_reject_inet
nft_ct                 20480  18
nf_tables_set          32768  21
...
  • lsmod命令的指定结果共有三列。

    • Module:模块名。
    • Size:模块大小。
    • Used by:模块是否被其他模块调用。
  • 我们还可以使用 modinfo 命令来查看这些模块的说明,命令格式如下:

[root@localhost ~]# modinfo 模块名
[root@CncLucZK ~]# modinfo cdrom
filename:       /lib/modules/4.18.0-80.el8.x86_64/kernel/drivers/cdrom/cdrom.ko.xz
license:        GPL
rhelversion:    8.0
srcversion:     E5A2049F635B552113240F5
depends:        
intree:         Y
name:           cdrom
vermagic:       4.18.0-80.el8.x86_64 SMP mod_unload modversions 
...
parm:           mrw_format_restart:bool
#能够看到模块名,来源和简易说明
16.16.3 内核模块的添加与删除
  • 如果模块已经下载到本机了,那么安装模块的方法非常简单。首先需要把模块复制到指定位置,一般复制到 /lib/modules/4.18.0-80.el8.x86_64/kemel/ 目录中,模块的扩展名一般是 *.ko;然后需要执行 depmod 命令扫描这些新模块,并写入 modules.dep 文件;最后就可以利用 modprobe 命令安装这些模块了。命令格式如下:
[root@localhost ~]# modprobe [选项] 模块名
  • 选项:

    • -I:列出所有模块的文件名,依赖 modules.dep 文件;
    • -f:强制加载模块;
    • -r:删除模块;
  • 若需要安装 vfat 模块(fat32 文件系统的模块),那么需要执行如下命令即可:

[root@CncLucZK ~]# modprobe vfat
#安装vfat模块
[root@CncLucZK ~]# lsmod | grep vfat
vfat 8575 0
fat 47049 1 vfat
  • vfat 模块是系统中的默认模块,所以不需要执行 depmod 命令进行扫描。如果是外来模块,则必须执行 depmod 命令。因为已经把模块的完整文件名写入了 modules.dep 文件,所以安装模块的命令不需要写绝对路径。

  • 删除这个模块:

[root@CncLucZK ~]# modprobe -r vfat
[root@CncLucZK ~]# lsmod | grep vfat
#查找为空

参考文献:
Linux内核模块管理(查看、添加和删除)

下一篇:Linux学习-74-NTFS文件系统安装教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123718.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!