insmod(insert module)命令用于向Linux内核动态加载内核模块。它是Linux内核模块管理工具集中的基本命令,允许用户在系统运行时手动加载编译好的内核模块(通常以.ko为扩展名)。
insmod [选项] 模块文件 [模块参数=值...]
| 参数 | 说明 |
|---|---|
模块文件 |
要加载的内核模块文件(通常为.ko文件) |
模块参数=值 |
传递给模块的参数,多个参数用空格分隔 |
| 选项 | 说明 |
|---|---|
-f, --force |
强制加载模块(不推荐,可能导致系统不稳定) |
-v, --verbose |
显示详细信息 |
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
内核模块是可以在系统运行时动态加载到内核中的代码,它们可以扩展内核功能而无需重新编译整个内核。
.ko文件(Kernel Object)/lib/modules/$(uname -r)/目录下硬件设备驱动程序,如网卡、声卡、USB设备驱动
e1000.kosnd-hda-intel.ko
网络协议栈扩展,防火墙、VPN等
iptable_filter.kotunnel4.ko
支持不同的文件系统格式
ntfs.kofuse.ko
sudo或以root用户身份执行。
加载一个简单的内核模块:
# 切换到root用户
sudo su
# 查看当前内核版本
uname -r
# 进入模块目录
cd /lib/modules/$(uname -r)/kernel
# 查找模块
find . -name "*.ko" | head -5
# 加载模块(以fuse模块为例)
insmod /lib/modules/$(uname -r)/kernel/fs/fuse/fuse.ko
# 验证模块是否加载成功
lsmod | grep fuse
有些模块支持参数配置,可以在加载时指定:
# 查看模块支持的参数(需要先获取模块信息)
modinfo fuse
# 加载模块并传递参数
insmod /lib/modules/$(uname -r)/kernel/fs/fuse/fuse.ko max_user_bgreq=10 max_user_congthresh=20
# 查看模块当前参数值(加载后)
cat /sys/module/fuse/parameters/max_user_bgreq
使用-v选项查看加载过程的详细信息:
# 详细模式加载模块
insmod -v /lib/modules/$(uname -r)/kernel/drivers/net/dummy.ko
# 输出示例:
# insmod: INFO: checking module '/lib/modules/5.4.0-91-generic/kernel/drivers/net/dummy.ko'
# insmod: INFO: loading module '/lib/modules/5.4.0-91-generic/kernel/drivers/net/dummy.ko'
加载自己编译的内核模块:
# 编译自定义模块(假设已经准备好源代码)
cd /path/to/module/source
make
# 加载编译好的模块
insmod mymodule.ko
# 查看自定义模块信息
dmesg | tail -20 # 查看内核日志,模块加载信息会显示在这里
| 命令 | 描述 | 与insmod的关系 |
|---|---|---|
rmmod |
从内核移除模块 | 相反操作 |
modprobe |
智能加载模块(自动处理依赖) | 高级替代品 |
lsmod |
列出已加载的模块 | 查看状态 |
depmod |
生成模块依赖关系 | 依赖管理 |
modinfo |
显示模块信息 | 信息查询 |
| 特性 | insmod | modprobe |
|---|---|---|
| 依赖处理 | 不处理依赖 | 自动处理依赖 |
| 模块路径 | 需要完整路径 | 只需要模块名 |
| 配置文件 | 不使用 | 使用/etc/modprobe.d/配置 |
| 复杂性 | 简单直接 | 功能丰富 |
| 推荐使用 | 特定路径加载、测试 | 日常模块管理 |
内核模块之间可能存在依赖关系,insmod不会自动解决依赖:
# 示例:加载依赖其他模块的模块
# 尝试加载一个依赖其他模块的模块(会失败)
insmod module_with_deps.ko
# 输出:insmod: ERROR: could not insert module module_with_deps.ko: Unknown symbol in module
# 查看缺少的符号
dmesg | tail -5
# 先加载依赖的模块
insmod dependency1.ko
insmod dependency2.ko
# 再加载目标模块
insmod module_with_deps.ko
# 使用modprobe可以自动处理这种依赖
modprobe module_with_deps
#!/bin/bash
# 临时加载USB转串口驱动
echo "=== 加载USB转串口驱动 ==="
# 检查模块是否已加载
if lsmod | grep -q "ftdi_sio"; then
echo "ftdi_sio模块已加载"
else
echo "加载ftdi_sio模块..."
# 先加载依赖模块
insmod /lib/modules/$(uname -r)/kernel/drivers/usb/serial/usbserial.ko
insmod /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ftdi_sio.ko
# 检查是否成功
if lsmod | grep -q "ftdi_sio"; then
echo "驱动加载成功"
echo "可用的串口设备:"
ls /dev/ttyUSB* 2>/dev/null || echo "暂无设备连接"
else
echo "驱动加载失败"
fi
fi
# 查看模块信息
echo "=== 模块信息 ==="
lsmod | grep -E "usbserial|ftdi_sio"
#!/bin/bash
# 内核模块开发测试流程
echo "=== 内核模块开发测试 ==="
MODULE_NAME="mytest"
MODULE_FILE="${MODULE_NAME}.ko"
# 1. 清理旧模块
echo "1. 清理旧模块..."
rmmod $MODULE_NAME 2>/dev/null && echo "已移除旧模块"
# 2. 编译模块
echo "2. 编译模块..."
make clean
make
if [ ! -f "$MODULE_FILE" ]; then
echo "错误: 编译失败,$MODULE_FILE 不存在"
exit 1
fi
# 3. 加载模块
echo "3. 加载模块..."
insmod $MODULE_FILE debug_level=3
if [ $? -eq 0 ]; then
echo "模块加载成功"
# 4. 查看模块信息
echo "4. 模块状态:"
lsmod | grep $MODULE_NAME
# 5. 查看内核日志
echo "5. 内核日志(最后10行):"
dmesg | tail -10
# 6. 测试模块功能
echo "6. 测试模块功能..."
# 这里添加测试代码,例如:
# cat /proc/mytest 2>/dev/null
else
echo "模块加载失败"
echo "错误信息:"
dmesg | tail -10
fi
echo "=== 测试完成 ==="
echo "提示: 使用 'rmmod $MODULE_NAME' 移除模块"
#!/bin/bash
# 加载网络隧道模块
echo "=== 加载网络隧道模块 ==="
# 定义要加载的隧道模块
TUNNEL_MODULES=(
"tunnel4"
"ipip"
"gre"
)
for module in "${TUNNEL_MODULES[@]}"; do
# 检查模块是否已加载
if ! lsmod | grep -q "^${module} "; then
echo "加载模块: $module"
# 查找模块文件
MODULE_PATH=$(find /lib/modules/$(uname -r) -name "${module}.ko" 2>/dev/null | head -1)
if [ -n "$MODULE_PATH" ]; then
insmod "$MODULE_PATH"
if [ $? -eq 0 ]; then
echo " ✓ $module 加载成功"
else
echo " ✗ $module 加载失败"
fi
else
echo " ! 找不到 $module.ko"
fi
else
echo "模块 $module 已加载"
fi
done
echo "=== 当前加载的网络模块 ==="
lsmod | grep -E "tunnel|ip|gre" | head -10
A: 主要区别:
# insmod需要完整路径
insmod /lib/modules/$(uname -r)/kernel/drivers/net/dummy.ko
# modprobe只需要模块名
modprobe dummy
A: 这表示模块依赖其他模块提供的符号,需要先加载依赖模块:
# 查看具体缺少什么符号
dmesg | tail -5
# 通常的解决步骤:
# 1. 查找提供该符号的模块
grep -r "missing_symbol" /proc/kallsyms 2>/dev/null
# 2. 使用modprobe自动解决依赖
modprobe desired_module
# 3. 或者手动加载依赖链
insmod dependency1.ko
insmod dependency2.ko
insmod target_module.ko
# 4. 使用depmod生成依赖信息
depmod -a
A: 使用modinfo命令查看模块信息:
# 查看模块详细信息
modinfo module_name
# 查看模块支持的参数
modinfo -p module_name
# 示例:查看fuse模块参数
modinfo -p fuse
# 加载模块后查看参数值
cat /sys/module/module_name/parameters/*
A: 这表示模块已经加载,可以先移除再重新加载:
# 检查模块是否已加载
lsmod | grep module_name
# 如果已加载,先移除
rmmod module_name
# 重新加载
insmod module_name.ko
# 或者使用-F选项强制重新加载(不推荐)
insmod -f module_name.ko
dmesg查看加载错误信息-f强制选项insmod 模块文件 [参数=值].ko文件,需要完整路径modprobedmesg查看加载错误信息find /lib/modules/$(uname -r) -name "*.ko"modinfo 模块名modprobe --show-depends 模块名insmod 完整路径/模块.ko 或 modprobe 模块名lsmod | grep 模块名dmesg | tail -20rmmod 模块名