Linux:如何在启动时自动加载内核模块
Linux 内核遵循模块化内核设计。可加载内核模块 (LKM) 是包含用于扩展正在运行的内核或所谓的基本内核的代码的目标文件。LKM 通常用于添加对新硬件、文件系统、NIC 等的支持。大多数情况下,它们是硬件的设备驱动程序,但 LKM 常用于文件系统、防火墙和其他用途。本页介绍如何使用配置选项在启动时加载 Linux 内核模块(驱动程序)。
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 是的 |
要求 | Linux |
预计阅读时间 | 5 分钟 |
用于加载内核模块的 Linux 配置文件
加载 Linux 内核模块是系统管理员的一项基本任务。您需要编辑名为的文件/etc/modules或在目录中放置新的配置文件/etc/modules-load.d/。使用任何一种方法加载内核模块。配置文件由一组行组成。所有空行以及 之后一行上的所有文本#都将被忽略。如果在安装后添加了新硬件并且该硬件需要内核模块,则使用/etc/modules(或 中的其他文件/etc/modules-load.d/),必须将系统配置为加载适合新硬件的内核模块。
示例
例如,如果系统包含 IDE CD-ROM,模块配置文件在 /etc/modules 文件中包含以下 3 行。您可以使用 vim 命令或cat 命令来显示它:
现在您可以添加以下行:
保存并关闭文件。使用reboot 命令或shutdown 命令重新启动 Linux 系统以进行测试:
# vi /etc/modules
# cat /etc/modules
ide-cd
ide-core
cdrom
# reboot
如何找到 Linux 内核设备驱动程序/模块的位置
将 ls 命令与 uname 命令结合使用,如下所示:
ls /usr/lib/modules/$(uname -r)/kernel/ ls -l /usr/lib/modules/$(uname -r)/kernel/
我们使用 uname 来找出系统上的 Linux 内核版本和设备驱动程序:
在 Linux CLI 上列出 Linux 内核模块
无需重启 Linux 机器即可加载设备驱动程序
另一种选择是无需重启系统即可加载驱动程序。使用 modprobe 命令。例如:
请注意,如果您使用的是旧版本的Debian Linux 或 Ubuntu Linux,请使用文件 /etc/modules 文件而不是 /etc/modules.conf,后者也适用于旧版本的 Red Hat/Fedora/CentOS Linux。现在最好在所有 Linux 发行版上使用该目录。
# modprobe {driver-name}
# modprobe {driver-name} variable=value
# modprobe ide-cd
# modprobe ide-cd cdrom
# pass the start_ro=1 option to md_mod module #
# modprobe md_mod start_ro=1
/etc/modules-load.d/
modprobe 的配置目录
modprobe 命令可以一次添加或删除多个模块。许多模块都有依赖关系。因此,Linux 提供了一种指定要与这些模块一起使用哪些选项的方法。因此,使用 /etc/modprobe.d/ 目录和命令来构建逻辑。例如,这是我针对 Intel Wifi 驱动程序的逻辑:
$ cat /etc/modprobe.d/iwlwifi.conf
# /etc/modprobe.d/iwlwifi.conf # iwlwifi will dyamically load either iwldvm or iwlmvm depending on the # microcode file installed on the system. When removing iwlwifi, first # remove the iwl?vm module and then iwlwifi. remove iwlwifi \ (/sbin/lsmod | grep -o -e ^iwlmvm -e ^iwldvm -e ^iwlwifi | xargs /sbin/rmmod) \ && /sbin/modprobe -r mac80211
您可以使用 man 命令查看这些命令的列表:
$ man modprobe.d
关于现代 Linux 内核的说明
如今,udev 用于自动模块处理。无需将模块放入任何配置文件中,因为 udev 会处理它。但是,有时您仍需要在启动过程中添加额外的模块,或将另一个模块列入黑名单,以使您的 Linux 笔记本电脑或服务器正常运行。例如,内核模块可以在启动期间加载到 /etc/modules-load.d/ 下的文件中。例如:
# cat /etc/modules-load.d/kvm.conf
kvm
kvm_intel
Task: See what Linux kernel modules are currently loaded
Type the lsmod command as follows:
$ lsmod
OR
$ lsmod | more
Sample outputs:
Fig.01: Obtaining information about currently loaded modules/drivers
To get information about a module, run modinfo command
You need to use the modinfo command as follows:
$ modinfo {module_name}
For example get info about a module named igb:
$ modinfo igb
Sample outputs:
Fig.02: Find information about a module
One can also use the systool command:
$ systool -v -m igb
$ systool -v -m nvme
How to unload/remove a module
The syntax is as follows for the rmmod command
$ sudo rmmod {module_name}
OR
$ sudo modprobe -r {module_name}
In some cases, the Linux kernel modules cannot be removed by sysadmin at runtime to maintain system stability. You need to delete the configuration option from the /etc/modules file in such cases. Also delete the config file in /etc/modules-load.d/ directory using the rm command and cp command:
# ls -l /etc/modules-load.d/
# First, make a backup #
# cp /etc/modules-load.d/my-config.conf /root/my-config.conf-backup
# rm -i /etc/modules-load.d/my-config.conf
Summing up
You learned about Linux kernel module configuration file locations on your disk and related commands. I would recommend reading the documentation using the help command or man command:
man lsmod
man rmmod
man modinfo
Did you notice? ????
example is ad-free to protect your privacy and security. We rely on reader support to keep the site running. Please consider subscribing to us on Patreon or supporting us with a one-time support through PayPal. Your support will help us cover the costs of hosting, CDN, DNS, and tutorial creation.
Join Patreon ➔
PayPal ➔