Administrator
Published on 2025-11-12 / 119 Visits
0
0

《你忽略的 Linux 灵魂文件:rc.local,其实是系统的“秘密开关”》

How to enable rc.local shell script on systemd on Linux at boot - nixCraft


在 Linux 世界里,有一些“老而弥坚”的配置文件,哪怕在 systemd 横行的今天,它依然默默在很多系统中起作用。
今天我们要聊的,就是那个几乎每个资深运维都遇到过的文件——
/etc/rc.local

如果你刚接触 Linux,这可能只是个陌生的名字;
但如果你懂它,你就能掌控系统启动后的“隐秘自动化”。


一、什么是 rc.local?

rc.local 的全称是 “Run Commands Local”,它的功能非常直接:

在系统启动完成后,自动执行你写在其中的命令。

换句话说——
这是 Linux 启动阶段最后一个“自由入口”。
只要写在里面的命令没错,它会在开机时自动运行,不需要手动执行,不需要开服务。

📜 典型路径如下:

/etc/rc.local
或
/etc/rc.d/rc.local

ラズパイ起動時にrc.localによる自動実行ができなくなった時の対処法 - れすたぴは死んでしまった

二、一个最简单的 rc.local 示例

打开文件(部分系统需自行创建):

sudo vim /etc/rc.local

添加内容:

#!/bin/bash
# rc.local 示例

# 启动自定义脚本
bash /usr/local/bin/start_my_app.sh &

# 挂载网络磁盘
mount -t nfs 192.168.1.10:/data /mnt/data

# 启动Docker容器
docker start halo_blog

# 输出日志
echo "rc.local executed at $(date)" >> /var/log/rc.local.log

exit 0

保存后赋予执行权限:

sudo chmod +x /etc/rc.local

重启系统:

sudo reboot

然后,你的程序、脚本、容器、挂载……都会在系统启动后自动运行!
是不是有点像 Windows 里的“启动项”?


三、为什么有的系统没有 rc.local?

在 System V(SysVinit) 时代,rc.local 是“启动命令终点”。
但在现代 systemd 体系下,启动流程发生了变化。
有的发行版(比如 Ubuntu 22.04、CentOS 8、Kylin V10 SP3)默认不再启用 rc.local 服务。

不过——
只要我们愿意,它仍然可以复活。


四、在 systemd 中启用 rc.local

1️⃣ 创建 rc-local.service

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

写入以下内容:

[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

[Install]
WantedBy=multi-user.target

2️⃣ 赋予 rc.local 可执行权限

sudo chmod +x /etc/rc.local

3️⃣ 启动并设置开机自启

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

4️⃣ 验证状态

systemctl status rc-local

当看到 “active (exited)” 时,说明运行成功!


五、为什么很多人仍然喜欢用 rc.local?

场景

优点

快速部署

一行命令搞定,开机自动执行

不依赖 systemd

适合兼容旧系统或轻量系统

临时自启动脚本

不想写复杂 unit 文件时非常方便

调试实验

便于快速验证自启动脚本效果

相比写一个复杂的 .service 文件,rc.local 更像是“系统开机的万能笔记本”——
你想到什么、想让系统自动干什么,都能丢进去。


rc.local missing in Debian 8 Jessie and Debian 9 Stretch and newer Ubuntu  16, Fedora, CentOS Linux - Why is /etc/rc.local not working and how to make  it work again - ☩

六、使用 rc.local 的注意事项

  1. 必须有 #!/bin/bash 头部
    否则无法被识别为可执行脚本。

  2. 最后必须加 exit 0
    表示正常退出,否则 systemd 认为它执行失败。

  3. 命令建议使用绝对路径
    如 /usr/bin/python3 而不是 python3,避免启动环境变量不同导致失败。

  4. 不要在里面写交互命令
    例如 read、passwd 这类需要输入的命令,会阻塞启动。

  5. 可以用日志追踪执行情况

    echo "rc.local start at $(date)" >> /var/log/rc.local.log

七、实战案例:科研网服务器开机自动配置脚本

在国产化环境(如银河麒麟 V10 SP3)中,很多科研服务器要在开机时自动:

  • 启动网研院态势感知平台

  • 恢复 NFS 挂载

  • 同步日志采集服务

  • 打开 SSH 安全审计模块

一个典型的 /etc/rc.local 可能是这样:

#!/bin/bash
# 科研网自动初始化脚本
mount -a
systemctl start wyy-sensor
systemctl start les-asset
systemctl start les-log
logger "科研网 rc.local executed at $(date)"
exit 0

每次开机后,系统自动完成所有配置。
这就是 rc.local 最迷人的地方——自动化、无感知、极稳定。


八、总结:一句话记住 rc.local

rc.local 是 Linux 启动阶段的“最后一块拼图”,
它让系统在每次启动后自动执行你想要的一切。

哪怕在 systemd 时代,它依然是最优雅、最人性的“自启动入口”。



Comment