Linux如安在系统启动时自动加载模块[操作系统]
本文“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发现并非需求改正的文件.
于是复习鸟哥的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_lblc,ip_vs_ftp,ip_vs
以上是“Linux如安在系统启动时自动加载模块[操作系统]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |