modprobe命令是Linux内核模块管理工具,用于智能地向内核添加或移除模块。与insmod和rmmod不同,modprobe会自动处理模块的依赖关系,并会读取/etc/modprobe.d/目录下的配置文件。
modprobe [选项] 模块名 [模块参数=值...]
modprobe [选项] -r 模块名
| 选项 | 说明 |
|---|---|
-v, --verbose |
详细模式,显示更多信息 |
-r, --remove |
移除模块(如果不再使用) |
-f, --force |
强制加载模块 |
--first-time |
仅在第一次加载时成功 |
-C, --config |
使用指定的配置文件 |
-c, --showconfig |
显示当前配置 |
-n, --dry-run |
只显示将要执行的操作,不实际执行 |
-q, --quiet |
静默模式,不显示错误信息 |
-D, --show-depends |
显示模块依赖关系 |
--dump-modversions |
显示模块版本信息 |
-l, --list |
列出所有可用模块(已过时) |
-S, --set-version |
为模块操作设置内核版本 |
-V, --version |
显示版本信息 |
-h, --help |
显示帮助信息 |
| 特性 | modprobe | insmod / rmmod |
|---|---|---|
| 依赖处理 | 自动处理依赖 | 手动处理依赖 |
| 配置支持 | 读取配置文件 | 无配置支持 |
| 模块路径 | 使用模块名,自动查找 | 需要完整路径 |
| 错误处理 | 智能错误处理 | 简单错误处理 |
| 推荐使用 | 日常模块管理 | 特定调试场景 |
modprobe会读取以下位置的配置文件:
/etc/modprobe.d/*.conf - 主要的配置目录/etc/modprobe.conf - 传统的配置文件(已过时)/lib/modules/$(uname -r)/modprobe.d/*.conf - 内核特定配置/run/modprobe.d/*.conf - 运行时配置# 禁止加载特定模块
blacklist module_name
# 设置模块别名
alias device_name module_name
# 设置模块参数
options module_name param1=value1 param2=value2
# 强制加载模块(即使模块被标记为unsafe)
install module_name /sbin/modprobe --ignore-install module_name && { echo "模块已加载"; }
# 模块移除时执行命令
remove module_name { /sbin/modprobe -r module_name; }
# 设置模块依赖
softdep module_name pre: dependency1 dependency2
softdep module_name post: other_module
使用modprobe加载模块(自动处理依赖):
# 加载模块(自动处理依赖)
sudo modprobe fuse
# 加载模块并传递参数
sudo modprobe usb_storage delay_use=1
# 详细模式加载
sudo modprobe -v vboxguest
# 只显示将要执行的操作(不实际执行)
sudo modprobe -n vboxguest
# 强制加载模块
sudo modprobe -f module_name
使用modprobe卸载模块及其依赖:
# 卸载模块(如果不再使用)
sudo modprobe -r fuse
# 详细模式卸载
sudo modprobe -rv vboxguest
# 强制卸载
sudo modprobe -rf module_name
查看模块的依赖关系和其他信息:
# 显示模块的依赖关系
sudo modprobe -D fuse
# 显示所有模块配置
sudo modprobe -c
# 显示模块版本信息
sudo modprobe --dump-modversions fuse
# 查看模块黑名单
grep -r blacklist /etc/modprobe.d/
一些实用的modprobe操作:
# 重新加载模块(先卸载再加载)
sudo modprobe -r module_name && sudo modprobe module_name
# 加载模块并设置多个参数
sudo modprobe usb-storage quirks=0x2537:0x1066:e,0x2537:0x1066:f
# 检查模块是否存在
if modprobe -n module_name 2>/dev/null; then
echo "模块可用"
else
echo "模块不可用"
fi
# 批量操作模块
for module in fuse vboxguest usb-storage; do
echo "检查模块: $module"
sudo modprobe -n $module 2>/dev/null && echo " 可用" || echo " 不可用"
done
modprobe使用depmod生成的依赖关系文件:
# 生成模块依赖关系
sudo depmod -a
# 查看依赖文件
ls -la /lib/modules/$(uname -r)/modules.dep
# 查看特定模块的依赖
grep "^fuse" /lib/modules/$(uname -r)/modules.dep
# 手动检查依赖链
sudo modprobe --show-depends fuse
# 示例输出:
# insmod /lib/modules/5.4.0-91-generic/kernel/fs/fuse/fuse.ko
# 如果fuse依赖其他模块,会先加载依赖模块
以USB存储设备为例的依赖链:
modprobe usb-storage会自动加载usbcore和scsi_mod
#!/bin/bash
# USB设备管理脚本
echo "=== USB设备模块管理 ==="
# 检查USB核心模块是否加载
if ! lsmod | grep -q "^usbcore"; then
echo "加载USB核心模块..."
sudo modprobe usbcore
fi
# 加载USB存储模块
echo "加载USB存储模块..."
sudo modprobe usb-storage
# 加载特定USB设备驱动
USB_DEVICES=(
"uas" # USB Attached SCSI
"usbhid" # USB HID设备
"uhci_hcd" # USB 1.1控制器
"ehci_hcd" # USB 2.0控制器
"xhci_hcd" # USB 3.0控制器
)
for module in "${USB_DEVICES[@]}"; do
echo -n "检查模块 $module: "
if modprobe -n $module 2>/dev/null; then
echo "加载..."
sudo modprobe $module
else
echo "不可用"
fi
done
# 查看已加载的USB相关模块
echo ""
echo "已加载的USB模块:"
lsmod | grep -E "(usb|uhci|ehci|xhci|hid)" | head -10
echo ""
echo "USB设备列表:"
lsusb 2>/dev/null || echo "lsusb命令不可用"
#!/bin/bash
# 网络功能模块配置脚本
echo "=== 网络功能模块配置 ==="
# 定义要加载的网络模块
NETWORK_MODULES=(
"tun" # TUN/TAP虚拟网络设备
"tap" # TAP设备
"bridge" # 网桥支持
"bonding" # 网卡绑定
"8021q" # VLAN支持
"iptable_filter" # iptables过滤
"nf_conntrack" # 连接跟踪
"nf_nat" # NAT支持
)
# 创建模块配置文件
CONFIG_FILE="/etc/modprobe.d/network-tweaks.conf"
echo "创建网络模块配置文件..."
sudo tee "$CONFIG_FILE" > /dev/null << EOF
# 网络模块优化配置
options bonding mode=1 miimon=100
options 8021q max_vlans=64
options nf_conntrack hashsize=65536
EOF
echo "配置文件已创建: $CONFIG_FILE"
# 加载网络模块
echo ""
echo "加载网络模块..."
for module in "${NETWORK_MODULES[@]}"; do
echo -n "处理模块 $module: "
# 检查模块是否已加载
if lsmod | grep -q "^${module} "; then
echo "已加载"
else
# 尝试加载模块
if sudo modprobe -n "$module" 2>/dev/null; then
echo "正在加载..."
sudo modprobe "$module"
else
echo "不可用"
fi
fi
done
# 重新生成模块依赖
echo ""
echo "重新生成模块依赖..."
sudo depmod -a
echo ""
echo "当前加载的网络模块:"
lsmod | grep -E "(tun|tap|bridge|bond|vlan|iptable|nf_)" | head -15
#!/bin/bash
# 系统安全模块配置脚本
echo "=== 系统安全模块配置 ==="
# 创建安全配置文件
SECURITY_CONFIG="/etc/modprobe.d/security.conf"
echo "创建安全模块配置文件..."
sudo tee "$SECURITY_CONFIG" > /dev/null << 'EOF'
# 禁用不安全的模块
blacklist bluetooth
blacklist firewire-core
blacklist thunderbolt
blacklist usb-midi
# 禁用不常用的文件系统
blacklist cramfs
blacklist freevxfs
blacklist jffs2
blacklist hfs
blacklist hfsplus
blacklist squashfs
blacklist udf
# 禁用虚拟化模块(除非需要)
# blacklist kvm
# blacklist kvm-intel
# blacklist kvm-amd
# 设置模块参数
options usb-storage delay_use=1
EOF
echo "安全配置文件已创建: $SECURITY_CONFIG"
# 需要禁用的模块列表
BLACKLIST_MODULES=(
"bluetooth"
"firewire-core"
"cramfs"
"freevxfs"
)
# 检查并卸载需要禁用的模块
echo ""
echo "检查需要禁用的模块..."
for module in "${BLACKLIST_MODULES[@]}"; do
echo -n "检查模块 $module: "
if lsmod | grep -q "^${module} "; then
echo "已加载,正在卸载..."
sudo modprobe -r "$module" 2>/dev/null
# 检查是否成功卸载
if lsmod | grep -q "^${module} "; then
echo " 警告: 无法卸载 $module,可能有依赖"
else
echo " 成功卸载"
fi
else
echo "未加载"
fi
done
# 重新生成模块依赖
echo ""
echo "重新生成模块依赖并更新initramfs..."
sudo depmod -a
sudo update-initramfs -u 2>/dev/null || echo "update-initramfs不可用"
echo ""
echo "安全配置完成"
echo "注意:重启后配置才会完全生效"
A: 主要区别:
# modprobe使用模块名
sudo modprobe fuse
# insmod需要完整路径
sudo insmod /lib/modules/$(uname -r)/kernel/fs/fuse/fuse.ko
# 如果模块有依赖,insmod会失败
sudo insmod module_with_deps.ko
# 输出:insmod: ERROR: could not insert module module_with_deps.ko: Unknown symbol in module
A: 如果modprobe找不到模块,可以尝试以下方法:
# 1. 检查模块是否存在
find /lib/modules/$(uname -r) -name "*.ko" | grep module_name
# 2. 重新生成模块依赖
sudo depmod -a
# 3. 检查模块是否在黑名单中
grep -r "blacklist module_name" /etc/modprobe.d/
# 4. 检查内核版本是否匹配
uname -r
ls /lib/modules/
# 5. 安装缺失的内核模块
# Debian/Ubuntu:
sudo apt install linux-modules-extra-$(uname -r)
# RHEL/CentOS:
sudo yum install kernel-modules-extra
# 6. 手动指定模块路径(使用insmod)
sudo insmod /path/to/module.ko
# 7. 编译并安装模块
# 如果有模块源代码
cd /path/to/module/source
make
sudo make install
sudo depmod -a
A: 有几种方法可以永久加载模块:
# 方法1:添加到/etc/modules(Debian/Ubuntu)
echo "module_name" | sudo tee -a /etc/modules
# 方法2:添加到/etc/modules-load.d/(现代系统)
echo "module_name" | sudo tee /etc/modules-load.d/module_name.conf
# 方法3:使用systemd模块加载
echo "module_name" | sudo tee /etc/modules-load.d/module_name.conf
# systemd会自动在启动时加载
# 方法4:创建modprobe配置
echo "install module_name /sbin/modprobe --ignore-install module_name" | \
sudo tee /etc/modprobe.d/module_name.conf
# 方法5:添加到initramfs(复杂模块)
# 编辑/etc/initramfs-tools/modules(Debian/Ubuntu)
echo "module_name" | sudo tee -a /etc/initramfs-tools/modules
sudo update-initramfs -u
# 方法6:使用rc.local(传统方法)
# 在/etc/rc.local中添加(确保rc.local可执行):
# /sbin/modprobe module_name
A: 有几种方法可以设置模块参数:
# 方法1:在命令行中指定
sudo modprobe module_name param1=value1 param2=value2
# 方法2:在配置文件中设置(永久生效)
echo "options module_name param1=value1 param2=value2" | \
sudo tee /etc/modprobe.d/module_name.conf
# 方法3:运行时修改(已加载模块)
# 查看当前参数
cat /sys/module/module_name/parameters/*
# 修改参数(如果允许)
echo "value" | sudo tee /sys/module/module_name/parameters/param_name
# 方法4:在启动参数中设置
# 编辑GRUB配置,在linux行添加:
# module_name.param_name=value
# 方法5:使用modprobe.conf(旧系统)
# 在/etc/modprobe.conf中添加:
# options module_name param1=value1
# 示例:设置USB存储参数
sudo modprobe usb-storage delay_use=1 quirks=0x2537:0x1066:e
# 永久设置
echo "options usb-storage delay_use=1" | sudo tee /etc/modprobe.d/usb-storage.conf
depmod -a更新依赖关系modprobe -n测试模块加载-f强制选项/lib/modules/中的文件modprobe 模块名 [参数=值]modprobe -r 模块名/etc/modprobe.d//lib/modules/$(uname -r)/modules.dep完整的Linux内核模块管理工具链:
| 工具 | 用途 | 示例 |
|---|---|---|
modprobe |
智能加载/卸载模块 | modprobe fuse |
insmod |
直接加载模块(无依赖处理) | insmod /path/to/module.ko |
rmmod |
移除模块 | rmmod fuse |
lsmod |
列出已加载模块 | lsmod | grep fuse |
modinfo |
显示模块信息 | modinfo fuse |
depmod |
生成模块依赖关系 | depmod -a |
dmesg |
查看模块加载日志 | dmesg | grep module |
这些工具共同构成了完整的Linux内核模块管理体系,使得模块管理变得简单而高效。