如何实现开机自启动?丨【拜托了,物联网!】

举报
嵌入式大杂烩 发表于 2021/10/18 22:54:43 2021/10/18
【摘要】 如何实现开机自启动?

《实用 | 如何远程登录开发板?》这篇文章中我们给开发板配置了网络,但是板子重启之后,又得手动输入命令去配置连接WiFi。

《实用 | 10分钟教你搭建一个嵌入式web服务器》《实用 | 10分钟教你通过网页点灯》这两篇文章中我们每次都是先登录开发板,再启动我们的boa服务器。

显然,这很不方便。

这篇笔记我们就一起来解决这个痛点。设置板子重启之后自动连接WiFi、boa服务器开机自动启动,以及设置我们的应用程序开机自启动。

嵌入式Linux初始化程序

1、init进程

init进程是内核加载的第一个用户空间的进程,PID为1,负责加载用户空间的服务和程序。如:

======001

2、init的种类

在嵌入式Linux中,不同的文件系统有不同的init的实现。

对于Buildroot_2019.02,其支持两种system init:BusyBox init、systemV。

======002

对于Buildroot_2020.02,其支持四种system init:BusyBox init、systemV、systemd及OpenRC。

======003

(1)BusyBox init

BusyBox init非常适合在嵌入式系统开发中使用,被誉为“嵌入式Linux的瑞士军刀”,它可以为嵌入式系统提供只要的init功能,并且通过定制可以做得非常 精炼。inittab是帮助init完成系统配置的主要文件。

(2)systemV

SystemV 是类 Unix 操作系统传统的也是首款初始化系统。SystemV为服务启动设置严格的顺序。每个服务都分配有一个优先级编号,init会按优先级顺序启动服务。如果需要确保网络连接后启动服务,则必须手动为服务分配更高的优先级。

System V初始化脚本都存储在/etc/rc.d/init.d/或/etc/init.d目录中。这些脚本用于控制系统的启动和关闭。

(3)systemd

systemd是Linux下的一套中央化系统及设置管理程序(init),包括有守护进程、程序库以及应用软件。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。目前绝大多数的Linux发行版都已采用systemd代替原来的System V。

(4)OpenRC

OpenRC是一个基于依赖关系的rc系统,可以和系统所提供任何init程序配合运行,一般指的是/sbin/init。但是她不是用来取代/sbin/init的。

基于SystemV的开机自启动

上面我们简单地了解了相关地概念。我这里地开发板用的是Buildroot_2020.02,初始化系统用的是SystemV。下面我们基于这个环境做一些简单的程序自启动的实践。

我这里的System V初始化脚本都存储在/etc/init.d目录中:

======004

init进程启动之后,会对/etc/inittab文件的解释及执行。

我们看看/etc/inittab文件里有什么内容:

======005

可以看到里面用到了两个脚本文件:

  • /etc/init.d/rcS
  • /etc/init.d/rcK

其中,可以看出/etc/init.d/rcS是在系统开机之后执行的脚本;/etc/init.d/rcK是在系统关机时执行的脚本。

下面看看/etc/init.d/rcS里面的内容:

======006

从里面的信息我们可以知道,这个rcS脚本会循环调用/etc/init.d文件夹下的以S+数字开头的脚本文件,即:

======007

其中,S后面的数字表示启动的顺序,数字小的先启动。

下面我们一起来简单验证一些是不是这样的。

示例代码:

test.c

#include <stdio.h>

int main(void)
{
	for (int i = 0; i < 5; i++)
	{
		printf("Hello world\n");
	}
	return 0;
}

编译:

arm-linux-gnueabihf-gcc test.c -o test

把test传到开发板的home目录:

scp test root@192.168.1.8:/home

在开发板/etc/init.d/目录下新建文件S100Test:

#!/bin/sh
cd /home
./test > test_log.txt

脚本很简单,把test程序输出的信息存放到同目录下的test_log.txt文件中。

保存S100Test脚本,修改其权限:

chmod 777 S100Test

重启板子:

reboot

可以看到,test同目录下会生成一个test_log.txt文件:

======008

表明我们已经可以设置我们的程序开机自启动了。上面只是进行简单地演示,S100Test启动脚本可能不够规范,我们可以模仿/etc/init.d/目录下地其它脚本的格式编写我们的启动脚本,如S99myirhmi2脚本的内容如:

======009

套用其模板修改S100Test为:

#!/bin/sh

case "$1" in
        start)
                cd /home
                ./test > test_log.txt
                ;;
        stop)

                ;;
        *)
                echo "Usage: $0 {start| stop|restart}"
                exit 1
esac

exit $?

以上就是本次关于程序自启动的一些学习分享。

回到文章开头的问题,我们就可以用类似的方法来设置我们的板子,让其开机自动配置网络、自动启动boa服务器,为了图方便,我直接把相关执行命令加入到/etc/init.d/rcS中,如:

======010

重启,可以看到,相关程序已经自启动了:

======011

巨人肩膀:

1、https://blog.csdn.net/weixin_39607935/article/details/111626606

2、https://blog.csdn.net/shanzhizi/article/details/39082495

3、https://blog.csdn.net/u012944254/article/details/111034628

4、https://www.cnblogs.com/xjnotxj/p/11951957.html

【拜托了,物联网!】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/299476

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。