`
猫太的鱼
  • 浏览: 239241 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux如何在系统启动时自动加载模块

阅读更多
下面是以前学习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
分享到:
评论

相关推荐

    LINUX系统第三章--启动系统.pdf

    通过对Linux启动过程的深入分析,我们可以看出,bootsect.s、setup.s和head.s这三个文件在系统启动过程中扮演着极其重要的角色。从硬件检测到内核初始化,每一个步骤都经过精心设计,确保了Linux系统的稳定性和高效...

    内核模块的操作和使Linux系统支持ntfs读写

    5. 如果需要在开机时自动加载模块,编辑/etc/rc.local文件。 6. 安装必要的软件包,如fusentfs-3g,以及配置yum源确保依赖包自动保存。 通过上述步骤,就可以在Linux系统中挂载NTFS文件系统,并实现读写操作。这...

    简要分析linux系统的启动过程

    了解Linux启动过程有助于系统管理员在遇到问题时快速定位故障点,进行故障排除,同时也有助于优化系统启动时间和管理开机启动服务。在日常运维中,可以通过调整`/etc/inittab`、`/etc/rcN.d`目录下的脚本,以及使用`...

    Linux操作系统自如的装卸内核模块

    后者由内核驻留程序(KERNELD)负责,它在系统启动时创建与内核的进程间通信通道,并在需要时加载或卸载模块。KERNELD实际上不直接执行这些操作,而是调用如`insmod`之类的命令来完成。 总之,Linux的内核模块机制...

    Linux内核启动过程分析.pdf

    随着技术的发展,Linux作为一个免费开源的Unix类操作系统,因其强大的功能、高效的性能以及良好的可移植性,在嵌入式系统乃至高性能服务器领域获得了广泛应用。理解Linux内核的启动过程对于深入掌握Linux的工作原理...

    Linux启动过程综述

    如果Linux内核超过512字节,通常会被压缩为ZIP格式,或者某些非核心的部分被编译成模块,在系统启动后动态加载。 Linux下常用的引导程序包括Lilo和GRUB。这些引导程序不仅能够引导Linux系统,还能引导其他操作系统...

    Linux操作系统 引导启动

    在本文中,我们将详细地分析Linux 0.11操作系统的引导启动过程,包括bootsect.s引导块的源代码分析、引导过程的流程图等。 一、引导启动的基本概念 在PC机中,操作系统的引导启动是从BIOS中开始的。当PC机的电源...

    中兴通讯 ME3760 ZTE Linux操作系统驱动安装与加载1

    2. 配置系统:根据设备类型和驱动需求,编辑配置文件,如`/etc/modules`,将驱动模块名添加进去,以便系统启动时自动加载。 3. 加载驱动模块:使用`modprobe`命令手动加载驱动模块,或者重启系统使更改生效。 **USB...

    Linux启动及配置

    在引导过程中,内核会执行必要的硬件初始化,加载模块,设置中断,最后启动init进程。 4. **init进程与Inittab**:init是Linux系统中PID为1的特殊进程,负责执行inittab文件中的指令,启动系统服务,建立运行级别,...

    Linux系统下加载网卡驱动的方法

    `insmod`命令用于在运行时将模块(即驱动程序)加载到内核中。 5. 重启系统: ```bash reboot ``` 重启系统使驱动程序生效,但这一步并非总是必要,有时仅需重新启动网络服务即可。 配置网络接口是加载驱动后...

    Linux启动过程中硬件模块的加载

    `insmod` 直接加载模块,`modprobe` 则会自动处理依赖关系,而`depmod` 更新模块依赖的系统缓存。内核会根据设备树(device tree)或sysfs目录下的信息来决定加载哪些模块。 5. **系统初始化**:当硬件驱动加载完成...

    Linux系统启动流程PPT课件.ppt

    Linux系统启动流程是一个复杂但有序的过程,...总的来说,Linux系统启动流程涉及固件、引导加载器、内核、initramfs、init系统以及现代化的systemd等多个层次。理解这些概念有助于我们更好地调试和优化系统,提高效率。

    linux内核启动过程

    ### Linux内核启动过程 #### 一、引言 Linux作为一个免费开源的Unix类操作系统,在全球...此外,对Linux内核启动过程的理解也是将其应用于嵌入式系统的基础之一,有助于进一步推动Linux在嵌入式领域的应用和发展。

    linux系统启动全过程.pdf

    它们在系统启动时自动运行,并在内核级别提供服务。 8. **系统日志**:如syslogd或rsyslogd,记录系统事件和错误,用于故障排查。配置日志记录级别和目的地对于监控系统健康至关重要。 9. **Getty和Login**: ...

    Linux内核按需动态装载和卸掉模块

    `kerneld`是一个拥有超级用户权限的普通用户程序,它在系统启动时运行,通过进程间通信(IPC)与内核交互,负责加载和卸载模块以及执行其他类似的任务。`insmod`命令则负责实际的加载操作,它查找并定位模块文件,...

Global site tag (gtag.js) - Google Analytics