news 2026/2/4 18:15:09

Armbian开机自启脚本实战:从编写到启用完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Armbian开机自启脚本实战:从编写到启用完整流程

Armbian开机自启脚本实战:从编写到启用完整流程

1. 引言:为什么需要开机自启脚本?

你有没有遇到过这样的情况:每次重启Armbian设备后,都要手动运行一段命令来点亮LED、配置GPIO引脚,或者启动某个后台服务?重复操作不仅麻烦,还容易遗漏。

这时候,开机自启脚本就派上用场了。它能让你的系统在启动过程中自动执行指定任务,真正实现“一次配置,永久生效”。

本文将带你从零开始,完整走一遍在Armbian上创建并启用开机自启脚本的全流程。无论你是想控制硬件引脚、启动Python程序,还是运行自定义服务,这套方法都适用。

我们不会只讲理论,而是手把手演示:

  • 如何编写一个实际可用的启动脚本
  • 如何选择init.d还是systemd方式
  • 如何验证脚本是否成功运行
  • 常见问题排查技巧

读完这篇,你就能轻松让自己的脚本随系统启动而自动运行。


2. Armbian启动机制解析:systemd vs init.d

2.1 Armbian默认使用systemd

现代Armbian系统基于Debian或Ubuntu,其核心启动管理器是systemd,而不是传统的SysV init。

你可以通过以下命令确认:

ps -p 1 -o comm=

输出结果应该是:

systemd

这说明PID 1进程是systemd,也就是系统的“总指挥”。

2.2 init.d只是兼容层

虽然你还能在/etc/init.d/目录下放脚本,并用update-rc.d注册,但这些操作其实是由systemd通过兼容层来调度执行的。

换句话说:

systemd是导演,init.d脚本只是演员之一,真正的控制权在systemd手里。

2.3 两种方式对比

特性systemd(推荐)init.d(传统)
启动速度支持并行,更快顺序执行,较慢
日志管理内置journalctl需自行重定向
依赖控制支持After/Before等仅靠命名排序
状态监控可查状态、重启策略手动维护
维护性结构清晰,易管理脚本杂乱难追踪

结论:新项目建议优先使用systemd service方式,更稳定、可控、易调试。


3. 编写你的第一个开机脚本

3.1 场景设定:开机点亮LED灯

假设我们有一个连接在GPIO6上的LED灯,希望每次开机时自动点亮。

我们将分两步完成:

  1. 编写基础脚本
  2. 注册为开机服务

3.2 创建脚本文件

先创建一个可执行脚本文件:

sudo nano /usr/local/bin/gpio-init.sh

输入以下内容:

#!/bin/bash # 导出GPIO引脚 echo "6" > /sys/class/gpio/export 2>/dev/null || true echo "7" > /sys/class/gpio/export 2>/dev/null || true echo "8" > /sys/class/gpio/export 2>/dev/null || true # 设置方向 echo "out" > /sys/class/gpio/gpio6/direction echo "in" > /sys/class/gpio/gpio7/direction echo "out" > /sys/class/gpio/gpio8/direction # 设置初始值(点亮LED) echo "1" > /sys/class/gpio/gpio6/value # 清理资源示例(可选) # echo "6" > /sys/class/gpio/unexport

3.3 添加执行权限

保存后赋予执行权限:

sudo chmod +x /usr/local/bin/gpio-init.sh

3.4 手动测试脚本

在正式注册为开机服务前,先手动运行测试:

sudo /usr/local/bin/gpio-init.sh

如果LED成功点亮,说明脚本逻辑正确。

注意:部分GPIO可能已被占用或权限受限,建议添加2>/dev/null || true忽略非致命错误。


4. 使用systemd注册为开机服务(推荐方式)

4.1 创建service文件

systemd通过.service文件来管理服务。创建一个新的unit文件:

sudo nano /etc/systemd/system/gpio-init.service

填入以下内容:

[Unit] Description=GPIO Initialization Service After=multi-user.target # 如果依赖网络,可以加上 After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/gpio-init.sh RemainAfterExit=yes StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
参数解释:
  • Description: 服务描述,便于识别
  • After: 指定在哪个目标之后启动(multi-user.target表示基本系统就绪)
  • Type=oneshot: 表示该服务执行完即退出,适合初始化脚本
  • RemainAfterExit=yes: 即使脚本结束,也认为服务处于“激活”状态
  • StandardOutput/Error=journal: 输出日志可通过journalctl查看

4.2 启用服务

保存后执行以下命令:

# 重新加载systemd配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable gpio-init.service # 立即启动服务(无需重启) sudo systemctl start gpio-init.service

4.3 验证服务状态

检查服务是否正常运行:

systemctl status gpio-init.service

正常输出应包含:

● gpio-init.service - GPIO Initialization Service Loaded: loaded (/etc/systemd/system/gpio-init.service; enabled) Active: active (exited) since ...

5. 查看和管理所有开机启动项

5.1 查看已启用的systemd服务

列出所有开机自启的服务:

systemctl list-unit-files --type=service --state=enabled

你会看到类似输出:

ssh.service enabled cron.service enabled gpio-init.service enabled ...

5.2 查看当前正在运行的服务

systemctl --type=service --state=running

5.3 查看init.d兼容脚本(如有)

如果你之前使用过update-rc.d,可以用以下命令查看:

ls /etc/rc*.d/ | grep S

输出如:

S01gpio-init.sh S02cron

其中Sxx代表启动顺序。

5.4 查看完整的启动依赖树

