下面是以前学习Linux时写的,后来仔细研究rc.sysinit后发现,只需要修改下列地方就可以了,不必这么麻烦的:

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文件,例如我写创建文件my.modules,内容为modprobe fuse

记得最后chmod 755 my.modules

(2) 或者在/etc/rc.modules里面加上modprobe fuse,没有的话创建该文件。

然后reboot,lsmod | grep fuse验证一下就OK了。

==============



Automatically load kernel modules:



为搞清楚如何在系统启动时自动加载模块,搜索了好久,网上有很多人提出这个问题,但都没有正确的答案,无论是中文社区还是英文社区,大家的回答都没有讲到点子上,无非是围绕modprobe.conf、modprobe讲来讲去的,要不就是针对特定问题尝试不同的方法。有的还建议把modprobe modulename写入rc.local,却不曾想,rc.local的执行被放在整个启动顺序的很后面,而启动init.d下面定义的服务却在rc.local前面,那么如果某个服务要用这个模块,就不行了。



在测试LVS时,因为我的Fedora7的Kernel(2.6.21-1)缺省没有加载ip_vs模块,而内核中已经包含编译好的IPVS相关的模块了,放在:/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/下面,有:

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_dh.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_ftp.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_lblc.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_lc.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_nq.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_rr.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_sed.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_sh.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_wlc.ko

/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_wrr.ko

其中ip_vs.ko是IPVS的基本模块,不加载IPVS就不能工作(运行ipvsadm会报错的),而其他的都是IPVS的调度算法或特定协议的辅助模块,需要时则须加载。



如果系统运行时手动加载则需:modprobe ip_vs 和modprobe ip_vs_sh等。



要了解如何在系统启动时自动加载模块(Automatically load kernel modules),就得先了解系统是如阿启动的,启动的过程中按什么顺序做了什么,怎么做的,这些启动操作都有那些文件和脚本控制。由于Google和Baidu出来的东西都解决不了问题,而且man modprobe和man modprobe.conf发现并不是需要修改的文件。



于是温习鸟哥的http://linux.vbird.org/“开机关机流程与Loader”:

1. 整个开机流程是

(1) 载入BIOS的硬件信息,并取得第一个开机装置的代号

(2)读取第一个开机装置的MBR的boot Loader (grub)的开机信息

(3)载入OS Kernel信息,解压Kernel,尝试驱动硬件

(4) Kernel执行init程序并获得run-lebel信息(如3或5)

(5) init执行/etc/rc.d/rc.sysinit

(6)启动内核外挂模块(/etc/modprobe.conf)

(7) init执行run-level的各种Scripts,启动服务

(8) init执行/etc/rc.d/rc.local

(9)执行/bin/login,等待用户Login

(10)Login后进入Shell



看来正确的方式是把需要加载的模块放在(5)或(6),但正如网络上很多人的尝试,修改modprobe.conf都没有成功(例如在modprobe.conf中增加install ip_vs...)。于是我修改了/etc/rc.d/rc.sysinit就成功加载了。



初步尝试在rc.sysinit最后增加 modprobe.conf ip_vs,重启后lsmod | grep ip_vs,发现成功自动加载了。



于是仿效rc.sysinit中其他模块的加载方法,扩展改脚本文件,在最后增加下来一段:

# load LVS IPVS modules

if [ -d /lib/modules/$unamer/kernel/net/ipv4/ipvs ]; then

for module in /lib/modules/$unamer/kernel/net/ipv4/ipvs/* ; do

module=${module##*/}

module=${module%.ko}

modprobe $module >/dev/null 2>&1

done

fi

就把/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/下的所有模块都自动加载了。其中:

if语句检查ipvs模块的目录是否存在

for循环遍历该目录下面的所有文件

