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

Будь-які пропозиції?

Відповіді:


14

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

Просто створіть файл /etc/systemd/system/rc-local.service з наступним вмістом (скопійовано з моєї системи Fedora systemd):

#  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 як корінь, щоб увімкнути його. Ви також можете перевірити / запустити його зараз, запустивши systemctl start rc-local.service.


Ці два файли вже існують: /etc/systemd/system/multi-user.target.wants/rc-local.service і /lib/systemd/system/rc-local.service
Felix Yan

1
Можливо, вимкнено. Спробуйте запустити systemctl enable rc-local.service. Якщо ви продовжуєте мати проблеми, будь ласка, напишіть вихід systemctl status rc-local.service.
Patches

5
Ви не можете видавати "enable" на блоці, у якому немає розділу Install, цей приклад, можливо, не працюватиме.
lzap

1
З іншого боку, файл (сподіваюся, посилання) у multi-user.target.wants саме те, що дозволяє це.
Pavel Šimerda

27

З systemd 188-2, systemd скаржиться на те, що не має [Install] і не в змозі включити службу rc.local. Можливо, це було у випадку з попередніми версіями, але з тих пір, як Arch devs лише нещодавно оголосив, що 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 року служба автоматично активувалася за допомогою a генератор . Однак 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 (яка повинна бути вбудована - і, здається, колишньою згадкою про неї вже існує), можливо, вам доведеться перевірити розташування файлів ... на /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.