news 2026/4/18 7:54:05

Ubuntu开机启动不再难,一文教会你全部步骤

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu开机启动不再难,一文教会你全部步骤

Ubuntu开机启动不再难,一文教会你全部步骤

1. 引言

1.1 业务场景描述

在实际的服务器运维和嵌入式设备管理中,经常需要让某些脚本或程序在系统启动时自动运行。例如:启动监控服务、初始化环境变量、运行Python数据采集脚本等。Ubuntu 18.04 及之后版本基于 systemd 架构,传统的/etc/rc.local开机启动方式默认已被弃用,这让许多习惯于旧版 Ubuntu 的开发者感到困扰。

1.2 痛点分析

Ubuntu 14.04 时代可以通过简单编辑/etc/rc.local文件实现开机自启,但从 16.04 开始逐步过渡到 systemd 后,该文件不再生效。直接修改 systemd 配置又显得复杂,学习成本高。如何在保持简洁性的同时兼容传统习惯,成为一大痛点。

1.3 方案预告

本文将详细介绍如何在 Ubuntu 18.04+ 系统中重新启用/etc/rc.local,并通过它来执行任意自定义脚本(如 Shell 脚本、Python 程序等),实现灵活、稳定、可调试的开机启动机制。整个过程无需深入理解 systemd 复杂语法,适合初级到中级用户快速上手。


2. 技术方案选型与原理说明

2.1 为什么不能直接使用 rc.local?

Ubuntu 从 16.04 起全面采用systemd作为初始化系统(init system),而rc.local是 System V init 时代的遗留机制。虽然系统仍保留了/etc/rc.local文件路径,但默认没有对应的 service 单元去调用它,因此不会被执行。

2.2 解决思路:创建兼容性服务单元

我们通过手动创建一个名为rc-local.service的 systemd 服务单元文件,告诉系统:“当进入多用户模式时,请执行/etc/rc.local start”。这样既复用了熟悉的rc.local接口,又符合 modern Linux 的启动规范。

2.3 核心优势

  • ✅ 兼容性强:适用于 Ubuntu 18.04、20.04、22.04 等主流 LTS 版本
  • ✅ 操作简单:只需配置一次 service 文件,后续只需修改rc.local
  • ✅ 易于调试:可通过systemctl status查看执行状态和错误日志
  • ✅ 安全可控:遵循 systemd 权限模型,避免权限越界问题

3. 实现步骤详解

3.1 创建 rc-local.service 文件

首先,我们需要为 systemd 添加一个服务单元,使其识别并加载rc.local

sudo vim /etc/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
参数解析:
  • ConditionPathExists:仅当/etc/rc.local存在时才启动此服务
  • Type=forking:表示服务会 fork 子进程后退出主进程(符合 rc.local 行为)
  • RemainAfterExit=yes:即使主进程退出,也认为服务仍在运行
  • WantedBy=multi-user.target:在多用户文本界面启动时激活

3.2 创建并配置 /etc/rc.local 文件

接下来创建实际要执行的脚本文件:

sudo vim /etc/rc.local

输入以下内容:

#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. echo "看到这行字,说明添加自启动脚本成功。" > /usr/local/test.log exit 0

注意:最后一行必须是exit 0,否则 systemd 会认为脚本执行失败。


3.3 设置权限并启用服务

赋予rc.local可执行权限:

sudo chmod +x /etc/rc.local

启用服务(开机自动启动):

sudo systemctl enable rc-local

输出示例:

Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /etc/systemd/system/rc-local.service.

3.4 启动服务并检查状态

立即启动服务进行测试:

sudo systemctl start rc-local.service

查看服务状态:

sudo systemctl status rc-local.service

正常输出应包含:

active (exited) since ...

如果出现failed,请使用以下命令排查日志:

journalctl -u rc-local.service --since "5 minutes ago"

3.5 验证日志输出

重启系统或等待服务执行完成后,检查日志文件是否生成:

cat /usr/local/test.log

预期输出:

看到这行字,说明添加自启动脚本成功。

若能看到该内容,则表明rc.local已成功运行。


4. 扩展应用:启动自定义脚本

4.1 设计思路

建议不要将所有逻辑写入/etc/rc.local,而是将其作为“启动入口”,用于调用外部脚本。这样更便于维护和权限隔离。

4.2 创建自定义 Shell 脚本

创建测试脚本:

sudo vim /opt/test.sh

内容如下:

#!/bin/bash cd /home/ubuntu/ python3 /home/ubuntu/ce.py exit 0

赋予执行权限:

sudo chmod +x /opt/test.sh

4.3 创建 Python 测试程序

创建 Python 脚本用于验证执行:

vim ~/ce.py

内容如下:

with open("/home/ubuntu/sb.txt", "w") as f: f.write("SB")

4.4 修改 rc.local 调用外部脚本

