news 2026/6/15 15:07:41

从虚拟机到树莓派,测试开机脚本通吃多场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从虚拟机到树莓派,测试开机脚本通吃多场景

从虚拟机到树莓派,测试开机脚本通吃多场景

你有没有遇到过这样的情况:每次重启服务器或开发板,都要手动启动一堆服务?比如你的树莓派上跑着一个监控程序,或者虚拟机里部署了一个后台应用,结果一断电、一重启,全得重新登录上去一个个拉起来。不仅麻烦,还容易遗漏。

今天这篇文章就是为了解决这个问题——让脚本在系统开机时自动运行。我们不讲虚的,直接上手实战。通过一个通用性强、适配度高的“开机启动脚本”方案,带你搞定从Ubuntu 虚拟机树莓派4B的跨平台自启配置。

无论你是做嵌入式开发、自动化运维,还是搭建个人小项目,这套方法都能用得上。全程小白友好,代码可复制,步骤清晰,保证你照着做一遍就能成功。


1. 开机自启到底有什么用?

先别急着敲命令,咱们先搞清楚:为什么非得让系统自己启动程序?

想象这几个场景:

  • 你在树莓派上接了个摄像头做门禁识别,重启后发现程序没跑,门口的人进不来。
  • 你用虚拟机搭了个本地API服务,每次开机都要手动进终端执行python app.py
  • 家里的NAS设备重启了,下载任务、同步脚本全都停了,得人去点一下才恢复。

这些问题的本质,都是缺乏自动化

而开机自启的作用,就是让你的关键任务像“系统自带功能”一样,在每次开机时自动唤醒,无需人工干预。它带来的好处很实在:

  • 省时间:不用每次登录都手动启动服务
  • 提稳定性:避免因忘记启动导致服务中断
  • 真·无人值守:哪怕远程设备断电重启,也能自己恢复正常工作

接下来我们就用最实用的方式,把这件事干成。


2. Linux常见的开机自启方式对比

Linux下实现开机自启的方法不止一种,各有适用场景。我们挑三种最常用、兼容性最好的来分析:

2.1 rc.local 方案(推荐新手)

这是最经典也最直观的方式。/etc/rc.local是一个脚本文件,系统在完成基本初始化后会自动执行它里面的内容。

优点

  • 写法简单,就是个 Shell 脚本
  • 执行时机晚,网络、文件系统等都已经准备好了
  • 兼容老版本和新版本 Ubuntu、Debian、树莓派OS等

缺点

  • Ubuntu 16.04 之后默认不再启用该服务
  • 需要手动激活 systemd 中的rc-local.service

适合人群:刚接触 Linux 自启机制的新手,尤其是使用树莓派或老旧系统的用户。


2.2 systemd 服务方案(现代标准)

systemd 是目前主流 Linux 发行版的初始化系统,几乎所有新系统都基于它管理服务。

你可以创建一个.service文件,定义你的程序如何启动、何时启动、失败是否重试等。

优点

  • 功能强大,支持日志追踪、依赖控制、自动重启
  • 系统级管理,权限高、稳定性好
  • 支持开机即运行,不依赖用户登录

缺点

  • 配置稍复杂,需要写 service 文件
  • 对初学者有一定门槛

适合人群:有一定 Linux 基础,追求稳定性和专业性的开发者。


2.3 init.d 脚本方案(已逐渐淘汰)

这是更早期的 SysVinit 启动方式,通过/etc/init.d/目录下的脚本配合update-rc.d来注册服务。

现状

  • 在基于 systemd 的系统中已被取代
  • 维护成本高,语法繁琐
  • 不建议新项目使用

结论:除非维护旧系统,否则跳过。


3. 实战一:Ubuntu虚拟机中的开机自启配置

我们以最常见的 Ubuntu 18.04 虚拟机为例,演示如何恢复并启用rc.local实现开机脚本运行。

3.1 检查是否存在 rc-local.service

首先确认系统是否保留了这个服务单元:

ls /lib/systemd/system | grep rc-local

如果看到输出rc-local.service,说明文件存在,可以继续。

如果没有,可能需要手动创建(一般不会出现)。


3.2 修改 rc-local.service 文件