了解系统启动时加载了哪些组件:

systemctl list-dependencies multi-user.target

6. 日志查看与故障排查

6.1 使用journalctl查看服务日志

这是systemd最强大的功能之一:

# 查看指定服务的日志 sudo journalctl -u gpio-init.service # 实时查看日志 sudo journalctl -u gpio-init.service -f # 查看最近10条记录 sudo journalctl -u gpio-init.service -n 10

如果脚本有echo输出,这里都能看到。

6.2 常见问题及解决方案

❌ 问题1:脚本没执行,LED未点亮

排查步骤:

  1. 检查服务是否启用:
    systemctl is-enabled gpio-init.service
  2. 检查服务状态:
    systemctl status gpio-init.service
  3. 查看日志是否有报错:
    journalctl -u gpio-init.service
❌ 问题2:提示“Permission denied”或“No such device”

可能是GPIO已被占用,或路径错误。尝试:

  • 更换GPIO编号测试
  • 在脚本中加入延迟(等待内核初始化完成):
    sleep 2
❌ 问题3:服务显示active但无效

确认Type=oneshotRemainAfterExit=yes是否同时设置,否则systemd可能认为服务失败。


7. 进阶技巧与最佳实践

7.1 添加启动延迟(应对硬件初始化慢)

某些设备需要时间初始化,可在service中添加:

[Service] Type=oneshot ExecStartPre=/bin/sleep 3 ExecStart=/usr/local/bin/gpio-init.sh ...

ExecStartPre会在主命令前执行,适合加延时。

7.2 自动重启机制(适用于守护进程)

如果是长期运行的服务,可设置自动重启:

[Service] Type=simple ExecStart=/usr/bin/python3 /home/pi/my_daemon.py Restart=always RestartSec=5

支持alwayson-failureno等策略。

7.3 多脚本统一管理

若需运行多个初始化脚本,建议:

  • 将所有脚本放在/opt/init-scripts/
  • 写一个主入口脚本调用它们
  • 注册一个总的service

例如:

#!/bin/bash # /opt/init-scripts/main-init.sh /opt/init-scripts/setup-gpio.sh /opt/init-scripts/mount-storage.sh /opt/init-scripts/start-monitor.sh

然后把这个主脚本注册为service。

7.4 安全建议

  • 脚本尽量放在/usr/local/bin//opt/,避免被误删
  • 不要在root家目录下存放关键脚本
  • 定期备份service文件
  • 使用chmod 644设置合理权限

8. 总结:掌握Armbian开机自启的核心要点

1. 核心认知升级

Armbian的启动体系本质是systemd为主导,init.d为兼容补充
直接使用systemd service才是现代、高效、可靠的方案。

2. 推荐标准流程

  1. 编写脚本 → 存放于/usr/local/bin/
  2. 添加可执行权限 →chmod +x
  3. 创建.service文件 → 放入/etc/systemd/system/
  4. 加载并启用服务 →daemon-reload+enable
  5. 测试验证 →start+status+journalctl

3. 关键优势回顾

  • 精准控制:可定义启动顺序、依赖关系
  • 日志完备:一键查看运行记录,快速排错
  • 状态可查:随时知道服务是否正常
  • 易于维护:结构清晰,团队协作友好

4. 下一步建议

  • 尝试将你的Python/Node.js应用注册为开机服务
  • systemctl disable <service>禁用不需要的服务以加快启动
  • 学习编写timer unit实现定时任务替代crontab

只要掌握了这一套方法,你就拥有了对Armbian系统启动过程的“掌控力”。无论是做智能家居中枢、工业控制器,还是边缘计算节点,都能游刃有余。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/4 6:48:29

Windows系统优化工具:5分钟彻底清理电脑冗余组件!

Windows系统优化工具&#xff1a;5分钟彻底清理电脑冗余组件&#xff01; 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以…

作者头像 李华
网站建设 2026/2/4 11:36:25

OpCore Simplify智能更新系统:让黑苹果始终保持最新状态

OpCore Simplify智能更新系统&#xff1a;让黑苹果始终保持最新状态 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore Simplify作为一款专为Hack…

作者头像 李华
网站建设 2026/2/4 7:44:44

fft npainting lama启动失败怎么办?常见问题全解析

fft npainting lama启动失败怎么办&#xff1f;常见问题全解析 1. 启动服务前的准备工作 在尝试解决启动失败的问题之前&#xff0c;我们需要先确认整个环境是否已经正确配置。很多“启动失败”其实源于基础准备不充分。下面是一些关键检查点。 1.1 确认镜像已正确部署 你使…

作者头像 李华
网站建设 2026/2/4 12:35:35

Zotero PDF翻译插件:学术研究的智能化助手

Zotero PDF翻译插件&#xff1a;学术研究的智能化助手 【免费下载链接】zotero-pdf2zh PDF2zh for Zotero | Zotero PDF中文翻译插件 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf2zh 在学术研究的道路上&#xff0c;面对海量的英文文献&#xff0c;研究者常…

作者头像 李华
网站建设 2026/2/4 10:01:58

零配置启动Qwen3-0.6B,Ollama让大模型触手可及

零配置启动Qwen3-0.6B&#xff0c;Ollama让大模型触手可及 你是否试过在没有GPU、没有复杂环境配置、甚至没有联网的情况下&#xff0c;让一个真正可用的大语言模型在自己电脑上跑起来&#xff1f;不是云服务&#xff0c;不是API调用&#xff0c;而是完完全全属于你本地的、可…

作者头像 李华