news 2026/2/16 17:35:05

一文搞懂Ubuntu开机启动原理+实操配置全过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文搞懂Ubuntu开机启动原理+实操配置全过程

一文搞懂Ubuntu开机启动原理+实操配置全过程

1. 开机启动机制的核心逻辑与常见误区

你有没有遇到过这样的情况:写好了一个服务脚本,信心满满地设置成开机自启,结果重启后发现根本没运行?或者明明在rc.local里加了命令,系统却像没看见一样?

这背后其实不是“Ubuntu不听话”,而是我们对它的启动流程和依赖机制理解不够深入。很多教程只告诉你“把脚本放哪、怎么加权限”,却不解释“为什么必须这样”。一旦环境稍有变化——比如网络还没就绪、目录未挂载、权限不足——脚本就会失败。

本文将带你从底层理清 Ubuntu 的开机启动机制,并通过真实可操作的案例,手把手教你完成一个稳定可靠的开机启动脚本配置全过程。无论你是想让某个 Python 程序自动跑起来,还是希望某个监控脚本随系统启动,这套方法都适用。

2. Ubuntu 启动流程简析:init、runlevel 与 systemd 的关系

2.1 传统 SysVinit 机制的基本概念

虽然现代 Ubuntu 已经全面转向systemd,但为了兼容旧脚本,它仍然支持传统的SysVinit 风格的启动方式。这也是为什么你在/etc/init.d/目录下还能看到大量脚本的原因。

在这种模式下,系统的启动过程是按“运行级别(runlevel)”来组织的:

Runlevel说明
0关机
1单用户模式(维护)
2-5多用户模式(带图形界面或无图形)
6重启

其中,Default-Start: 2 3 4 5表示该服务在这些运行级别下都应该启动。

2.2 update-rc.d 到底做了什么?

当你执行:

sudo update-rc.d myscript defaults 96

系统会在/etc/rc?.d/目录下创建一系列符号链接,例如:

/etc/rc0.d/K96myscript → ../init.d/myscript /etc/rc1.d/K96myscript → ../init.d/myscript /etc/rc2.d/S96myscript → ../init.d/myscript ...
  • Sxx:表示 Start,数字代表执行顺序(越小越早)
  • Kxx:表示 Kill(停止),用于关机时关闭服务

所以96是一个较高的启动序号,意味着它会在大多数基础服务之后才启动,适合那些需要网络、文件系统等资源准备就绪的任务。

3. 方法一:使用 /etc/init.d 创建标准启动脚本(推荐)

这是最经典、兼容性最好的方式,尤其适用于没有桌面环境的服务器场景。

3.1 编写可执行的启动脚本

首先,在家目录下创建你的启动脚本:

cd ~ nano startup-test.sh

输入以下内容:

#!/bin/sh ### BEGIN INIT INFO # Provides: startup-test # Required-start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Test custom startup script # Description: Runs a simple test script at boot time ### END INIT INFO # 实际要执行的操作 echo "[$(date)] Startup script is running..." >> /var/log/startup-test.log # 示例:检查某个目录是否存在并运行程序 if [ -f "/home/ubuntu/myapp/start.sh" ]; then cd /home/ubuntu/myapp ./start.sh & fi exit 0

关键点说明

  • #!/bin/sh:指定解释器
  • ### BEGIN INIT INFO块:这是update-rc.d识别元信息的关键,不能省略
  • Required-start:声明依赖的服务,确保在网络和日志准备好后再运行
  • 日志输出到/var/log/:便于排查问题

保存退出后,赋予可执行权限:

chmod +x startup-test.sh

3.2 移动脚本到系统目录并注册为开机任务

sudo cp startup-test.sh /etc/init.d/ sudo chmod 755 /etc/init.d/startup-test.sh sudo update-rc.d startup-test.sh defaults 95

此时你可以查看/etc/rc2.d/是否生成了对应的软链:

ls -l /etc/rc2.d/S* | grep startup

你应该能看到类似:

S95startup-test.sh -> ../init.d/startup-test.sh

3.3 测试与验证

不要等到重启才确认效果!先手动测试脚本是否能正常运行:

sudo /etc/init.d/startup-test.sh start

然后检查日志:

cat /var/log/startup-test.log

如果一切正常,再进行最终验证:

sudo reboot

重启后登录系统,再次查看日志文件,确认时间戳是否包含本次启动的时间。

3.4 如何卸载开机启动项

如果你不再需要这个脚本,可以这样移除:

sudo update-rc.d -f startup-test.sh remove

这条命令会自动删除所有相关的软链接。注意-f是强制删除的意思。

如果你想保留脚本文件但取消注册,这就是正确做法。

4. 方法二:利用 rc.local 实现简易启动(适合简单任务)

对于只需要执行几条命令的小需求,rc.local是最快捷的方式。

4.1 检查 rc.local 是否可用

现代 Ubuntu 中,rc.local默认可能被禁用。你需要先启用它。

编辑/etc/systemd/system/rc-local.service

sudo nano /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

4.2 创建并配置 rc.local 文件

sudo nano /etc/rc.local

写入:

