news 2026/5/6 1:09:05

超详细图文教程:在Armbian中添加自己的开机启动脚本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
超详细图文教程:在Armbian中添加自己的开机启动脚本

超详细图文教程:在Armbian中添加自己的开机启动脚本

1. 为什么需要自定义开机启动脚本?

在Armbian这类面向嵌入式设备的Linux发行版中,很多硬件初始化任务无法由系统默认服务完成。比如控制GPIO引脚点亮状态指示灯、配置I2C设备、挂载特殊存储介质、启动自定义监控程序等——这些操作必须在系统完全就绪后、用户登录前自动执行。

你可能已经试过把命令写进/etc/rc.local,却发现它有时不生效;也可能尝试过update-rc.d,却遇到服务启动顺序混乱、依赖失败的问题。根本原因在于:Armbian默认使用systemd作为init系统,而传统SysV init方式只是兼容层,并非原生支持

本教程将带你彻底理清Armbian的启动机制,并手把手教你用两种可靠方式添加开机脚本:一种是兼容性更强的/etc/rc.local方案(适合简单任务),另一种是推荐使用的systemd service方案(适合生产环境)。所有步骤均在真实Armbian 24.05(Debian Bookworm)和23.11(Ubuntu Jammy)镜像中验证通过。


2. 先确认你的Armbian启动模式

别急着写脚本,先确认系统底层到底用什么管理启动流程。这是后续所有操作的基础。

2.1 查看PID 1进程

打开终端,运行:

ps -p 1 -o comm=

如果输出是:

systemd

说明你正在使用标准的systemd启动体系——这是Armbian当前所有官方镜像的默认配置。

2.2 验证systemd是否接管了传统脚本

假设你已有一个/etc/init.d/gpio-init.sh脚本,运行:

systemctl status gpio-init.sh

你会看到类似输出:

● gpio-init.sh.service - LSB: GPIO initialization script Loaded: loaded (/etc/init.d/gpio-init.sh; generated) Active: active (exited) since Mon 2024-06-10 14:22:33 CST; 2min 15s ago Docs: man:systemd-sysv-generator(8) Process: 456 ExecStart=/etc/init.d/gpio-init.sh start (code=exited, status=0/SUCCESS)

注意Loaded: loaded (...; generated)这一行——它明确告诉你:systemd自动为这个init.d脚本生成了一个临时unit文件。也就是说,即使你写的是老式脚本,实际调度和日志管理仍由systemd完成


3. 方案一:使用/etc/rc.local(快速上手,适合调试)

这是最轻量、最易理解的方式,特别适合刚接触Armbian的用户或临时测试场景。它的优势是:无需创建新文件、语法简单、修改后立即生效。

3.1 检查rc.local是否存在并启用

Armbian默认可能未启用rc.local服务。先检查:

ls -l /etc/rc.local

如果提示No such file or directory,需手动创建:

sudo nano /etc/rc.local

