目录
开机自启动:
/etc/rc.loacl
system V
使用/etc/rc*.d/系统运行优先级
遇到的问题:
1. Linux 系统启动阶段概述
方法1:/etc/rc5.d/ 脚本延时+日志
方法二:使用 udev 规则来触发脚本执行
开机自启动:
/etc/rc.loacl
有的系统没有这个文件
直接把执行脚本的命令写到这个文件末尾即可。
system V
查看该linux系统是否支持system V
systemd --version
编写开机启动需要执行的mydemo.sh:
#!/bin/bashdate >> /root/date.txt
进入下面目录
cd /etc/systemd/system
创建xxx.service文件
vim myauto.service
myauto.service内容:
[Unit]Description=Run a Custom Script at StartupAfter=default.target[Service]ExecStart=/root/mydemo.sh[Install]WantedBy=default.target
加载到硬盘上:
systemctl daemon-reload#设置自启动
#设置myauto.service服务自启动:
sudo systemctl enable myauto.service
然后会自动创建一个软连接。手动测试一下:
#【1】
#开启myauto.service服务:
sudo systemctl start myauto.service#【2】
reboot
注意:shell脚本的 #!/bin/bash 或者 #!/bin/sh 一定不能省略。否则服务不能启动,但是单独运行脚本是可以的。
下图时自动创建的一个软连接:
使用/etc/rc*.d/系统运行优先级
c0.d 到 rc6.d 分别对应系统运行级别的0到6:
rc0.d:关机。
rc1.d:单用户模式。
rc2.d 至 rc5.d:多用户模式,在大多数Linux发行版中,级别3或5用于图形界面启动(取决于具体的配置)。
rc6.d:重启。
rcS.d:用于系统启动时的特殊初始化过程。
查看当前系统运行在哪个级别上面
runlevel
把脚本放在/etc/init.d/下:
在对应的rcN.d下创建软连接:(当然也可以在rcS.d中创建软连接。)当自启动时,运行级别时N时,就会执行rcN.d下面的脚本。
注意软连接名字最好是:S[num]<service>. 因为自启动时,是按照S后面的数字来顺序执行的。
ln -s /etc/init.d/mydemo S02mydemo
自启动运行流程:
遇到的问题:
把pwm初始化的脚本放到/etc/rc5.d下面,不能自启动,猜测pwm硬件没有初始化,就执行了这个脚本。
rcN.d
脚本运行时,某些用户空间工具或服务可能尚未启动(如 udev
或 sysfs
文件系统未完全挂载)。
所以自启动脚本要是有操作硬件方面的,不推荐使用rcN.d的方式添加自启动脚本。
1. Linux 系统启动阶段概述
Linux 系统的启动过程可以分为以下几个主要阶段(以现代系统为例):
-
内核加载和初始化:
- 内核解压缩并加载硬件驱动。
- 初始化核心子系统(如内存管理、设备树解析、文件系统等)。
- 加载硬件驱动(包括 PWM 驱动)。
-
用户空间初始化:
- 内核启动第一个用户空间进程(通常是
init
或systemd
)。 - 执行系统初始化脚本(如 SysVinit 的
rcN.d
脚本或 Systemd 的服务单元)。
- 内核启动第一个用户空间进程(通常是
-
运行级别切换和服务启动:
- 根据默认运行级别,执行对应的启动脚本(如
rcN.d
中的脚本)。 - 启动用户定义的服务和应用程序。
- 根据默认运行级别,执行对应的启动脚本(如
dmesg | grep -i pwm //查看内核加载时,pwm硬件的加载情况
dmesg | grep -i backlight
方法1:/etc/rc5.d/ 脚本延时+日志
依旧使用/etc/rc5.d/的方法执行自启动文件。
在脚本的最前面,加延时,并设置一个日志文件。
#!/bin/bash
sleep 5echo "Starting PWM initialization at $(date)" >> /var/log/pwm-init.log
方法二:使用 udev
规则来触发脚本执行
udev
是 Linux 系统中的设备管理器,它在系统启动时以及运行过程中动态管理设备节点。udev
规则允许用户自定义如何处理硬件设备的识别、命名和权限设置等。通过编写 udev
规则文件,可以实现对特定硬件设备的自动化配置,例如自动挂载存储设备、加载驱动程序或执行脚本。
这样,当 febf0010.pwm
设备被添加到内核时,脚本会自动执行。
- 在基于设备树(Device Tree)的系统中,
febf0010
通常是 PWM 控制器的基地址(Base Address),定义在设备树中。
ls -l /sys/class/pwm/ //查看pwm类
ls /sys/bus/platform/devices/ //查看平台所有设备
udev规则添加:
/etc/udev/rules.d/99-pwm.rules //添加udev规则
99-pwm.rules 内容如下:
ACTION=="add", SUBSYSTEM=="platform", KERNEL=="febf0010.pwm", RUN+="/path/to/your/script.sh"
重启结果:
左边是/var/log/pwm_init.log日志,右边是/etc/init.d/init_pwm.sh脚本。
所以,自启动后,pwm口被识别到后,就会自动执行/etc/init.d/init_pwm.sh脚本,该脚本的日志会输出到/var/log/pwm_init.log里面。
参考:
linux下添加简单的开机自启动脚本 - 与f - 博客园
关于Ubuntu运行级别、开机启动脚本的说明 - 追梦的飞飞 - 博客园