开发环境 - 深入探究Linux下ARM启动脚本(/etc/init.d/rcS)在什么位置被调用

2019-07-13 03:10发布

每次启动板子都要重新设置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修改脚本,那么系统重新启动后,脚本又会恢复成原来的。(因为这几个脚本都是根文件系统下面的,每次启动都从根文件系统下重新拷贝过来)
至此,结束。