嵌入式Linux设置开机自动运行程序(基于BusyBox init)

article/2025/9/7 19:46:34

文章目录

  • 目的
  • BusyBox init启动流程
    • inittab
    • rcS 和 rcK
  • 设置开机自动运行程序
  • 总结

目的

开机自动运行程序,或者说系统启动时自动运行程序,这是经常会需要用到的功能。这个功能通常依托于 init 程序实现。 init 是Linux在内核启动完成之后第一个启动的程序,该程序会运行一些特定位置的脚本,相当于实现开机运行程序的效果。

在常见的Linux发行版中 init 程序主要为 SysVinitSystemd 。在嵌入式Linux中根文件系统通常使用 buildroot 来建立, buildroot 默认是基于 BusyBox 构建根文件系统的,这种方式下默认的 init 程序可以称其为 BusyBox init 。 这篇文章将介绍通过 BusyBox init 实现开机自动运行程序的功能。

BusyBox init启动流程

inittab

BusyBox init 会在启动后读取 /etc/ 目录下的 inittab 文件,下面是其内容样式:

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run# Startup the system
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts /dev/shm
::sysinit:/bin/mount -a
::sysinit:/bin/mkdir -p /run/lock/subsys
::sysinit:/sbin/swapon -a
null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS# Put a getty on the serial port
console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL# Stuff to do for the 3-finger salute
#::ctrlaltdel:/sbin/reboot# Stuff to do before rebooting
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r

可以从注释中看到这个文件记录的是一条条按照一定规则编写的语句。

BusyBox init 会在启动后执行第三个字段为 sysinit 的语句中的命令,会在关机时执行第三个字段为 shutdown 的语句中的命令。

在这里添加语句就可以实现开机运行程序了,不过一般不推荐这么做。

rcS 和 rcK

从上面文件中可以看到 sysinit 系列的语句最后一条会去执行 /etc/init.d/ 目录下的 rcS 脚本,也即开机时其它工作完成后会执行 rcS 这个脚本。同样的会在关机时先执行 /etc/init.d/ 目录下的 rcK 脚本。这两个脚本内容如下:

rcS

#!/bin/sh# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do# Ignore dangling symlinks (if any).[ ! -f "$i" ] && continuecase "$i" in*.sh)# Source shell script for speed.(trap - INT QUIT TSTPset start. $i);;*)# No sh extension, so fork subprocess.$i start;;esac
done

rcK

#!/bin/sh# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in $(ls -r /etc/init.d/S??*) ;do# Ignore dangling symlinks (if any).[ ! -f "$i" ] && continuecase "$i" in*.sh)# Source shell script for speed.(trap - INT QUIT TSTPset stop. $i);;*)# No sh extension, so fork subprocess.$i stop;;esac
done

可以看到 rcS 脚本会依据文件名排序依次读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 start 方法。同用的 rcK 脚本会依据文件名逆排序读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 stop 方法。

设置开机自动运行程序

对于我们需要设置开机运行程序而言,可以编写名字为 S??* 格式的脚本文件存放到 /etc/init.d/ 目录下,这样它就会在开机时被调用执行其中的 start 方法了。

名字为 S??* 格式的脚本文件默认在 /etc/init.d/ 目录下已经有一些了:
在这里插入图片描述

我们可以参考它们来编写自己的脚本开机脚本,这里创建名为 S77test 的文件,其中内容如下:

#!/bin/shumask 077start() {echo "Starting test log: Naisu is coming!!!"
}stop() {echo "Stopping test log: Naisu is leaving!!!"
}restart() {stopstart
}case "$1" instart)start;;stop)stop;;restart|reload)restart;;*)echo "Usage: $0 {start|stop|restart}"exit 1
esacexit $?

备注1:各个函数中不建议出现长时间阻塞的操作,如果有需求建议在命令后面加上 (空格)& 放到后台运行;
备注2:行尾必须是以只有换行符形式,不能是windows上回车加换行的形式;

