深入探究Linux下ARM启动脚本(/etc/init.d/rcS)在什么位置被调用
每次启动板子都要重新设置IP地址,很麻烦,就从网上搜搜怎么设置成开机自动修改IP地址。
搜的过程中,想着Linux里面的启动脚本是在哪个地方被调用?想想还是自己理一遍。
(自己理解的启动脚本就是在开机过程中固定调用某几个脚本,但这样感觉会不会有点写死了,Linux可能有更好的解决方案)
百度上全部都是讲如何使用启动脚本的...很少有文章去研究启动脚本在哪个位置被调用......
还是找到了一点蛛丝马迹。
首先,初步搜索“嵌入式Linux系统启动脚本”,大致可以知道:将想要设置某些服务自启动,只需要在/etc/init.d/rcS下添加脚本就行了。
然后,搜索“/etc/init.d/rcS内容分析”,大致可以知道:Linux内核启动过程中,会挂载文件系统,在文件系统挂载后,运行的第一个程序就是根目录下的linuxrc,而这是一个指向/bin/busybox 的链接,也就是说,系统起来后运行的第一个程序就是busybox本身。
再然后,busybox会解析“/etc/inittab”配置文件,而/etc/inittab配置文件里面会运行/etc/init.d/rcS这个脚本!
追根溯源,流程大致如下: init程序(linuxrc) -> busybox -> /etc/inittab -> /etc/init.d/rcS
接下来,继续分析一下/etc/init.d/rcS这个脚本,内容如下:
#! /bin/sh // 必须含有这个第一行,表明是bash脚本
/bin/mount -a // 自动加载文件系统,文件系统是通过fstab来配置的
echo " // 原来系统启动后的标志是在这个位子被打印出来的
_ _ _ _ _ _ _ _ _ _ _ _
\ _ _ _ _ _ ___
/ /__/ \ |_/
/ __ / - _ ___
/ / / / / /
_ _ _ _/ / / \_/ \_ ______
___________\___\__________________
"
ENV_CONF=/etc/conf/env.conf
[ -f ${ENV_CONF} ] && source ${ENV_CONF}
for initscript in /etc/init.d/S[0-9][0-9]* // 遍历/etc/init.d/下面所有S开头,符合格式Snn*格式的服务启动脚本
do
if [ -x $initscript ] ; // 如果服务启动脚本文件存在,执行下面启动流程
then
echo "[RCS]: $initscript"
source $initscript // 执行启动脚本
fi
done
分析后发现,在rcS脚本中,会遍历/etc/init.d/下面所有S开头,符合格式Snn*格式的服务启动脚本,如果有则启动脚本。
总结下吧,如果我们想要在开发板中运行一个脚本,可以有如下操作:
1.写一个脚本文件,然后在 /etc/inittab配置文件中添加并运行该脚本
2.写一个脚本文件,脚步文件名符合“S[0-9][0-9]*”,这样在/etc/init.d/rcS脚本执行过程中会被执行
3.直接在/etc/init.d/rcS脚本文件末尾添加需要的脚本代码
注意!!!
之前理清了启动流程,以为可以直接修改init.d目录下的文件,然后实际操作的时候发现并不行!
后来明白原因应该是,这几个文件都是加载根文件系统时被添加进来的,所以,如果要修改启动脚本,必须是在制作根文件系统时,修改这几个脚本文件。如果在系统启动后,通过vi /etc/init.d/rcS修改脚本,那么系统重新启动后,脚本又会恢复成原来的。(因为这几个脚本都是根文件系统下面的,每次启动都从根文件系统下重新拷贝过来)
至此,结束。