module=${module##*/} :其中##表示从前面删除字符,*/表示删除到最后一个/,如果一个#就表示只删除到第一个/。如果变量后面接##,表示在##后面的字符串取最长的(一直到最后面),如果接#,表示取最小的一段。

module=${module%.ko}:表示从后面删除.ko。如果变量后面接%%,表示在%%后面的字符串取最长的(一直到最前面),如果接%,表示取最小的一段。

这样多module的两次修改就得到了模块名,就是文件名不带路径和.ko后缀。

modprobe $module >/dev/null 2>&1:加载模块,输出都指向空设备



这样重启后lsmod | grep ip_vs就会得到:

ip_vs_wrr 6977 0

ip_vs_wlc 6081 0

ip_vs_sh 6593 0

ip_vs_sed 6081 0

ip_vs_rr 6081 0

ip_vs_nq 5953 0

ip_vs_lc 5953 0

ip_vs_lblcr 10565 0

ip_vs_lblc 9797 0

ip_vs_ftp 10053 0

ip_vs_dh 6593 0

ip_vs 79425 22 ip_vs_wrr,ip_vs_wlc,ip_vs_sh,ip_vs_sed,ip_vs_rr,ip_vs_nq,ip_vs_lc,ip_vs_lblcr,ip_vs_lblc,ip_vs_ftp,ip_vs_dh

Linux中实现在系统启动时自动加载模块的更多相关文章

  1. 嵌入式 Linux 与linux启动时自动加载模块

    一.在ARM linux 下,一般而言,产品在启动的过程中应该加载模块,最简单的方法是修改启动过程的rc脚本(/etc/init.d/rcS),增加ismod /../xxx.ko这个命令.例如:加载 ...

  2. [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)

    启动时自动加载dtbo,实际上就是做了一个cape.官方推荐的方法是用eeprom来实现,请参考我的博文<为BBB制作专属自己的cape(一)>和<为BBB制作专属自己的cape(四 ...

  3. Tomcat启动时自动加载Servlet

    1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet ...

  4. 如何让openvpn在windows启动时自动加载

    在非常需要vpn的人群中,他们几乎一整天都连接着vpn,但是每次开机都要连接vpn的过程有时候比较繁琐对于新手而言.这篇文章主要是说明如何在windows启动时自动加载openvpn自动连接,该教程适 ...

  5. 基于JQuery实现滚动到页面底端时自动加载更多信息

    基于JQuery实现滚动到页面底端时自动加载更多信息 关键代码: 代码如下: var stop=true; $(window).scroll(function(){ totalheight = par ...

  6. 将DLL放入到资源中,运行时自动加载

    今天在看到 一个小软件,考勤用的 AttendanceSheet_V_1_2,只有一个EXE文件,绿色的随便考到哪里都可以运行. 顺手反编译后发现,他将需要的DLL也放入到资源文件了,在启动的时候自动 ...

  7. 在运行jar时自动加载指定的jar包

    初学Java的人经常遇到的一个问题是:如果一个程序依赖某个文件夹下的一堆jar包,那么启动它的时候就需要在java -cp参数后面一个一个的加上jar包的名称,很不方便. 比如主程序类叫Main,在目 ...

  8. Tomcat启动时自动加载一个类

    有时候在开发Web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  9. 如何在tomcat启动时自动加载一个类

    有时候在开发web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

随机推荐

  1. microbiom github reference

    https://github.com/SchlossLab https://github.com/crazyhottommy

  2. POJ2431_Expedition_KEY

    题目传送门 由题目可得,在一条路上有N个加油站,在距离终点a[i](细节)的位置上,你需要通过长度为L的路,油箱的容量是无限的,但是初始只有P点油,经过每个加油站时可以选择加b[i]的油,问最少加油几 ...

  3. 1030: [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 https://www.lydsy.com/JudgeOnline/problem.php?id=1030 分析: AC自动机+dp. 正难则反,求满足的, ...

  4. SpringBoot-01:什么是SpringBoot?

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- SpringBoot: Spring Boot可以轻松创建独立的,生产级的基于Spring的应用程序,您可以“ ...

  5. Drupal中自定义登录页面

    通过覆写template定义新的user_login表单来为自定义登录页面.方法: 1.  本站使用的主题是Rorty.来到\sites\all\themes\rorty,打开template.php ...

  6. lunix安装

    https://www.cnblogs.com/wcwen1990/p/7630545.html

  7. 「Python」conda与pip升级所有的包

    conda: conda update --a pip: pip freeze --local | grep -v '^-e' | cut -d = -f 1 | xargs -n1 sudo pip ...

  8. DirectX11与DirectX12在古墓丽影暗影中的表现

    最近在关注这两个图形API,因为感兴趣,也算是初学者. 以下内容仅供参考. 使用古墓丽影暗影游戏,分别对这两个进行比较,得出的结论如下图(此笔记本散热很差,更改散热应该比下图结果好些): 首先看可以很 ...

  9. hello-jni Android.mk文件简析

    #删除旧变量 LOCAL_PATH := $(call my-dir) #返回当前目录 include $(CLEAR_VARS) #删除旧变量 #设置新变量 LOCAL_MODULE := hell ...

  10. php 面试题

    1.通过哪一个函数,可以把错误转换为异常处理? A:set_error_handlerB:error_reportingC:error2exceptionD:catch 正确答案:A 答案分析:set ...