#!/bin/bash # 注意:这里必须以 #!/bin/bash 开头,否则某些命令不生效 # 添加你的命令 echo "RC.Local executed at $(date)" >> /var/log/rc-local-test.log # 示例:启动后台进程 if [ -f "/home/ubuntu/simple-service.sh" ]; then su - ubuntu -c "nohup /home/ubuntu/simple-service.sh > /dev/null 2>&1 &" fi exit 0

赋予权限:

sudo chmod +x /etc/rc.local

4.3 启用 rc-local 服务

sudo systemctl enable rc-local.service sudo systemctl start rc-local.service

查看状态:

sudo systemctl status rc-local.service

如果显示active (exited),说明成功执行;如果有错误,请用journalctl -u rc-local.service查看详细日志。

5. 方法三:桌面环境下用户级自启动(GUI 场景专用)

如果你使用的是带图形界面的 Ubuntu 桌面版,还可以通过“启动应用程序”来实现用户登录后的自动运行。

5.1 手动添加图形化启动项

打开“启动应用程序”工具(Startup Applications),点击“添加”:

  • 名称:Test Auto Start
  • 命令:gnome-terminal -- bash -c '/home/ubuntu/run_gui_app.sh; exec bash'
  • 注释:测试桌面自启脚本

这种方式会在每次用户登录时弹出终端并运行脚本。

5.2 直接编辑 autostart 配置文件

更规范的做法是创建.desktop文件:

mkdir -p ~/.config/autostart nano ~/.config/autostart/myapp.desktop

内容如下:

[Desktop Entry] Type=Application Name=My Background Service Exec=/home/ubuntu/run_gui_app.sh Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true

保存后,下次登录就会自动运行。

⚠️ 注意:这种方法仅在用户登录后触发,不适合服务器后台服务。

6. 方法四:使用 systemd 服务(现代推荐方式)

尽管前面的方法都能工作,但从长远来看,使用 systemd 服务才是最佳实践

6.1 创建自定义 service 文件

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

内容示例:

[Unit] Description=Custom Startup Script After=network.target syslog.target [Service] Type=simple User=ubuntu WorkingDirectory=/home/ubuntu ExecStart=/home/ubuntu/startup-task.sh Restart=on-failure StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

6.2 编写实际执行脚本

nano ~/startup-task.sh
#!/bin/bash echo "[$(date)] Systemd service started successfully." >> /home/ubuntu/service.log # 这里放你要运行的命令

赋权:

chmod +x ~/startup-task.sh

6.3 启用并测试服务

sudo systemctl daemon-reload sudo systemctl enable my-startup.service sudo systemctl start my-startup.service

查看日志:

journalctl -u my-startup.service -f

你会发现这种方式日志清晰、管理方便、依赖明确,远胜传统方法。

7. 常见问题排查与最佳实践建议

7.1 脚本没执行?先查这几点

  1. 权限问题:确保脚本有可执行权限(chmod +x
  2. 路径问题:避免使用相对路径,尽量用绝对路径
  3. 环境变量缺失/etc/init.drc.local下运行时环境变量有限,必要时显式 source
  4. 依赖未就绪:如需联网,确保After=network.target或等待网络可用
  5. 日志缺失:务必添加日志输出,否则无法定位问题

7.2 推荐的最佳实践

  • ✅ 使用systemd替代老旧方式(长期维护首选)
  • ✅ 所有脚本输出日志到/var/log/journalctl
  • ✅ 避免在脚本中硬编码密码(如必须,考虑使用密钥或凭证管理)
  • ✅ 先手动测试脚本,再设为开机启动
  • ✅ 使用Required-start明确依赖关系(SysVinit 方式)
  • ✅ 定期清理不再使用的启动项

获取更多AI镜像

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

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

Czkawka终极指南:专业级重复文件清理与存储优化方案

Czkawka终极指南:专业级重复文件清理与存储优化方案 【免费下载链接】czkawka 一款跨平台的重复文件查找工具,可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点,帮助用户释放存储空间。 项目地址: https://gitco…

作者头像 李华
网站建设 2026/2/14 9:51:52

GPEN与GFPGAN性能对比:人脸修复清晰度+推理速度全面评测

GPEN与GFPGAN性能对比:人脸修复清晰度推理速度全面评测 1. 为什么需要对比GPEN和GFPGAN? 你是不是也遇到过这样的问题:老照片发黄模糊、手机自拍带噪点、视频截图脸糊成马赛克?市面上人脸修复工具不少,但真正用起来才…

作者头像 李华
网站建设 2026/2/5 17:17:12

金融AI预测实战:从零开始构建你的智能投资助手

金融AI预测实战:从零开始构建你的智能投资助手 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 在当今瞬息万变的金融市场中,金融AI…

作者头像 李华
网站建设 2026/2/16 7:57:54

RevokeMsgPatcher防撤回终极指南:5分钟学会保护重要信息

RevokeMsgPatcher防撤回终极指南:5分钟学会保护重要信息 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/2/12 23:05:49

Playnite游戏库管理器:免费整合所有平台的终极指南

Playnite游戏库管理器:免费整合所有平台的终极指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: https:…

作者头像 李华
网站建设 2026/2/8 4:52:54

Zotero文献管理终极指南:用Style插件打造高效阅读系统

Zotero文献管理终极指南:用Style插件打造高效阅读系统 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址:…

作者头像 李华