如何在启动 Linux 系统时启用 systemd 上的 rc.local shell 脚本
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 系统管理 |
先决条件 | 使用 systemd 作为 init 的 Linux |
操作系统兼容性 | Alma • Arch • CentOS • Debian • Fedora • Linux • Mint • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu • WSL |
预计阅读时间 | 5 分钟 |
在启动 Linux 系统时在 systemd 上启用 rc.local shell 脚本
使用名为 rc-local.service 的特殊服务在 systemd 上实现 /etc/rc.local 兼容性。如果 /etc/rc.local 可执行,则 systemd-rc-local-generator 会自动将此单元调用到 multi-user.target 中。
使用 systemd 在启动期间执行 rc.local shell 脚本
当然,使用您最喜欢的文本编辑器创建或更新/编辑名为 /etc/rc.local 的文件。我将使用 vim 命令:
附加所需命令或调用脚本。这是我的文件:
$ sudo vim /etc/rc.local
## RHEL/CentOS/Fedora Linux edit the /etc/rc.d/rc.local ##
$ sudo vim /etc/rc.d/rc.local
#!/bin/sh # add your commands # call your scripts here # let us set stuff for my wifi /sbin/iw phy0 wowlan enable magic-packet disconnect # last line must be exit 0 exit 0
使用 vim 时保存并关闭文件。确保使用 chmod 命令设置可执行权限:
$ sudo chmod -v +x /etc/rc.local
如何使用 systemd 启用 /etc/rc.local
让我们使用 systemctl 命令查看文件 /etc/rc.local 是否已启用。在 systemd 上检查并启用 /etc/rc.local:
$ sudo systemctl is-enabled rc-local.service
$ sudo systemctl status rc-local.service
检查并启用 Linux 上 Systemd 上的 /etc/rc.local(点击放大)
在 Linux 上,当 systemd 处于 init 状态时启动 rc-local.service
我们需要做的就是输入以下 systemctl 命令:
$ sudo systemctl enable rc-local.service
重新启动 Linux机器:
$ sudo reboot
但是,我们可以立即在 systemd Linux 系统中替换并执行 rc.local,而无需重新启动:
$ sudo systemctl start rc-local.service
然后我们可以在重新启动或启动服务后验证状态,如下所示::
$ sudo systemctl status rc-local.service
这是我们在屏幕上看到的内容:
● rc-local.service - /etc/rc.local Compatibility Loaded: loaded (/etc/systemd/system/rc-local.service; enabled-runtime; ven> Drop-In: /usr/lib/systemd/system/rc-local.service.d └─debian.conf Active: active (exited) since Wed 2020-11-04 13:29:54 IST; 1h 59min ago Docs: man:systemd-rc-local-generator(8) Tasks: 0 (limit: 37939) Memory: 0B CGroup: /system.slice/rc-local.service Nov 04 13:29:54 example-wks01 systemd[1]: Starting /etc/rc.local Compatibility Nov 04 13:29:54 example-wks01 systemd[1]: Started /etc/rc.local Compatibility.
请参阅如何使用 systemctl 命令查看 Linux 上服务的状态以获取更多信息。
如何查看服务配置
打开终端应用程序,然后输入:
$ sudo systemctl cat rc-local.service
我们看到 systemd 配置如下:
# /etc/systemd/system/rc-local.service # SPDX-License-Identifier: LGPL-2.1+ # # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # This unit gets pulled automatically into multi-user.target by # systemd-rc-local-generator if /etc/rc.local is executable. [Unit] Description=/etc/rc.local Compatibility Documentation=man:systemd-rc-local-generator(8) ConditionFileIsExecutable=/etc/rc.local After=network.target [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes GuessMainPID=no # /usr/lib/systemd/system/rc-local.service.d/debian.conf [Unit] # not specified by LSB, but has been behaving that way in Debian under SysV # init and upstart After=network-online.target # Often contains status messages which users expect to see on the console # during boot [Service] StandardOutput=journal+console StandardError=journal+console
注意:sudo SYSTEMD_LOG_LEVEL=debug /usr/lib/systemd/system-generators/systemd-rc-local-generator当脚本未加载时运行以调试 /etc/rc.local 问题。
关于运行级别的说明
在 init 为默认运行的时代,我们有如下不同的运行级别:
- S– 启动 Linux 系统
- 0– 关闭 Linux 系统
- 6– 重新启动 Linux
- 1– Linux 单用户模式,用于在紧急模式下恢复 Linux 系统
- 2 to 5– 支持 CLI 和 GUI 以及完整网络的正常运行多用户系统
Linux 发行版和 Unix 系统通常会根据需要修改这些运行级别值。但是,当系统通过运行级别 2 到 5 进入多用户模式时,会调用 /etc/rc.local。但是,当大多数 Linux 发行版切换到 systemd 时,此默认设置被删除。因此,我为 Linux 开发人员和系统管理员编写了此快速指南。
使用 Linux 上的 systemd 可以轻松创建自己的服务
现在,我们不再需要 /etc/rc.d/ 中的 shell 脚本或调用 /etc/rc.local。它只适用于 Linux,不适用于其他 Unix 变体。然后您只需执行以下操作:
# /etc/systemd/system/my-service-name-goes-here.service # # Sample template to call your script or command when systemd boots into multi user mode # [Unit] Before=network.target [Service] Type=oneshot ExecStart=/path/to/command ExecStart=/path/to/script arg1 arg2 RemainAfterExit=yes [Install] WantedBy=multi-user.target
例如,我们可以这样安装 wireguard 或 openvpn iptables 规则:
# /etc/systemd/system/wireguard-iptables.service [Unit] Before=network.target [Service] Type=oneshot ExecStart=/usr/sbin/iptables -t nat -A POSTROUTING -s 10.8.1.0/24 ! -d 10.8.1.0/24 -j SNAT --to 123.x.x.x ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 1194 -j ACCEPT ExecStart=/usr/sbin/iptables -I FORWARD -s 10.8.1.0/24 -j ACCEPT ExecStart=/usr/sbin/iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT ExecStop=/usr/sbin/iptables -t nat -D POSTROUTING -s 10.8.1.0/24 ! -d 10.8.1.0/24 -j SNAT --to 123.x.x.x ExecStop=/usr/sbin/iptables -D INPUT -p udp --dport 1194 -j ACCEPT ExecStop=/usr/sbin/iptables -D FORWARD -s 10.8.1.0/24 -j ACCEPT ExecStop=/usr/sbin/iptables -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT RemainAfterExit=yes [Install] WantedBy=multi-user.target
进而:
$ sudo systemctl enable wireguard-iptables.service
$ sudo systemctl start wireguard-iptables.service
$ sudo systemctl stop wireguard-iptables.service
结论
我希望您发现本快速教程有助于您启用 /etc/rc.local 支持,从而在使用 systemd 时实现向后兼容性和易用性。请务必阅读 systemd文档。