编辑/etc/rc.local,替换原有echo行:

sudo vim /etc/rc.local

修改为:

#!/bin/sh -e # 调用外部脚本 /opt/test.sh exit 0

保存后重新启动服务:

sudo systemctl restart rc-local.service

检查是否生成sb.txt

cat /home/ubuntu/sb.txt

预期输出:

SB

5. 常见问题与优化建议

5.1 常见问题及解决方案

问题现象原因分析解决方法
rc-local.service failed/etc/rc.local缺少执行权限运行sudo chmod +x /etc/rc.local
日志文件未生成脚本路径错误或目录不存在检查路径是否存在,建议使用绝对路径
Python 脚本报错编码异常文件包含中文字符或编码不匹配使用 UTF-8 编码保存,避免中文注释
No such file or directory调用的脚本无执行权限或解释器路径错误确保脚本有+x权限,并指定完整解释器路径(如/usr/bin/python3

5.2 最佳实践建议

  1. 统一使用绝对路径
    所有脚本、文件、命令都应使用绝对路径,避免因工作目录不同导致失败。

示例:bash /usr/bin/python3 /home/user/app.py

  1. 添加日志记录便于调试
    在关键步骤写入时间戳日志,方便定位问题。

bash echo "$(date): 自定义脚本开始执行" >> /var/log/boot.log

  1. 避免阻塞启动流程
    若脚本运行时间较长,建议后台运行或加&放入后台:

bash /opt/long-running-script.sh &

  1. 定期清理临时日志
    可配合logrotate或定时任务清理/var/log/boot.log等启动日志。

6. 总结

6.1 实践经验总结

本文详细演示了如何在现代 Ubuntu 系统中恢复并利用/etc/rc.local实现开机启动功能。通过创建rc-local.service服务单元,我们成功桥接了传统习惯与现代 systemd 架构之间的鸿沟。整个过程只需六步即可完成,且具备良好的可维护性和扩展性。

核心要点回顾: - 必须创建rc-local.service并启用 -/etc/rc.local必须有可执行权限且以exit 0结尾 - 推荐通过rc.local调用外部脚本而非直接写逻辑 - 出现问题优先使用systemctl statusjournalctl排查

6.2 最佳实践建议

  1. rc.local视为“启动调度器”,集中管理多个自启动任务
  2. 所有脚本使用绝对路径,避免相对路径引发的问题
  3. 关键操作添加日志输出,提升可观察性

获取更多AI镜像

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

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

如何在macOS上快速制作Windows启动盘:WinDiskWriter终极指南

如何在macOS上快速制作Windows启动盘:WinDiskWriter终极指南 【免费下载链接】windiskwriter 🖥 A macOS app that creates bootable USB drives for Windows. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. 项目地址…

作者头像 李华
网站建设 2026/3/28 5:46:15

纯净音乐深度体验:零干扰免费听歌全攻略

纯净音乐深度体验:零干扰免费听歌全攻略 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特!(密码重置功能已回归) 项目地址: https://gitcode.com/GitHub_Trending/to/tonzhon…

作者头像 李华
网站建设 2026/4/14 20:40:00

DeepSeek-R1-Distill-Qwen-1.5B如何高效部署?GPU利用率优化指南

DeepSeek-R1-Distill-Qwen-1.5B如何高效部署?GPU利用率优化指南 1. 引言:为何选择DeepSeek-R1-Distill-Qwen-1.5B进行推理服务部署? 随着大模型在数学推理、代码生成和逻辑推导等复杂任务中的表现日益突出,轻量级高性能推理模型…

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

【多线程理论基础】

多线程理论基础 1. 多线程的出现是要解决什么问题? 多线程的核心目标是提升程序效率和资源利用率,主要解决三类场景的痛点: CPU利用率问题:对于CPU密集型任务(如计算、排序),多线程可以让多核CP…

作者头像 李华
网站建设 2026/4/18 5:32:56

什么是融合调度

文章目录融合调度是如何产生的MU-MIMO预调度是如何工作的OFDMA调度是如何工作的融合调度是在空口下行采用MU-MIMO预调度,空口上行对TCP Ack短报文采用OFDMA调度,从而提升空口的上下行传输效率。空口融合调度主要用于高密场景下的多用户并发业务。 融合调…

作者头像 李华
网站建设 2026/4/16 0:51:25

通义千问3-Embedding-4B省钱部署方案:GGUF-Q4压缩+按需计费GPU实战

通义千问3-Embedding-4B省钱部署方案:GGUF-Q4压缩按需计费GPU实战 1. 引言 1.1 业务场景描述 在构建企业级知识库、语义搜索系统或长文档去重平台时,高质量的文本向量化模型是核心基础设施。然而,传统大模型部署成本高、显存占用大&#x…

作者头像 李华