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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ivan804638781/article/details/80607756

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


至此,结束。








猜你喜欢

转载自blog.csdn.net/Ivan804638781/article/details/80607756