调整脚本权限:

chmod 755 /etc/init.d/S77test

下面就是脚本在开关机时运行的演示了:
在这里插入图片描述

总结

在使用 BusyBox init 的嵌入式Linux系统中设置开机自动运行程序并不复杂,只要了解其脚本调用流程基本就可以了。


http://chatgpt.dhexx.cn/article/SQZJu6sk.shtml

相关文章

Linux笔记:开机自动运行程序

文章目录 目的rc.localSysVinitSystemd在Systemd中实现rc.local注意事项SysVinit和Systemd的联系与区别总结 目的 开机自动运行程序&#xff0c;或者说系统启动时自动运行程序&#xff0c;这是经常会需要用到的功能。在linux中实现随系统启动运行程序的功能通常有三种&#xf…

Big-Endian Little-Endian

大端模式Big-Endian就是高位字节排放在内存的低地址端&#xff0c;低位字节排放在内存的高地址端。 小端模式Little-Endian就是低位字节排放在内存的低地址端&#xff0c;高位字节排放在内存的高地址端。 小端模式 &#xff1a;强制转换数据不需要调整字节内容。 大端模式 &a…

字节序:Big Endian 和 Little Endian

最近碰到了node.js中的buf.readUInt16LE(offset[, noAssert])方法&#xff1a; 根据指定的偏移量&#xff0c;使用特殊的 endian 字节序格式读取一个无符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末…

字节序——Big Endian和Little Endian

Big Endian和Little Endian 一、Endian 的起源二、字节序之 Little-Endian&Big-Endian三、为什么要注意字节序四、网络序和主机序五、Go 中的字节序 一、Endian 的起源 在各种计算机体系结构中&#xff0c;对于字节、字等的存储机制有所不同&#xff0c;因而引发了计算机通…

小端格式和大端格式(Little-EndianBig-Endian)

小端格式和大端格式(Little-Endian&Big-Endian) 1 字节序 字节序&#xff0c;也就是字节的顺序&#xff0c;指的是多字节的数据在内存中的存放顺序。 在几乎所有的机器上&#xff0c;多字节对象都被存储为连续的字节序列。 例如&#xff1a;如果C/C中的一个int型变量 a…

BIG-ENDIAN VS LITTLE-ENDIAN

1. 计算机硬件有两种储存数据的方式&#xff1a;大端字节序&#xff08;big endian&#xff09;和小端字节序&#xff08;little endian&#xff09;。 举例来说&#xff0c;数值0x2211使用两个字节储存&#xff1a;高位字节是0x22&#xff0c;低位字节是0x11。 字节序&…

什么是字节序? Big-Endian vs Little-Endian 举例说明

计算机只理解二进制。这意味着 0 和 1 构成了计算机使用的语言。 一位是 0 或 1 。8 位组成一个字节。从这些简单的部分&#xff0c;我们可以构建极其复杂的连接计算机系统来渲染视频、显示来自世界各地的文本并计算极其复杂的算法。 一些数据&#xff08;一些英文字符&#…

java -- Big Endian and Little Endian 大端和小端概念讲解及如何转换

什么是大端、小端&#xff1f; 字节是计算机中数据处理的基本单位。 计算机中以字节为单位存储和解释信息&#xff0c;规定一个字节由八个二进制位构成&#xff0c;即1个字节等于8个比特&#xff08;1Byte8bit&#xff09;。 计算机进行数据处理时&#xff0c;一次存取、加工和…

浅谈大小端(Endian)与位域

目录 字节序 位序 常见位序的错误理解 以太网的大小端 以太网的字节序 以太网的位序 位域中的大小端 位域遇上大小端以太网通信 大端CPU发送 小端CPU发送 位域大小端问题的解决措施 大小端问题浪费了太多应用、驱动、逻辑工程师太多的时间&#xff0c;无时无刻都有人…

Endian