Ubuntu 18.04 默认的rc-local.service缺少[Install]段,导致无法启用。我们需要补上。

先修改权限以便编辑:

sudo chmod 777 /lib/systemd/system/rc-local.service

然后打开编辑:

sudo vim /lib/systemd/system/rc-local.service

确保内容包含以下关键部分:

[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target Alias=rc-local.service

重点是[Install]段中的WantedBy=multi-user.target,这决定了它会在多用户模式下启动。


3.3 创建 /etc/rc.local 脚本

检查是否存在该文件:

sudo touch /etc/rc.local sudo chmod 777 /etc/rc.local sudo vim /etc/rc.local

写入如下内容作为测试:

#!/bin/bash # 开机自启测试脚本 echo "System boot time: $(date)" >> /home/ubuntu/boot.log echo "Hostname: $(hostname)" >> /home/ubuntu/boot.log exit 0

注意:

  • 最后一定要有exit 0,否则系统可能会卡住
  • 如果执行的是长期运行的程序(如 Python 服务),记得加&放入后台,例如:python3 /path/to/app.py &

保存退出。


3.4 建立软链接并启用服务

有些系统需要将服务文件链接到系统目录:

sudo ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

然后启用并启动服务:

sudo systemctl enable rc-local sudo systemctl start rc-local

查看状态验证是否成功:

sudo systemctl status rc-local

如果显示active (exited),说明已正常运行。


3.5 验证效果

重启系统:

sudo reboot

再次登录后检查/home/ubuntu/boot.log是否生成,并且内容包含时间和主机名:

cat /home/ubuntu/boot.log

你应该能看到类似:

System boot time: Mon Apr 5 10:23:15 CST 2025 Hostname: ubuntu-virtual-machine

这就证明你的脚本已经成功在每次开机时自动执行!


4. 实战二:树莓派4B上的开机播报脚本

现在我们换到真实硬件环境——树莓派4B,来做一个更有意思的例子:系统启动时用语音播报欢迎语

这个案例不仅能验证自启功能,还能展示实际应用场景。

4.1 安装 espeak 语音合成工具

espeak 是一个轻量级的文本转语音工具,非常适合树莓派这类资源有限的设备。

安装命令:

sudo apt-get update sudo apt-get install espeak -y

测试语音是否正常:

espeak "Hello, this is Raspberry Pi"

如果你接了扬声器或耳机,应该能听到声音。


4.2 编写 Python 播报脚本

进入家目录,创建脚本:

cd /home/pi nano speak_on_boot.py

输入以下代码:

#!/usr/bin/env python import subprocess # 要播报的内容 message = "Welcome to the world of Raspberry Pi" # 调用 espeak 播放 subprocess.call(['espeak "{}" 2>/dev/null'.format(message)], shell=True)

保存并赋予可执行权限:

chmod +x speak_on_boot.py

手动运行测试:

python speak_on_boot.py

听到播报即表示脚本无误。


4.3 配置 rc.local 实现自启

树莓派官方系统(Raspberry Pi OS)默认仍支持rc.local,非常方便。

编辑文件:

sudo nano /etc/rc.local

exit 0之前添加一行:

python /home/pi/speak_on_boot.py &

完整示例:

#!/bin/sh -e # # rc.local # # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP is %s\n" "$_IP" fi # 添加我们的语音脚本 python /home/pi/speak_on_boot.py & exit 0

注意事项:

  • &是为了让脚本后台运行,防止阻塞系统启动
  • 不要用绝对路径调用python3,除非确定环境变量已加载(建议用python或完整路径/usr/bin/python

4.4 重启验证语音播报

保存后重启树莓派:

sudo reboot

等待几秒,你应该会听到清晰的英文播报:“Welcome to the world of Raspberry Pi”。

成功!这意味着你的树莓派现在已经具备“智能开机”能力。


5. 常见问题与避坑指南

虽然整体流程不难,但实际操作中很容易踩一些“隐形坑”。以下是高频问题汇总:

5.1 系统卡在启动界面

原因:脚本没有放入后台,或缺少exit 0

解决办法:

  • 所有长时间运行的命令后面加&
  • 确保/etc/rc.local最后一行是exit 0
  • 避免在脚本中使用交互式命令(如read

5.2 脚本路径写错或权限不足

常见错误写法:

python myscript.py

如果当前路径不是脚本所在目录,就会失败。

正确做法:使用绝对路径

python /home/pi/myscript.py &

同时确保脚本有执行权限:

chmod +x /home/pi/myscript.py

5.3 依赖服务未就绪(如网络、GPIO)

比如你想在开机时上传数据到服务器,但网络还没连上,程序直接报错退出。

推荐做法:加延时或检测机制

sleep 10 python /home/pi/upload_data.py &

或者更优雅地判断网络是否可用:

while ! ping -c1 google.com &>/dev/null; do sleep 1 done python /home/pi/sync_to_cloud.py &

5.4 树莓派音频输出选择错误

如果你听不到声音,可能是音频输出走的是 HDMI 而不是 3.5mm 耳机口。

设置音频输出:

sudo raspi-config

选择System Options > Audio,然后指定输出设备。


6. 总结:一套脚本能跑遍虚拟机和树莓派吗?

答案是:完全可以!只要遵循几个原则

关键点说明
使用rc.local兼容性强,适用于大多数 Debian 系发行版
绝对路径避免因工作目录不同导致脚本找不到
后台运行所有长任务加&,防止阻塞启动
错误重定向可加上> /tmp/startup.log 2>&1记录日志
权限设置确保脚本和服务都有执行权限

这样一套配置下来,无论是你在 VMware 里的 Ubuntu 虚拟机,还是插着屏幕的树莓派4B,都可以用几乎相同的脚本实现开机自启。


获取更多AI镜像

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

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

GPT-OSS-20B游戏NPC对话:实时生成部署方案

GPT-OSS-20B游戏NPC对话:实时生成部署方案 你是否曾幻想过,游戏里的NPC不仅能听懂你的每一句话,还能像真人一样自然回应?现在,借助GPT-OSS-20B模型和vLLM推理框架,这个设想已经可以轻松实现。本文将带你一…

作者头像 李华
网站建设 2026/6/15 11:25:32

亲测AutoGen Studio:用Qwen3-4B构建智能客服实战分享

亲测AutoGen Studio:用Qwen3-4B构建智能客服实战分享 1. 引言:为什么选择AutoGen Studio Qwen3-4B做智能客服? 你有没有遇到过这样的问题:客户咨询量大,人工客服响应慢、成本高,而市面上的通用客服机器人…

作者头像 李华
网站建设 2026/6/15 11:20:46

如何用Qwen2.5做代码生成?0.5B模型Python调用详细步骤

如何用Qwen2.5做代码生成?0.5B模型Python调用详细步骤 1. 为什么选择Qwen2.5-0.5B做代码生成? 你是不是也遇到过这样的场景:写个脚本卡在某个函数上,查文档太慢,搜答案又一堆不相关的?或者只是想快速生成…

作者头像 李华
网站建设 2026/6/15 11:01:10

零基础玩转Qwen All-in-One:情感分析与智能对话一键搞定

零基础玩转Qwen All-in-One:情感分析与智能对话一键搞定 1. 为什么你需要一个“全能型”AI小助手? 你有没有遇到过这样的场景: 想做个情感分析工具,结果发现要装BERT、RoBERTa、Tokenizer一堆模型; 刚部署好&#xf…

作者头像 李华
网站建设 2026/6/15 12:01:45

通义千问3-14B流式输出问题解决:避坑指南分享

通义千问3-14B流式输出问题解决:避坑指南分享 你是不是也遇到过这种情况?明明在本地部署了通义千问3-14B模型,API接口也启用了流式输出(streaming),但前端收到的响应却像“洪水般一次性涌来”,…

作者头像 李华
网站建设 2026/6/15 12:05:06

一键启动!CAM++说话人验证系统开箱即用体验

一键启动!CAM说话人验证系统开箱即用体验 1. 快速上手:从零开始运行 CAM 说话人识别系统 你是否曾为如何快速判断两段语音是否来自同一个人而烦恼?现在,一个名为 CAM 的说话人识别系统镜像已经准备好,只需一键部署&a…

作者头像 李华