分享

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

 slimfeng 2021-02-24

每次启动板子都要重新设置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这个脚本,内容如下:

  1. #! /bin/sh // 必须含有这个第一行,表明是bash脚本
  2. /bin/mount -a // 自动加载文件系统,文件系统是通过fstab来配置的
  3. echo " // 原来系统启动后的标志是在这个位子被打印出来的
  4. _ _ _ _ _ _ _ _ _ _ _ _
  5. \ _ _ _ _ _ ___
  6. / /__/ \ |_/
  7. / __ / - _ ___
  8. / / / / / /
  9. _ _ _ _/ / / \_/ \_ ______
  10. ___________\___\__________________
  11. "
  12. ENV_CONF=/etc/conf/env.conf
  13. [ -f ${ENV_CONF} ] && source ${ENV_CONF}
  14. for initscript in /etc/init.d/S[0-9][0-9]* // 遍历/etc/init.d/下面所有S开头,符合格式Snn*格式的服务启动脚本
  15. do
  16. if [ -x $initscript ] ; // 如果服务启动脚本文件存在,执行下面启动流程
  17. then
  18. echo "[RCS]: $initscript"
  19. source $initscript // 执行启动脚本
  20. fi
  21. 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修改脚本,那么系统重新启动后,脚本又会恢复成原来的。(因为这几个脚本都是根文件系统下面的,每次启动都从根文件系统下重新拷贝过来)

至此,结束。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多