11

Я использую Archlinux и начал пробовать systemd в эти дни.

Однако я обнаружил, что systemd не загружает мой скрипт /etc/rc.local.

Как упоминалось на вики-странице, я запустил 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

Какие-либо предложения?

6 ответов6

27

При использовании 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

14

Возможно, Arch не включил файл служебного блока, необходимый для запуска rc.local .

Просто создайте файл /etc/systemd/system/rc-local.service со следующим содержимым (дословно скопировано из моей системы systemd Fedora):

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

[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

Затем просто запустите systemctl enable rc-local.service от имени пользователя root, чтобы включить его. Вы также можете проверить / запустить его сейчас, запустив systemctl start rc-local.service .

4

Pkgfile (в моей системе) говорит:

$ pkgfile --search rc-local.service
community/initscripts-systemd

Этот пакет устанавливает другие вещи, которые вы, возможно, не хотите, но вы можете отключить его. Смотрите также:https://wiki.archlinux.org/index.php/Systemd#The_initscripts-systemd_package

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
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 чтобы добавить строку в самом верху, содержащую только #!/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

Кажется, это не очень хорошо известно. Есть несколько постов, которые показывают предыдущую версию файла, в которой нет такого комментария.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .