systemd не запускает /etc/rc.local?


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

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

Ответы:


16

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

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

# Этот файл является частью systemd.
#
# systemd - свободное программное обеспечение; Вы можете распространять и / или изменять его
# в соответствии с условиями GNU General Public License, опубликованной
# Фонд свободного программного обеспечения; либо версия 2 лицензии, либо
# (на ваше усмотрение) любая более поздняя версия.

[Единица измерения]
Описание = / etc / rc.local Совместимость
ConditionPathExists = / и т.д. / rc.local

[Обслуживание]
Тип = разветвление
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = терминал
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
Феликс Ян

2
Это, вероятно, отключено тогда. Попробуйте запустить systemctl enable rc-local.service. Если проблема не устранена, опубликуйте, пожалуйста, вывод systemctl status rc-local.service.
Патчи

5
Вы не можете выполнить «enable» на устройстве, у которого нет раздела Install, этот пример, возможно, не будет работать.
lzap

1
С другой стороны, файл (мы надеемся, это ссылка) multi-user.target.wantsявляется именно тем, что позволяет ему.
Павел Шимерда

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 года сервис автоматически активируется генератором . Однако Arch Linux, как объяснено на unix.stackexchange.com/a/471871/5132 , не включает опции обратной совместимости в systemd, которые обеспечивают генератор в первую очередь.
JdeBP


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чтобы добавить строку в самом верху, содержащую только что #!/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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.