在 Ubuntu 20.04 中使用 init.d 或者systemd实现开机自动执行脚本
Ubuntu 20 默认使用的是 systemd
系统管理器,但传统的 SysV Init
(/etc/init.d/
)脚本依然兼容并可用。本文将介绍如何通过 init.d
写脚本来在开机时自动设置某个 GPIO(如 GPIO407)为高电平,适用于嵌入式系统、开发板等场景。
一、为什么选择 init.d
虽然 systemd
是推荐方式,但对于一些老旧项目或驱动初始化问题,用 init.d
更加直观、简单,并且在某些设备初始化顺序依赖场景下依然非常实用。
二、创建并配置 init.d 脚本
1. 创建脚本
bash
复制编辑
sudo nano /etc/init.d/gpio407_init
2. 脚本内容如下:
bash
复制编辑
#!/bin/sh ### BEGIN INIT INFO # Provides: gpio407_init # Required-Start: $local_fs # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Set GPIO407 high at boot ### END INIT INFO GPIO=407 case "$1" in start) echo "Exporting GPIO$GPIO and setting it HIGH..." if [ ! -e /sys/class/gpio/gpio$GPIO ]; then echo $GPIO > /sys/class/gpio/export sleep 0.1 fi echo out > /sys/class/gpio/gpio$GPIO/direction echo 1 > /sys/class/gpio/gpio$GPIO/value echo "GPIO$GPIO set to HIGH" ;; stop) echo $GPIO > /sys/class/gpio/unexport ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0
三、赋予脚本执行权限
bash
复制编辑
sudo chmod +x /etc/init.d/gpio407_init
四、注册为启动服务
将脚本注册到系统默认启动级别:
bash
复制编辑
sudo update-rc.d gpio407_init defaults
这会在 /etc/rc2.d/
、rc3.d/
、rc4.d/
、rc5.d/
中创建符号链接,实现开机执行。
五、立即运行测试
你可以直接运行脚本验证功能是否正确:
bash
复制编辑
sudo /etc/init.d/gpio407_init start
验证:
bash
复制编辑
cat /sys/class/gpio/gpio407/value # 应输出 1
六、注意事项
-
权限问题:脚本执行的所有
echo > /sys/...
操作必须使用root
权限,直接用sudo
执行整个脚本,不要对单独的echo
使用sudo
,否则会因 shell 权限问题失败。 -
脚本调试:可以在脚本中加入日志输出,例如
echo "xxx" >> /var/log/gpio.log
方便调试。 -
GPIO不可导出:如果
/sys/class/gpio/export
不存在,可能是内核不支持 GPIO sysfs 接口,需要启用相关内核选项。
七、其他:如何禁用脚本
如果不再需要该脚本,可以移除注册:
bash
复制编辑
sudo update-rc.d -f gpio407_init remove
然后手动删除脚本:
bash
复制编辑
sudo rm /etc/init.d/gpio407_init
八、总结
尽管 Ubuntu 20 已默认使用 systemd,但 init.d
脚本依然兼容且适用嵌入式控制、GPIO 操作等早期初始化需求。按照本文方法配置,可以轻松实现开机自动执行。
如需改为 systemd 方式,欢迎继续阅读或留言,我可以帮你转换为 .service
文件。
在 Ubuntu 20.04 中使用 systemd 实现 GPIO 上电(以 GPIO407 为例)
对于嵌入式 Linux 系统或开发板平台,我们常常需要在开机时自动设置 GPIO 引脚方向及电平。使用 systemd
编写自定义 .service
文件是一种推荐方式。
一、前提条件
-
你必须有 root 权限。
-
目标 GPIO(如 GPIO407)可通过
/sys/class/gpio/
接口操作。 -
Kernel 配置项开启了
CONFIG_GPIO_SYSFS
。
二、编写设置 GPIO 的脚本
1. 创建脚本文件
bash
复制编辑
sudo nano /usr/local/bin/gpio407_set_high.sh
2. 填写内容如下:
bash
复制编辑
#!/bin/bash GPIO=407 # Export GPIO if not already exported if [ ! -d "/sys/class/gpio/gpio$GPIO" ]; then echo $GPIO > /sys/class/gpio/export sleep 0.1 fi # 设置方向为输出,并拉高 echo out > /sys/class/gpio/gpio$GPIO/direction echo 1 > /sys/class/gpio/gpio$GPIO/value
3. 设置脚本权限
bash
复制编辑
sudo chmod +x /usr/local/bin/gpio407_set_high.sh
三、创建 systemd 服务文件
1. 创建服务文件
bash
复制编辑
sudo nano /etc/systemd/system/gpio407.service
2. 内容如下:
ini
复制编辑
[Unit] Description=Set GPIO407 High at boot After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/gpio407_set_high.sh RemainAfterExit=true [Install] WantedBy=multi-user.target
说明:
-
Type=oneshot
表示只执行一次,不常驻。 -
RemainAfterExit=true
保留“已启动”状态。 -
WantedBy=multi-user.target
表示在正常系统运行级别启动。
四、启用服务并重启
启用服务
bash
复制编辑
sudo systemctl enable gpio407.service
立即启动(测试)
bash
复制编辑
sudo systemctl start gpio407.service
查看状态
bash
复制编辑
sudo systemctl status gpio407.service
五、验证 GPIO 是否设置成功
bash
复制编辑
cat /sys/class/gpio/gpio407/value # 应该输出 1
六、卸载或禁用服务
如不再需要:
bash
复制编辑
sudo systemctl disable gpio407.service sudo rm /etc/systemd/system/gpio407.service sudo rm /usr/local/bin/gpio407_set_high.sh
七、与 init.d 的比较
项目 | init.d | systemd |
---|---|---|
兼容性 | 兼容但过时 | 推荐使用 |
并发支持 | 无 | 是 |
状态管理 | 简单 | 细致、支持依赖 |
日志 | 需手动 | 自动记录(journalctl ) |
八、结语
使用 systemd
管理 GPIO 初始化是一种现代、清晰、可靠的方式,特别适合在需要严格控制启动顺序、可靠运行的环境中。建议优先采用这种方式进行嵌入式系统自启动脚本部署。
如果你还需要同时配置多个 GPIO 或串口、电源等资源,也可以在脚本中统一处理,systemd 会一次完成初始化。