Administrator
Published on 2025-11-12 / 3 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. 不要在里面写交互命令
    例如 readpasswd 这类需要输入的命令,会阻塞启动。

  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