linux 如何加载模块
- Linux
- 2025-07-29
- 4
modprobe
命令加载模块,
modprobe 模块名
;也可以使用
insmod
命令,如
insmod 模块文件路径
。
什么是内核模块?
内核模块是可动态加载和卸载的内核代码片段,它们扩展了内核的功能,而不需要重新编译或重启内核,常见的模块包括驱动程序(如网卡、声卡)、文件系统支持(如 ext4
、nfs
)以及内核功能扩展(如 procfs
)。
如何查看已加载的模块?
在加载模块之前,你可能需要查看当前系统中已经加载的模块,可以使用以下命令:
lsmod
该命令会列出所有已加载的模块及其依赖关系。
如何加载模块?
加载模块通常使用 modprobe
或 insmod
命令,以下是它们的区别和使用方法:
(1) 使用 modprobe
modprobe
是推荐的命令,它不仅加载模块,还会自动解决模块的依赖关系,加载 e1000
网卡驱动模块:
sudo modprobe e1000
如果模块加载成功,可以使用 lsmod
或 dmesg
查看日志确认。
(2) 使用 insmod
insmod
仅加载指定的模块文件,不会自动解决依赖关系,加载 /lib/modules/$(uname -r)/kernel/drivers/net/e1000.ko
:
sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/e1000.ko
如果模块有依赖,需要手动加载依赖模块。
如何卸载模块?
卸载模块可以使用 rmmod
或 modprobe -r
命令,以下是它们的区别:
(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
,但需谨慎操作: