翻译状态:本文是 Kernel_modules 的翻译。上次翻译日期:2018-05-09。如果英文版本有所更改,则您可以帮助同步翻译。

内核模块是可以按需加载或卸载的内核代码,可以不重启系统就扩充内核的功能。

要创建内核模块,请阅读此指南。模块可以设置成内置或者动态加载,要编译成可动态加载,需要在内核配置时将模块配置为 M (模块)。

获取信息

模块保存在 /lib/modules/kernel_release (使用 uname -r 命令显示当前内核版本)。

注意: 模块名通常使用 (_) 或 - 连接,但是这些符号在 modprobe 命令和 /etc/modprobe.d/ 配置文件中都是可以相互替换的。

显示当前装入的内核模块:

$ lsmod

显示模块信息:

$ modinfo module_name

显示所有模块的配置信息:

$ modprobe -c | less

显示某个模块的配置信息:

$ modprobe -c | grep module_name

显示一个装入模块使用的选项:

$ systool -v -m module_name

显示模块的依赖关系:

$ modprobe --show-depends module_name

使用systemd自动加载模块

目前,所有必要模块的加载均由 udev 自动完成。所以,如果不需要使用任何额外的模块,就没有必要在任何配置文件中添加启动时加载的模块。但是,有些情况下可能需要在系统启动时加载某个额外的模块,或者将某个模块列入黑名单以便使系统正常运行。

内核模块可以在/etc/modules-load.d/ 下的文件中明确列出,以便systemd在引导过程中加载它们。 每个配置文件都以 /etc/modules-load.d/.conf的样式命名。 配置文件仅包含要加载的内核模块名称列表,以换行符分隔。 空行和第一个非空白字符为#或;的行被忽略。

/etc/modules-load.d/virtio-net.conf

# Load virtio_net.ko at boot

virtio_net

手动加载卸载

控制内核模块载入/移除的命令是

# modprobe module_name

按文件名加载模块:

# insmod filename [args]

Note: 如果升级了内核但是没有重启,路径 /usr/lib/modules/$(uname -r)/ 已经不存在。modprobe 会返回错误 1,没有额外的错误信息。如果出现 modprobe 加载失败,请检查模块路径以确认是否是这个问题导致。

如果要移除一个模块:

# modprobe -r module_name

或者:

# rmmod module_name

配置模块参数

手动加载时设置

传递参数的基本方式是使用 modprobe 选项,格式是 key=value:

# modprobe module_name parameter_name=parameter_value

使用 /etc/modprobe.d/中的文件

要通过配置文件传递参数,在 /etc/modprobe.d/ 中放入任意名称 .conf 文件,加入:

/etc/modprobe.d/myfilename.conf

options modname parametername=parametercontents

例如

/etc/modprobe.d/thinkfan.conf

# On thinkpads, this lets the thinkfan daemon control fan speed

options thinkpad_acpi fan_control=1

注意: 如果要在启动时就修改内核参数(从 init ramdisk 开始),需要将相应的.conf-文件加入 mkinitcpio.conf 的 FILES 参数中。

使用内核命令行

如果模块直接编译进内核,也可以通过启动管理器(GRUB, LILO 或 Syslinux)的内核行加入参数:

modname.parametername=parametercontents

例如:

thinkpad_acpi.fan_control=1

别名

/etc/modprobe.d/myalias.conf

# Lets you use 'mymod' in MODULES, instead of 'really_long_module_name'

alias mymod really_long_module_name

有些模块具有别名,以方便其它程序自动装入模块。禁用这些别名可以阻止自动装入,但是仍然可以手动装入。

/etc/modprobe.d/modprobe.conf

# Prevent autoload of bluetooth

alias net-pf-31 off

# Prevent autoload of ipv6

alias net-pf-10 off

黑名单

禁用内核模块

对内核模块来说,黑名单是指禁止某个模块装入的机制。当对应的硬件不存在或者装入某个模块会导致问题时很有用。

有些模块作为 initramfs 的一部分装入。

mkinitcpio -M 会显示所有自动检测到到模块:要阻止 initramfs 装入某些模块,可以在 /etc/modprobe.d中将它们加入黑名单。并应在映像生成过程中通过modconf挂钩将其添加。

运行 mkinitcpio -v 会显示各种钩子(例如 filesystem 钩子, SCSI 钩子等)装入的模块。如果您的HOOKS 数组中没有 modconf 钩子(例如,和默认配置不同)则请将该".conf"文件添加到/etc/mkinitcpio.conf中的FILES数组中。一旦您将其列入黑名单,请重新生成 initramfs,然后重新启动。

使用 /etc/modprobe.d/ 中的文件

在 /etc/modprobe.d/ 中创建 .conf 文件,使用 blacklist 关键字屏蔽不需要的模块,例如如果不想装入 pcspkr 模块:

/etc/modprobe.d/nobeep.conf

# Do not load the pcspkr module on boot

blacklist pcspkr

注意: blacklist 命令将屏蔽一个模板,所以不会自动装入,但是如果其它非屏蔽模块需要这个模块,系统依然会装入它。

要避免这个行为,可以让 modprobe 使用自定义的 install 命令,而不是像往常一样将模块插入内核,因此您可以通过以下方式强制模块始终无法加载:

/etc/modprobe.d/blacklist.conf

...

install MODULE /bin/true

...

这样就可以 "屏蔽" 模块及所有依赖它的模块。

