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

目的

开机自动运行程序,或者说系统启动时自动运行程序,这是经常会需要用到的功能。这个功能通常依托于 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" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set 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" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set 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/sh

umask 077

start() {
        echo "Starting test log: Naisu is coming!!!"
}

stop() {
        echo "Stopping test log: Naisu is leaving!!!"
}

restart() {
        stop
        start
}

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

exit $?

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

调整脚本权限:

chmod 755 /etc/init.d/S77test

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

总结

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

  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《嵌入式Linux应用程序开发详解》是一本非常实用的Linux应用程序开发指导书,其主要讲解了嵌入式Linux系统应用程序的开发过程、技术、工具和优化方法。 本书涵盖了Linux应用程序开发的基础知识和实际案例,详细介绍了Linux系统的组成原理,以及如何开发应用程序。书中内容涉及嵌入式Linux系统的内核、文件系统、网络等方面,通过实践案例,为读者解决了开发过程中遇到的各种问题。 本书结构清晰,内容实用,读者可以从中学习到很多Linux开发的技巧和经验。其中,本书还对Linux应用程序性能优化方面进行了详细讲解,介绍了如何优化系统调用、内存管理、文件系统等性能方面的技术和方法。 总之,《嵌入式Linux应用程序开发详解》是一本非常好的嵌入式Linux应用程序开发入门书,对于想要从事Linux应用程序开发的工程师或编程爱好者来说,都是一本值得推荐的书籍。 ### 回答2: “嵌入式linux应用程序开发详解”是一本深入介绍嵌入式linux应用程序开发的书籍,它详细讲解了嵌入式Linux系统的基本原理、应用开发、系统调试等方面,适合想要学习嵌入式Linux应用程序开发的人阅读。 该书籍首先介绍了嵌入式系统的概念以及嵌入式Linux系统的基本架构和启动流程,随后详细讲解了Linux系统下的应用程序开发,如进程管理、文件系统、网络编程、驱动程序等。此外,该书还介绍了如何在开发过程中使用调试器进行系统调试和性能分析。 在讲解应用程序开发的过程中,该书重点介绍了如何使用GCC编译器和GDB调试器,以及如何使用BusyBox和uClibc等开源软件库实现系统开发,读者可以通过这些工具和库知道如何实现嵌入式Linux系统的开发过程。 总的来说,“嵌入式linux应用程序开发详解”是一本非常适合想要深入学习嵌入式Linux应用程序开发的人阅读的书籍,它全面深入地讲解了嵌入式Linux系统的各个方面,不仅是一本理论性的书籍,还能带领读者一步步实际操作。 ### 回答3: 嵌入式Linux应用程序开发详解PDF一书详细介绍了嵌入式系统以及嵌入式Linux系统的相关知识。本书首先介绍了嵌入式系统中的硬件结构和软件结构,然后介绍了嵌入式Linux系统以及Linux操作系统的基本工作原理和操作方法。 本书旨在帮助开发人员了解嵌入式系统的基本原理以及如何使用Linux系统进行应用程序开发。本书以上传统的C语言为基础,通过介绍Linux下的文件系统、进程管理、内存管理、设备驱动等基础知识,使读者能够深入了解如何开发嵌入式Linux应用程序,如网络应用程序、多媒体应用程序等。 本书特设了大量实例和应用场景,通过实例讲解的方式帮助读者理解和掌握开发嵌入式Linux应用程序的方法和技巧。此外,本书还介绍了嵌入式Linux系统的调试、测试和优化等相关内容,让读者能够全面掌握嵌入式Linux应用程序的开发过程。 总之,本书是一本深入浅出、实用性强的嵌入式Linux应用程序开发详解。通过详细介绍嵌入式系统和Linux操作系统的基础知识,以及丰富的实例和应用场景,本书可帮助读者快速掌握开发嵌入式Linux应用程序的方法和技巧,从而提高其开发效率和成功率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值