字节序&#xff08;Endian&#xff09;即字节顺序&#xff08;Byte-Order&#xff09;&#xff0c;又称为端序或尾序&#xff08;Endianness&#xff09;。描述的是计算机如何组织字节组成对应的数字&#xff0c;是多字节数据存储和传输时字节的顺序&#xff0c; 是多字节数据在…

一个神奇的网站 Papers with code

这个网站会把某个方向的 论文和代码总结出来。 有助于提高个人效率。 https://paperswithcode.com/sota

这是一个神奇的网站

2012年1月9日&#xff0c;下午2点&#xff0c;打开www.12306.cn.硬是提交了100多次才进入这个神奇的网站。结果又提交了100多次订单才成功了&#xff0c;很不幸运的是尼玛硬座的&#xff0c;等等是无号的...

【工具】sci-hub:一个神奇的免费下载文献的网站

title: “【工具】sci-hub&#xff1a;一个神奇的免费下载文献的网站” date: 2019-09-20T10:44:5508:00 lastmod: 2019-09-20T10:44:5508:00 tags: [“工具”,“sci-hub”] categories: [“工具”] sci-hub&#xff1a;一个神奇的免费下载文献的网站&#xff08;使用技巧&…

最近发现的几个神奇CS学习网站

最近发现的几个CS学习网站&#xff0c;真的灰常良心&#xff0c;希望自己以后少吃瓜&#xff0c;多看看别人的路线和学习笔记。 一、北大信科大佬的CS笔记 https://csdiy.wiki/#_8 自己也是打算学习各种国外的优质课程&#xff08;最近在学CS224n课程和做对应的project&…

冷门但超级有用的神奇网站推荐

给大家介绍一些神奇的具有强大功能的网站&#xff0c;有些功能特别的有用 查询名下手机号 https://getsimnum.caict.ac.cn 查询内容将以短信的形式下发到手机&#xff0c;一个人一天只能查询一次&#xff0c;因为是工信部出品的&#xff0c;所以安全性十分有保障 查询手机号…

快速下载一个网站

有时候我们需要分析一个网站&#xff0c;或者基于一个网站进行魔改&#xff0c;这个就需要一些特殊的手段将网站源码下载到本地了&#xff0c;其实目前大部分网站都是有代码压缩的&#xff0c;很难去有修改。 这里我就教大家如何快速获取一个网站的所有资源&#xff0c;包括源码…

给理工男女的一个神奇网站!

2018 AI开发者大会是一场由中美人工智能技术高手联袂打造的AI技术与产业的年度盛会&#xff01;这里有15硅谷实力讲师团、80AI领军企业技术核心人物、100技术&大众实力媒体、1500AI专业开发者——我们只讲技术&#xff0c;拒绝空谈&#xff01; 参加 2018 AI开发者大会&…

推荐一个命名变量的神奇网站 CODELF

推荐一个命名变量的神奇网站 CODELF 在我们写程序的时候&#xff0c;总是需要去给各种变量命名。于是各种命名大法都上来了&#xff0c;有拼音的&#xff0c;有首字母缩写的&#xff0c;各种各样。而我们推荐的命名肯定是英文的驼峰命名。今天给大家推荐一个网站&#xff1a;h…

mc神奇宝贝服务器网站,我的世界1.12.2 master 神奇宝贝服务器

———— 服务器名称&#xff1a;master—神奇宝贝 ———— 服务器版本&#xff1a;1.12.2 ———— 服务器类型&#xff1a;神奇宝贝 ———— 服务器的IP&#xff1a;进群下载客户端 ———— 服务器QQ群&#xff1a;609019804 ———— 服务器特色 游戏模式&#xff1a;休闲…

Craigslist :一个神奇的网站

转载&#xff1a;https://blog.naaln.com/2017/05/a-magic-website-raigslist/ 今天在看书的时候看到一个问题&#xff0c;什么是一个好产品&#xff1f;是好用的&#xff0c;还是好看的&#xff1f; 显而易见&#xff0c;应该是一个好用的产品。有什么产品是特别好看&#xff…