输入以下内容(注意保留#!/bin/bashexit 0):

#!/bin/bash # 在这里添加你的启动命令 echo "Armbian startup script running at $(date)" > /var/log/rc-local.log echo "6" > /sys/class/gpio/export 2>/dev/null echo "out" > /sys/class/gpio/gpio6/direction 2>/dev/null echo "1" > /sys/class/gpio/gpio6/value 2>/dev/null exit 0

小贴士:2>/dev/null用于忽略GPIO已导出或权限错误的提示,避免脚本中断

3.2 设置执行权限并启用服务

sudo chmod +x /etc/rc.local sudo systemctl enable rc-local

注意:rc-local服务名是固定写法,不是rc.local。如果提示Failed to enable unit: Unit rc-local.service does not exist.,说明你的Armbian版本需要额外启用:

sudo systemctl unmask rc-local sudo systemctl enable rc-local

3.3 验证rc.local是否生效

重启系统:

sudo reboot

重启后检查日志:

sudo cat /var/log/rc-local.log

应看到类似:

Armbian startup script running at Mon Jun 10 14:45:22 CST 2024

同时观察GPIO6连接的LED是否点亮——这说明脚本已成功执行。


4. 方案二:创建systemd service(推荐,适合长期使用)

当你需要更精细的控制——比如指定启动时机、设置失败重试、查看结构化日志、定义服务依赖时,systemd service是唯一选择。它不是“高级功能”,而是Armbian现代启动体系的标准实践

4.1 创建可执行脚本文件

我们把实际逻辑封装成独立脚本,便于复用和调试:

sudo nano /usr/local/bin/my-startup.sh

内容如下(以点亮GPIO6为例,你可按需修改):

#!/bin/bash # 日志记录 LOG_FILE="/var/log/my-startup.log" echo "[$(date)] Starting my-startup script..." >> "$LOG_FILE" # 导出GPIO(忽略已存在错误) echo 6 > /sys/class/gpio/export 2>/dev/null sleep 0.1 # 设置方向为输出 echo out > /sys/class/gpio/gpio6/direction 2>/dev/null sleep 0.1 # 点亮LED echo 1 > /sys/class/gpio/gpio6/value 2>/dev/null echo "[$(date)] GPIO6 set to HIGH" >> "$LOG_FILE" # 可在此处添加更多初始化命令 # 例如:modprobe i2c-dev, mount /dev/sda1 /mnt/usb, etc. exit 0

4.2 设置脚本权限

sudo chmod +x /usr/local/bin/my-startup.sh

4.3 创建systemd服务单元文件

sudo nano /etc/systemd/system/my-startup.service

输入以下内容:

[Unit] Description=My Custom Startup Script Documentation=https://docs.armbian.com/ After=multi-user.target Wants=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/my-startup.sh RemainAfterExit=yes User=root StandardOutput=journal StandardError=journal SyslogIdentifier=my-startup [Install] WantedBy=multi-user.target

关键参数说明:

  • After=multi-user.target:确保在基础系统服务启动后再运行
  • Type=oneshot:表示这是一个只执行一次的脚本(非守护进程)
  • RemainAfterExit=yes:让systemd认为服务“仍在运行”,便于状态查询
  • StandardOutput=journal:将脚本输出自动写入journal日志,方便排查

4.4 启用并启动服务

# 重新加载systemd配置 sudo systemctl daemon-reload # 启用开机启动 sudo systemctl enable my-startup.service # 立即运行一次(不需重启) sudo systemctl start my-startup.service # 查看状态和日志 sudo systemctl status my-startup.service sudo journalctl -u my-startup.service -n 20 --no-pager

如果一切正常,status命令会显示active (exited),日志中能看到你定义的输出。


5. 常见问题与解决方案

实际部署中,你可能会遇到以下典型问题。我们逐个给出根因分析和解决方法。

5.1 脚本执行但GPIO无反应

现象systemctl status显示成功,但LED不亮
根因:GPIO节点在脚本执行时尚未创建(内核模块未加载)或权限不足
解决

  • 在service文件的[Unit]段添加Wants=sysfs.mountAfter=sysfs.mount
  • 或在脚本开头添加等待逻辑:
    while [ ! -d /sys/class/gpio/gpio6 ]; do echo "Waiting for GPIO6..." sleep 0.5 done

5.2 rc.local不执行,日志为空

现象/var/log/rc-local.log不存在或为空
根因rc-local服务未正确启用,或/etc/rc.local末尾缺少exit 0导致脚本提前退出
解决

  • 运行sudo systemctl status rc-local确认服务状态
  • 检查/etc/rc.local末尾是否为exit 0(必须是最后一行)

5.3 systemd服务启动失败,报“Permission denied”

现象journalctl中出现Permission denied错误
根因:脚本尝试访问需要root权限的设备节点,但service未声明User=root
解决:在[Service]段明确添加User=root(如上文示例所示)

5.4 如何让脚本在图形界面启动后运行?

需求:某些操作(如修改X11显示设置)需在桌面环境就绪后执行
方案:将After=改为graphical.target,并将WantedBy=改为graphical.target

[Unit] After=graphical.target [Install] WantedBy=graphical.target

6. 进阶技巧:让启动脚本更健壮

生产环境中,一个可靠的启动脚本不应只是“能跑”,更要“容错”和“可观测”。

6.1 添加超时保护

防止脚本卡死拖慢整个启动过程,在service文件中加入:

[Service] TimeoutStartSec=30

超过30秒未退出则强制终止。

6.2 实现失败自动重试

若初始化依赖网络或外部设备,可添加重试逻辑:

[Service] Restart=on-failure RestartSec=5 StartLimitIntervalSec=60 StartLimitBurst=3

表示:失败后5秒重试,1分钟内最多重试3次。

6.3 使用环境变量隔离配置

将硬件参数(如GPIO编号)抽离到独立配置文件,便于多设备复用:

# 创建配置 echo "LED_GPIO=6" | sudo tee /etc/my-startup.conf # 修改脚本读取配置 source /etc/my-startup.conf echo "$LED_GPIO" > /sys/class/gpio/export

7. 总结:选择哪种方案?

场景推荐方案理由
快速验证想法、临时调试/etc/rc.local修改即生效,无需重启systemd,学习成本最低
需要精确控制启动时机、依赖关系systemd service支持After=Requires=等语义化依赖,避免竞态条件
需查看结构化日志、集成监控systemd servicejournalctl提供时间戳、优先级、服务标识等完整上下文
部署到多台设备,需统一管理systemd service可通过Ansible等工具批量分发.service文件,标准化程度高

无论选择哪种方式,请牢记一个核心原则:在Armbian中,systemd不是可选项,而是事实标准。拥抱它,才能获得最佳稳定性和可维护性。

现在,你已经掌握了在Armbian中添加开机启动脚本的全部关键技能。下一步,可以尝试将本教程中的GPIO控制扩展为温度监控+LED告警,或结合USB摄像头实现开机自动录像——真正的嵌入式自动化,就从这一行启动脚本开始。

--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 15:05:37

Cowabunga Lite实用指南:打造专属iOS个性化体验

Cowabunga Lite实用指南:打造专属iOS个性化体验 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite Cowabunga Lite是一款专为iOS 15设计的非越狱定制工具,让你无需复杂操…

作者头像 李华
网站建设 2026/5/3 10:37:39

3大步骤精通驱动清理:专业指南与实战方案

3大步骤精通驱动清理:专业指南与实战方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 显卡驱动…

作者头像 李华
网站建设 2026/5/4 15:48:00

健康数据智能同步创新方案:告别手动记录的高效管理指南

健康数据智能同步创新方案:告别手动记录的高效管理指南 【免费下载链接】mimotion 小米运动刷步数(微信支付宝)支持邮箱登录 项目地址: https://gitcode.com/gh_mirrors/mimo/mimotion 在数字化健康管理日益普及的今天,许多…

作者头像 李华
网站建设 2026/5/1 10:24:31

BabelDOC完全攻略:解锁PDF文档翻译的7个实用技巧

BabelDOC完全攻略:解锁PDF文档翻译的7个实用技巧 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 在全球化协作与学术研究中,PDF文档翻译已成为科研人员与专业人士的必备…

作者头像 李华
网站建设 2026/5/6 0:00:50

Qwen-Image-Layered让非专业用户也能玩转图像编辑

Qwen-Image-Layered让非专业用户也能玩转图像编辑 【一键部署镜像】Qwen-Image-Layered Qwen-Image-Layered 是一款面向普通用户的智能图像分层编辑工具,无需PS基础、不需图层概念预习,上传一张图,自动拆解为可独立操作的RGBA图层——从此修…

作者头像 李华
网站建设 2026/4/25 10:23:49

2024开源AI绘画指南:NewBie-image-Exp0.1助力中小企业降本增效

2024开源AI绘画指南:NewBie-image-Exp0.1助力中小企业降本增效 你是否还在为动漫内容创作成本高、周期长而头疼?有没有一种方式,能让团队用极低的投入,快速产出高质量的二次元角色图?今天要介绍的 NewBie-image-Exp0.…

作者头像 李华