前言
现代Linux系统通常用systemd管理进程,
但嵌入式Linux系统通常采用SystemV的模式,开机启动脚本保存在/etc/rcX.d目录下,X代表运行级别
运行级别
0:系统停机状态
1:单用户工作状态,也称为维护模式,只允许一个用户(通常是root)登录,用于系统维护和故障排除。它禁止远程登录。
2:多用户状态,但没有网络连接。这意味着允许多个用户登录,但系统不提供网络服务。
3:完全的多用户状态,具有网络连接。这个级别通常用于正常的系统操作,允许多个用户登录,并提供完整的网络服务。
4:通常未使用,保留给用户自定义。在某些发行版中,这个级别可能用于特殊目的。
5:图形界面模式。这个级别通常用于图形用户界面(GUI)操作,允许多个用户登录,并提供图形界面。
6:系统正常关闭并重启。这个级别会导致系统先关闭所有服务和进程,然后重新启动。
rcX.d目录
who -r或者who -a命令可以查看当前的运行级别
可以看到运行级别是5,那么我们看下/etc/rc5.d这个目录
S表示start,这里没有K,有的话代表Kill,意为启动和停止服务时的操作
启动就是系统启动的时候的操作;至于停止嘛,我估计是reboot命令时执行的操作,如果你啪一下把电断了那估计就啥都不执行了
S后面的数字代表执行顺序
系统启动时串口打印的服务启动顺序和数字对应的顺序一致
/etc/init.d/rc.local
S99rc.local这个文件就是用来执行用户自定义的初始化操作的
它是/etc/init.d/rc.local的软链接
让我们看下这个文件内容
#! /bin/sh
### BEGIN INIT INFO
# Provides: rc.local
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
do_start() {
if [ -x /etc/rc.local ]; then
echo -n "Running local boot scripts (/etc/rc.local)"
/etc/rc.local
[ $? = 0 ] && echo "." || echo "error"
return $ES
fi
}
case "$1" in
start)
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
;;
*)
echo "Usage: $0 start|stop" >&2
exit 3
;;
esac
可以看出来,它的目的就是去执行/etc/rc.local这个文件
/etc/rc.local
我们看下这个文件内容
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
echo 30000 > /proc/sys/vm/min_free_kbytes
source /etc/profile
/opt/QDesktop >/dev/null 2>&1 &
exit 0
设置低于30000字节时开始回收内存、初始化环境变量、还有个似乎是桌面程序的的QDesktop?输出都丢了
这就是启动时的自定义操作,如果想添加什么就在exit 0前追加
比如我想在启动的时候初始化eth0的ip地址:
rc.local之前
我现在拿的是正点原子的板子
他的init是一个名叫sysvinit的可执行文件,这个我不知道,不过在其他嵌入式的板子上看到过,他们的init是一个指向busybox的软链接
在busybox的源码里,init所做的动作就是去解析/etc/inittab
正点原子这块板子的inittab和其他板子不太一样
有些这里指定了rc.sysinit这个脚本
然后rc.sysinit会去加载rc.local