本溪市网站建设_网站建设公司_Java_seo优化
2026/1/22 8:29:37 网站建设 项目流程

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

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

今天这篇文章就是为了解决这个问题——让脚本在系统开机时自动运行。我们不讲虚的,直接上手实战。通过一个通用性强、适配度高的“开机启动脚本”方案,带你搞定从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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询