systemd ne lance pas /etc/rc.local?

11

J'utilise Archlinux et j'ai commencé à essayer systemd ces jours-ci.

Cependant, j'ai trouvé que systemd ne charge pas mon script /etc/rc.local.

Comme mentionné dans la page Wiki, j'ai couru systemctl enable rc-local.service, mais cela n'a pas aidé.

Le contenu de mon fichier /etc/rc.local est:

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

Aucune suggestion?

Felix Yan
la source

Réponses:

16

Arche pourrait ne pas avoir inclus le fichier de l' unité de service nécessaire pour exécuter rc.local.

Créez simplement un fichier /etc/systemd/system/rc-local.serviceavec le contenu suivant (copié textuellement de mon système Fedora systemd):

# Ce fichier fait partie de systemd.
#
# systemd est un logiciel libre; vous pouvez le redistribuer et / ou le modifier
# selon les termes de la licence publique générale GNU telle que publiée par
# la Free Software Foundation; soit la version 2 de la licence, soit
# (à votre choix) toute version ultérieure.

[Unité]
Description = / etc / rc.local Compatibilité
ConditionPathExists = / etc / rc.local

[Un service]
Type = fourche
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = tty
RemainAfterExit = oui
SysVStartPriority = 99

Ensuite, exécutez simplement en systemctl enable rc-local.servicetant que root pour l'activer. Vous pouvez également le tester / l'exécuter maintenant en exécutant systemctl start rc-local.service.

Patchs
la source
Ces deux fichiers existent déjà: /etc/systemd/system/multi-user.target.wants/rc-local.serviceet /lib/systemd/system/rc-local.service
Felix Yan
2
Il est probablement désactivé alors. Essayez de courir systemctl enable rc-local.service. Si vous continuez à rencontrer des problèmes, veuillez publier la sortie de systemctl status rc-local.service.
Correctifs
5
Vous ne pouvez pas émettre "enable" sur une unité qui n'a pas de section d'installation, cet exemple ne fonctionnera peut-être pas.
lzap
1
D'un autre côté, le fichier (si tout va bien un lien) dans multi-user.target.wantsest exactement ce qui le permet .
Pavel Šimerda
28

Avec systemd 188-2, systemd se plaint de ne pas avoir de [Install]section et comme tel de ne pas pouvoir activer le service rc.local. Cela aurait pu être le cas avec les versions antérieures, mais depuis que les développeurs Arch n'ont annoncé que récemment systemd deviendra la valeur par défaut que je corrige mon système.

Pour résoudre ce problème, ajoutez simplement une section pour la cible multi-utilisateurs dans /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

Créez le /etc/rc.localscript et rendez-le exécutable avecchmod +x /etc/rc.local

Borromini
la source
1
En effet, rc-local.servicen'a jamais été un service qui a été activé via, systemctl enablemais depuis 2011 a été un service auto-activé par un générateur . Cependant, Arch Linux, comme expliqué sur unix.stackexchange.com/a/471871/5132 , n'active pas les options de compatibilité descendante dans systemd qui fournissent le générateur en premier lieu.
JdeBP
2

N'oubliez pas de rendre exécutable rc.local - sinon la couche de compatibilité ne l'exécutera pas! Dans les exemples ci-dessus qui sont répertoriés - vous exécuteriez chmod a + x afin de rendre le fichier rc.local exécutable. Comme suit:

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

Je pense qu'un autre problème possible est l'emplacement de votre script rc.local! Si vous n'avez pas encore ajouté la compatibilité à systemd (qui devrait être intégré - et semble être déjà mentionné par ex-mention), vous devrez peut-être vérifier à nouveau l'emplacement de vos fichiers ... Sur mon système d'exploitation, j'ai rc-local à /etc/rc.d/rc.local, j'ai donc exécuté ce qui suit:

$ 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
Rio1
la source
4
Il est inutile de rendre le systemdfichier de service exécutable, comme indiqué dans votre premier extrait de code. De plus, sur Arch Linux, le chemin du fichier est /etc/rc.local- peut-être que le contenu du systemdfichier de service est incorrect.
RavuAlHemio
1

Deux pièges courants:

  1. N'oubliez pas de rendre /etc/rc.d/rc.localexécutable. Vous pouvez utiliser

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

    pour le rendre exécutable.

  2. N'oubliez pas de mettre une #!/bin/shligne dans la première ligne de /etc/rc.d/rc.local. Voici à quoi les choses devraient ressembler:

    #  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
    

    Si vous n'obtenez pas de sortie similaire, modifiez /etc/rc.d/rc.localpour ajouter une ligne tout en haut contenant juste #!/bin/sh.

DW
la source
1

Si vous avez /etc/rc.localun fichier exécutable, il sera tiré dans le processus de démarrage par systemd-rc-local-generator/ rc-local.service.

C'est au moins /etc/rc.localle chemin par défaut qu'il utilise, mais il est défini par la distribution. Parce que c'est principalement pour la compatibilité descendante, et différentes distributions utilisaient des chemins différents. Par exemple sur Fedora, le chemin est /etc/rc.d/rc.local. Vous pouvez vérifier le chemin d'accès comme suit:

$ 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

Il semble que ce ne soit pas très bien connu. Il y a plusieurs articles qui montrent une version précédente du fichier, qui n'a pas un tel commentaire.

sourcejedi
la source
1
Ce n'est en fait pas vrai. Comme expliqué sur unix.stackexchange.com/a/471871/5132 , Arch n'utilise pas les mécanismes de compatibilité descendante et n'a pas ce générateur.
JdeBP