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

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

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

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发现并不是需要修改的文件。

于是温习鸟哥的linux.vbird.org/”>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_
分享到:
评论

相关推荐

    linux内核模块加载顺序

    Linux内核模块加载顺序控制是Linux操作系统中一项关键技术,它决定了内核模块按照何种顺序被加载到内核中。本文将从多个角度阐述内核模块加载顺序的控制机制,包括模块的顺序声明、内核模块加载顺序控制的原理、内核...

    Linux 可加载内核模块剖析

    Linux 可加载内核模块(LKM)是Linux操作系统的核心组成部分,自1.2版本引入以来,极大地增强了内核的灵活性和可扩展性。LKM允许用户在运行时动态地添加或移除内核功能,这使得Linux内核能够根据需要进行调整,尤其...

    linux 内核模块编程指导

    * 编译和加载内核模块:编译和加载内核模块,以便在 Linux 操作系统中使用。 * 测试和调试内核模块:测试和调试内核模块,以确保其正确工作。 Linux 内核模块编程的常见问题 Linux 内核模块编程中常见的一些问题...

    对Linux可加载内核模块应用框架的研究.pdf

    Linux可加载内核模块(Loadable Kernel Modules, LKMs)是Linux操作系统中一个关键特性,它允许用户在系统运行时动态添加、移除或更新内核功能,无需重启系统。这种技术增强了Linux内核的灵活性和可扩展性,使得内核...

    Linux内核模块与_proc文件系统.pdf

    Linux 内核模块是 Linux 操作系统中的一种关键机制,它允许用户动态地修改内核、加载自己编写的程序,而不需要每次都编译内核。这种机制极大地改善了 Linux 的灵活性。 Linux 内核模块可以分为静态可加载模块和动态...

    编译Linux内核及调试内核模块

    6. 内核模块的编译和调试:文章中讲述了如何编译和调试Linux内核模块,包括编译内核模块、加载内核模块、调试内核模块等过程。 知识点:Linux内核模块的编译和调试,包括编译内核模块、加载内核模块、调试内核模块...

    LINUX内核模块编程

    Linux内核模块(Kernel Module)是动态加载到内核空间的一段代码,它可以在需要时加载,不需要时卸载,以实现对硬件设备驱动、文件系统或其他特定功能的支持。这使得系统能够根据实际需求调整内核的功能集,降低了...

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

    实现NTFS文件系统的读写还需要对系统的启动脚本进行配置,比如/etc/rc.local文件,确保在系统启动时自动加载所需的模块。通过编辑/etc/rc.local文件并添加相应的modprobe命令,可以实现模块的开机自动加载。 在实际...

    linux内核模块编程

    一个典型的“Hello World”级别的内核模块示例涉及编写一个最简单的内核模块,它在加载时通过模块的初始化函数打印一条消息,并在卸载时再次打印一条消息。这个过程演示了模块的加载和卸载,是学习内核模块编程的...

    linux内核模块分析

    在Linux操作系统中,内核模块(Kernel Modules)是可加载的代码片段,它们可以扩展内核的功能,而无需重新启动系统。这些模块对于系统管理员和开发者来说是非常有用的,因为它们允许在需要时添加或移除特定的硬件...

    Linux可加载内核模块剖析.pdf

    Linux 可加载内核模块(LKM)可以最小化内核的内存占用,只加载需要的元素,这是嵌入式系统的重要特性。 LKM 与直接编译到内核或典型程序的元素有根本区别。典型的程序有一个 main 函数,而 LKM 包含 entry 和 exit...

    linux-1.3.0__可加载内核模块引进版.bz2_linux1.3.0_

    Linux内核1.3.0是Linux操作系统历史中的一个重要版本,它标志着Linux系统的一个关键进步:可加载内核模块(Loadable Kernel Modules, LKM)的引入。这一特性极大地增强了系统的灵活性和可扩展性,使得用户可以在不...

    linux内核模块设计实验

    加载内核模块的过程通常由内核模块管理守护进程kmod控制,它调用modprobe来查找和加载必要的模块。modprobe会依据`/lib/modules/version/modules.dep`文件确定依赖关系,先加载依赖的模块,然后加载主模块。实际加载...

    一个LINUX的模块例子.rar_linux 文件系统_linux内核模块_内核模块

    Linux内核模块是Linux操作系统中一个重要的特性,它允许用户空间程序动态地加载或卸载代码到内核中,以扩展或修改内核的功能。这种机制使得开发者可以在不重新编译整个内核的情况下,实现对特定功能的更新或增强。本...

    内核模块加载顺序的控制

    内核模块的加载顺序主要由内核在启动过程中调用初始化函数的方式决定。内核启动时,它会按照一定的顺序调用不同的初始化函数集合,这些函数集分别位于`.initcall0.init`至`.initcall5.init`的不同段中。每个段代表一...

    Linux 可加载内核模块机制的研究与应用

    ### Linux 可加载内核模块机制的研究与应用 #### 摘要 本文详细探讨了Linux可加载内核模块(Loadable Kernel Module, LKM)的工作原理、实现细节及关键技术,旨在缩短Linux开发和测试周期,提高开发效率。文章重点...

    LInux内核模块开发

    Linux内核模块开发是指在Linux操作系统中开发和编译内核模块的过程。内核模块是一种特殊的程序,它可以被加载到Linux内核中,以提供新的功能或扩展现有的功能。本文将详细介绍Linux内核模块开发的基本概念、开发步骤...

    linux内核模块的编译详解(有图)

    编译 Linux 内核模块需要准备好内核模块源码、编写 Makefile 文件、编译模块、加载/卸载模块等步骤。 1. 准备内核模块源码 在编译 Linux 内核模块之前,需要准备好内核模块源码。源码文件通常以 `.c` 结尾,例如 `...

    Linux内核模块开发指南

    Linux内核模块是Linux操作系统中一个重要的组成部分,它们允许开发者在不重新编译整个内核的情况下,添加、修改或删除内核功能。本指南将深入探讨Linux内核模块的开发流程,涵盖从基础概念到高级技术,帮助你成为一...

Global site tag (gtag.js) - Google Analytics