systemd无法运行/etc/rc.local?


11

我正在使用Archlinux,最近开始尝试使用systemd。

但是,我发现systemd不会加载我的/etc/rc.local脚本。

如Wiki页面中所述,我确实已经运行过systemctl enable rc-local.service,但这并没有帮助。

我的/etc/rc.local文件的内容是:

echo -n 120 > /sys/devices/platform/i8042/serio1/speed
echo -n 250 > /sys/devices/platform/i8042/serio1/sensitivity
iptables --table nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

有什么建议?

Answers:


16

Arch可能未包含运行所需的服务单元文件rc.local

只需创建一个/etc/systemd/system/rc-local.service具有以下内容的文件(从我的Fedora systemd系统中逐字复制):

#此文件是systemd的一部分。
#
#systemd是免费软件;您可以重新分发和/或修改它
#根据由GNU发布的GNU通用公共许可的条款
#自由软件基金会;许可的版本2,或
#(您可以选择)任何更高版本。

[单元]
说明= / etc / rc.local兼容性
ConditionPathExists = / etc / rc.local

[服务]
类型=分叉
ExecStart = / etc / rc.local开始
超时秒= 0
StandardOutput = tty
RemainAfterExit =是
SysVStartPriority = 99

然后,只需systemctl enable rc-local.service以root身份运行即可启用它。您还可以通过运行进行测试/立即运行systemctl start rc-local.service


这两个文件已经存在:/etc/systemd/system/multi-user.target.wants/rc-local.service/lib/systemd/system/rc-local.service
Felix Yan

2
那可能被禁用了。尝试跑步systemctl enable rc-local.service。如果您仍然遇到问题,请发布的输出systemctl status rc-local.service
补丁

5
您无法在没有“安装”部分的设备上发出“启用”命令,此示例可能无法正常工作。
lzap

1
另一方面,文件(希望是一个链接)multi-user.target.wants正是启用它的功能。
PavelŠimerda

28

对于systemd 188-2,systemd抱怨没有任何[Install]节,因此无法启用rc.local服务。早期版本可能会出现这种情况,但是由于Arch开发人员直到最近才宣布systemd将成为默认值,因此我正在修复我的系统。

要解决此问题,只需在中为多用户目标添加一个部分/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

创建/etc/rc.local脚本并使其可执行chmod +x /etc/rc.local


1
这是因为rc-local.service从不曾通过服务启用过,systemctl enable但自2011年以来一直是由Generator自动启用的服务。 但是,如unix.stackexchange.com/a/471871/5132所述,Arch Linux 并未打开systemd中首先提供生成器的向后兼容性选项。
JdeBP '18


2

不要忘记使rc.local可执行-否则兼容性层将无法运行它!在上面列出的示例中,您将运行chmod a + x以便使rc.local文件可执行。如下:

$ chmod a+X /etc/systemd/system/rc-local.service 

我认为另一个可能的问题是rc.local脚本的位置!如果您尚未添加对systemd的兼容性(应内置于其中-并且似乎已经在前面提到过),则可能需要仔细检查文件位置...在我的操作系统上,我有rc-local在/etc/rc.d/rc.local中,所以我运行了以下命令:

$ sudo chmod a+x /etc/rc.d/rc.local
$ sudo systemctl restart rc-local.service
$ sudo systemctl status rc-local.service
rc-local.service - /etc/rc.d/rc.local Compatibility
      Loaded: loaded (/lib/systemd/system/rc-local.service; static)
      Active: active (exited) since Fri, 13 Apr 2012 14:42:39 -0600; 3s ago
     Process: 2285 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/rc-local.service

4
systemd如第一个代码片段所示,使服务文件可执行是没有意义的。同样,在Arch Linux上,文件路径为/etc/rc.local-也许systemd服务文件的内容不正确。
RavuAlHemio

1

两个常见的陷阱:

  1. 不要忘记使/etc/rc.d/rc.local可执行文件。您可以使用

    # chmod a+rx /etc/rc.d/rc.local
    

    使它可执行。

  2. 别忘了#!/bin/sh在的第一行加上一行/etc/rc.d/rc.local。这是应该看起来的样子:

    #  head -1 /etc/rc.d/rc.local 
    #!/bin/sh
    # file /etc/rc.d/rc.local 
    /etc/rc.d/rc.local: POSIX shell script, ASCII text executable
    

    如果没有得到类似的输出,请编辑/etc/rc.d/rc.local以在最上方添加一行,其中包含just #!/bin/sh


1

如果您具有/etc/rc.local可执行文件,则将通过systemd-rc-local-generator/ 将其拉入引导过程rc-local.service

至少/etc/rc.local是它使用的默认路径,但这是由发行版设置的。因为它主要是为了向后兼容,所以不同的发行版使用了不同的路径。例如在Fedora上,路径为/etc/rc.d/rc.local。您可以按以下方式检查路径:

$ systemctl cat rc-local.service
# /usr/lib/systemd/system/rc-local.service
# ...

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

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

似乎这不是很知名。有几篇文章显示了文件的先前版本,但没有此类注释。


1
事实并非如此。如unix.stackexchange.com/a/471871/5132所述,Arch不使用向后兼容机制,也没有此生成器。
JdeBP '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.