当前位置:首页 > Linux > 正文

linux 如何加载模块

Linux 中,可以使用 modprobe 命令加载模块, modprobe 模块名;也可以使用 insmod 命令,如 insmod 模块文件路径

什么是内核模块?

内核模块是可动态加载和卸载的内核代码片段,它们扩展了内核的功能,而不需要重新编译或重启内核,常见的模块包括驱动程序(如网卡、声卡)、文件系统支持(如 ext4nfs)以及内核功能扩展(如 procfs)。


如何查看已加载的模块?

在加载模块之前,你可能需要查看当前系统中已经加载的模块,可以使用以下命令:

lsmod

该命令会列出所有已加载的模块及其依赖关系。


如何加载模块?

加载模块通常使用 modprobeinsmod 命令,以下是它们的区别和使用方法:

(1) 使用 modprobe

modprobe 是推荐的命令,它不仅加载模块,还会自动解决模块的依赖关系,加载 e1000 网卡驱动模块:

sudo modprobe e1000

如果模块加载成功,可以使用 lsmoddmesg 查看日志确认。

(2) 使用 insmod

insmod 仅加载指定的模块文件,不会自动解决依赖关系,加载 /lib/modules/$(uname -r)/kernel/drivers/net/e1000.ko

sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/e1000.ko

如果模块有依赖,需要手动加载依赖模块。


如何卸载模块?

卸载模块可以使用 rmmodmodprobe -r 命令,以下是它们的区别:

linux 如何加载模块  第1张

(1) 使用 rmmod

rmmod 用于卸载指定的模块,卸载 e1000 模块:

sudo rmmod e1000

如果模块被其他模块或进程使用,卸载可能会失败。

(2) 使用 modprobe -r

modprobe -r 会自动卸载模块及其依赖的模块。

sudo modprobe -r e1000

如何查找模块文件?

模块文件通常位于 /lib/modules/$(uname -r)/kernel/ 目录下,可以使用以下命令查找模块文件:

find /lib/modules/$(uname -r) -name "e1000.ko"

或者使用 modinfo 查看模块信息:

modinfo e1000

如何手动编译和加载模块?

如果需要手动编译模块(例如从源码安装),可以按照以下步骤操作:

(1) 编译模块

进入模块源码目录,执行:

make

编译生成 .ko 文件。

(2) 加载模块

使用 insmod 加载编译好的模块:

sudo insmod my_module.ko

(3) 卸载模块

使用 rmmod 卸载模块:

sudo rmmod my_module

如何设置模块开机自动加载?

如果希望模块在系统启动时自动加载,可以将模块添加到 /etc/modules-load.d/ 目录下的配置文件中,创建文件 /etc/modules-load.d/my_module.conf为:

my_module

这样,系统启动时会自动加载 my_module


常见问题及解决方法

(1) 模块加载失败

  • 检查模块名称是否正确。
  • 检查模块文件是否存在。
  • 查看 dmesg 日志,确认错误原因。

(2) 模块卸载失败

  • 检查是否有进程正在使用该模块。
  • 使用 lsmod 查看模块的依赖关系。

模块管理工具

以下是常用的模块管理工具及其用途:

工具 用途
lsmod 列出已加载的模块
modprobe 加载模块并解决依赖关系
insmod 加载模块文件
rmmod 卸载模块
modinfo 查看模块信息
depmod 生成模块依赖关系文件
mkinitrd 生成初始 RAM 磁盘(包含模块)

实战示例:加载 USB 无线网卡驱动

假设你有一个 USB 无线网卡,其驱动模块为 rtl8812au,可以按照以下步骤加载模块:

(1) 查看模块是否已加载

lsmod | grep rtl8812au

(2) 加载模块

sudo modprobe rtl8812au

(3) 验证模块是否加载成功

lsmod | grep rtl8812au

或者查看 dmesg 日志:

dmesg | grep rtl8812au

(4) 设置开机自动加载

创建文件 /etc/modules-load.d/rtl8812au.conf为:

rtl8812au

FAQs

问题 1:如何查看模块的详细信息?

答:可以使用 modinfo 命令查看模块的详细信息,包括依赖关系、作者、版本等。

modinfo e1000

问题 2:如何强制卸载一个正在被使用的模块?

答:通常情况下,不建议强制卸载正在被使用的模块,因为这可能导致系统不稳定,如果确实需要卸载,可以尝试停止使用该模块的进程,或者重启系统,如果必须强制卸载,可以使用 rmmod -f,但需谨慎操作:

 
0