本文目录导读:

在Shell脚本中使用modprobe加载内核模块,主要涉及以下几个关键点:
基本加载命令
#!/bin/bash # 加载模块 modprobe <module_name>
带参数的模块加载
#!/bin/bash # 加载模块并传递参数 modprobe <module_name> <param1>=<value1> <param2>=<value2> # 示例:加载8139too网卡驱动并设置参数 modprobe 8139too debug=1
常用选项和模式
加载模块
#!/bin/bash # 强制加载(忽略依赖检查) modprobe -f <module_name> # 显示详细信息 modprobe -v <module_name> # 显示依赖关系但不加载 modprobe --dry-run <module_name>
卸载模块
#!/bin/bash # 卸载模块 modprobe -r <module_name> # 强制卸载 modprobe -r -f <module_name>
实际脚本示例
示例1:检查并加载模块
#!/bin/bash
MODULE="nvidia"
LOG_FILE="/var/log/module_load.log"
# 检查模块是否已加载
if lsmod | grep -q "^$MODULE"; then
echo "$(date): $MODULE 已加载" >> "$LOG_FILE"
else
echo "$(date): 正在加载 $MODULE..." >> "$LOG_FILE"
# 加载模块
if modprobe "$MODULE"; then
echo "$(date): $MODULE 加载成功" >> "$LOG_FILE"
else
echo "$(date): $MODULE 加载失败" >> "$LOG_FILE"
exit 1
fi
fi
示例2:批量加载模块
#!/bin/bash
MODULES=("ext4" "nvme" "usb_storage" "ip_tables")
for module in "${MODULES[@]}"; do
echo "正在加载 $module..."
if modprobe "$module" 2>/dev/null; then
echo "✓ $module 加载成功"
else
echo "✗ $module 加载失败"
fi
done
示例3:带错误处理的完整脚本
#!/bin/bash
load_module() {
local module="$1"
local params="$2"
echo "尝试加载模块: $module"
# 检查模块是否存在
if ! modprobe -n "$module" 2>/dev/null; then
echo "错误: 模块 $module 不存在" >&2
return 1
fi
# 加载模块
if [ -n "$params" ]; then
modprobe "$module" "$params"
else
modprobe "$module"
fi
local status=$?
if [ $status -eq 0 ]; then
echo "成功加载模块: $module"
else
echo "错误: 加载模块 $module 失败 (错误码: $status)" >&2
fi
return $status
}
# 使用示例
load_module "usbhid" "quirks=0x046d:0xc077:0x04"
load_module "vboxdrv"
最佳实践提示
权限处理
#!/bin/bash
# 确保有root权限
if [ "$(id -u)" -ne 0 ]; then
echo "需要root权限来加载模块" >&2
exit 1
fi
# 或者使用sudo
# sudo modprobe <module>
依赖管理
#!/bin/bash # 更新模块依赖(通常不需要,但在某些情况下有用) depmod -a # 加载模块及其所有依赖 modprobe -a <module1> <module2>
配置持久化
#!/bin/bash # 将模块添加到永久加载列表 echo "module_name" >> /etc/modules # 或者创建配置文件 echo "options module_name param=value" > /etc/modprobe.d/custom.conf
注意事项
- 权限:需要root权限
- 依赖:modprobe自动处理依赖关系
- 错误处理:始终检查返回值
- 日志:记录加载失败的详细信息
- 兼容性:不同Linux发行版可能有细微差异
这些示例涵盖了大多数常见的modprobe使用场景,你可以根据实际需求调整。