使用内核命令行

提示: 如果模块损坏导致无法引导系统,这将非常有用。

您也可以从引导加载程序中将模块列入黑名单。

如Kernel参数.中所述,只需将module_blacklist=modname1,modname2,modname3 添加到引导加载程序的内核行中即可。

注意: 将多个模块列入黑名单时,请注意,它们之间仅用逗号分隔。 空格或其他内容可能会破坏语法。

问题处理

模块未加载

如果出现模块在启动时未加载,而且启动日志中(journalctl -b) 显示模块被屏蔽,但是 /etc/modprobe.d/ 中未找到屏蔽设置,请检查 /usr/lib/modprobe.d/ 目录。

"vermagic" 字符串与内核不一致的模块不会被加载,如果确认模块与当前内核兼容,可以用 modprobe --force-vermagic 参数加载,跳过检查。

警告: 忽略模块检查,可能因为不兼容导致系统崩溃或不可预知行为,请谨慎使用 --force-vermagic。

参见

linux内核arch模块,Kernel module (简体中文)相关推荐

  1. Linux内核参数(如kernel.shmmax)及Oracle相关参数调整(如SGA_MAX_SIZE)

    Linux内核参数(如kernel.shmmax)及Oracle相关参数调整(如SGA_MAX_SIZE) 我们一般在Linux 上安装 设置Oracle 数据库 或者在更换或升级硬件的时候都需要配置 ...

  2. Linux内核LED模块分析(二)

    Linux内核LED模块分析(二) 上次分析到那里后,还是有些同志说看不懂,那我就继续分析一把我认为不需要继续分析的东西吧.上回分析了 led_cdev和trigger的关系后就没有继续说了.有同志还 ...

  3. Linux 内核安全模块学习总结

    Linux安全模块(LSM) LSM是Linux Secrity Module的简称,即linux安全模块.其是一种轻量级通用访 问控制框架,适合于多种访问控制模型在它上面以内核可加载模块的形实现.用 ...

  4. linux内核及其模块的查询,加载,卸载 lsusb等

    http://blog.sina.com.cn/s/blog_53e81e2a0100zkxi.html 1,/sbin/update-modules文件,他是一个linux通用的模块管理脚本程序. ...

  5. linux内核添加模块,linux中添加内核模块

    1.  内核模块简介 Linux 内核的 整 体结构 非 常 庞 大 ,其 包 含 的 组 件也 非 常多 , 如 何使用 需 要 的 组 件 呢? 方 法 一 : 把 所有的 组 件都 编译 进 内 ...

  6. Linux 内核文件系统模块结构体关系图

    导言 很久没有更新csdn博客了,工作两年,学习了不少新东西,很多都没有来的及整理,用过不久很快就忘记了,写到博客中做个记录. 关系图 下图为去年学习文件系统时所画,有参考网上其他博主的资料,也有自己 ...

  7. linux内核引入模块机制好处,linux内核模块的版本检查机制

    linux内核对插入的内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,这完全是为了内核本身运行安全.由于linux内核的发布是基于版本号的,而所有的内核模块的开发必须依赖内核头 ...

  8. linux内核netfilter模块分析之:HOOKs点的注册及调用

    1: 为什么要写这个东西? 最近在找工作,之前netfilter 这一块的代码也认真地研究过,应该每个人都是这样的你懂 不一定你能很准确的表达出来. 故一定要化些时间把这相关的东西总结一下. 0:相关 ...

  9. Linux内核功能模块图

    Linux内核是linux操作系统的核心部分,它实现了操作系统的五大功能模块: 进程管理 内存管理 文件系统 设备控制 网络 Linux内核的功能模块图:

最新文章

  1. 实体链接:信息抽取中的NLP的基础任务
  2. (Java集合框架)集合框架概述和Collection常用功能及遍历
  3. sql查询between and_SQL(二)——SQL简单查询
  4. PHP生成静态HTML的源代码及用法
  5. 最新综述:多标签学习的新趋势
  6. 微信公众平台开发—利用OAuth2.0获取微信用户基本信息
  7. 使用Helm优化Kubernetes下的研发体验:基础设施即代码
  8. Angular HTTPClient的使用方法
  9. sap wad_使用网真和WAD热部署Kubernetes
  10. bzoj 4551: [Tjoi2016Heoi2016]树
  11. C++ STL常用算法总结
  12. HDU 4417 Super Mario 主席树
  13. Blog说明--WaaSinn的专业窝
  14. ResNet18、50模型结构
  15. SQL server 基础语法
  16. Warshall算法 (解决传递闭包问题)
  17. 2021-03-25
  18. Java生成动态GIF图片
  19. 50ETF期权与期货的区别
  20. 三、HTML5之文本元素

热门文章

  1. python函数定义与使用
  2. python中break、continue 、exit() 、pass终止循环的区别
  3. 小型服务器的操作系统,小型机服务器的操作系统
  4. Linux编译安装中configure、make和make install各自的作用详解
  5. python 使用raise语句主动抛出异常(Exception)、将异常抛出给上一级
  6. 什么是序列化?python pickle模块
  7. 如何安装 jupyter lab 和 jupyter notebook?
  8. Python 绘图问题:Matplotlib中plt.rcParams[]使用方法 rcsetup.py matplotlibrc
  9. PyQt、QtDesigner及其它工具包的安装
  10. linux——Shell脚本说明、创建、执行、调试