如果需要在Linux启动时自动加载模块,往往使用mkinitrd命令将模块打包进ramdisk p_w_picpath。仔细研究了rc.sysinit后发现有这样一段代码,可以提供另外一种方式。

# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
  [ -x $file ] && $file
done
# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
        /etc/rc.modules
fi


可见,只需要在两个地方任意进行配置就可以完成相同的操作(以fuse内核模块为例)

(1) 在/etc/sysconfig/modules/下面创建*.modules文件,参考已经有的*.modules文件,并添加执行权限;

#!/bin/sh
/sbin/modinfo -F filename 8021q > /dev/null 2>&1
if [ $? -eq 0 ]; then
    /sbin/modprobe 8021q
fi

或者像这样

#!/bin/sh
if [ ! -c /dev/input /uinput ] ;  then
exec /sbin/modprobe uinput  > /dev/null 2>&1
fi

(2) 也可以在/etc/rc.modules里面加上相应内容,没有的话创建该文件。

操作完毕之后reboot,lsmod | grep fuse进行验证。


为什么不使用rc.local?

网上有些文章建议在/etc/rc.local文件中增加modprobe命令,某些情况下这样配置不会正常工作。因为系统启动在执行完rc.d目录中的程序后才执行/etc/rc.local,因此,启动时rc.d中的程序如果用到了所需加载的模块,就会出错。

另外有些文章提到修改/etc/modprobe.conf文件,其实也是错误的。这个文件仅仅是定义一些内核模块的别名、以及一些特殊的加载、卸载命令。修改此文件并不能使模块在启动时被自动加载。

参见Linux系统启动流程

在RedHat 6.x之后,modprobe.conf已经取消了,如何对modprobe.d下.conf文件进行配置,.conf的如何被调用,还需要找人讨论一下。