it-swarm.com.de

Wie kann ich unter Ubuntu 16.10 den Befehl beim Start ausführen (rc.local alternative)?

Ich richte ein Kontingent auf meinem Linode-Server ein, auf dem Ubuntu 16.10 ausgeführt wird, und es wird die folgende Fehlermeldung angezeigt

Kann nicht stat () eingehängtes Gerät/dev/root: Keine solche Datei oder Verzeichnis

Um dies zu korrigieren, habe ich diesen Thread für die Korrektur erreicht, die durch Hinzufügen erfolgt

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

zum /etc/rc.local. Ubuntu 16.10 verwendet jedoch nicht mehr rc.local, sondern systemd . Was ist die Alternative für rc.local? Wie kann ich die obigen Befehle beim Start ausführen?

Außerdem habe ich den Dienst mit systemctl enable rc-local.service aktiviert, aber es hat bei mir nicht funktioniert. Jeder Hinweis wäre willkommen.

43
Saurabh Sharma

Intro

Ich denke, Sie sollten keinen neuen Dienst erstellen, wie in dem Link von George vorgeschlagen. Der rc-local.service ist bereits in systemd vorhanden, und die Servicedatei schlägt vor, dass der rc.local, falls er vorhanden und ausführbar ist, automatisch in multi-user.target gezogen wird. Es ist also nicht erforderlich, etwas neu zu erstellen oder zu erzwingen, das vom systemd-rc-local-generator auf eine andere Weise ausgeführt wird.

Eine Lösung

Eine schnelle Umgehung (ich weiß nicht, ob das der kanonische Weg ist):

In einem Terminal machen Sie:

printf '%s\n' '#!/bin/bash' 'exit 0' | Sudo tee -a /etc/rc.local
Sudo chmod +x /etc/rc.local
Sudo reboot

Danach wird beim Systemstart der rc.local aufgerufen. Fügen Sie ein, was Sie wollen.

Hintergrund

Wenn Sie in einem Terminal tun:

Sudo systemctl edit --full rc-local

Sie können sehen, dass der Kopfkommentar folgende Zeilen enthält:

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

Dies bedeutet, dass in diesem System eine ausführbare Datei namens /etc/rc.local automatisch in multi-user.target abgerufen wird. Sie erstellen also einfach die entsprechende Datei (Sudo touch...) und machen sie ausführbar (Sudo chmod +x ...).

59
Jan

Ich habe diese Lösung vorgeschlagen, die die Verwendung von systemdhier beinhaltet:

  1. Erstellen Sie einen Service:

    Sudo vi /etc/systemd/system/rc-local.service
    
  2. Fügen Sie dort Ihren Code hinzu:

    [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
    
  3. Erstellen und vergewissern Sie sich, dass /etc/rc.local ausführbar ist, und fügen Sie diesen Code hinzu:

    Sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. Aktivieren Sie den Dienst:

    Sudo systemctl enable rc-local
    
  5. Service starten und Status prüfen:

    Sudo systemctl start rc-local.service
    Sudo systemctl status rc-local.service
    
  6. Wenn alles gut geht, können Sie Ihr code zur /etc/rc.local -Datei hinzufügen und neu starten.

Hinweis: Getestet auf Lubuntu 16.10.

Quelle:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

19
George Udosen

Hinzufügen zu Jans Antwort dass im Gegensatz zu der üblichen rc.localDatei rc-local service nicht ausgeführt wird, nachdem alle Dienste gestartet wurden, sondern nachdem das Netzwerk online gegangen ist.

In einigen Fällen möchten Sie möglicherweise später Befehle von rc.local ausführen. Zum Beispiel wollte ich, dass es nach dem Start von lxd ausgeführt wird.

In diesem Fall können Sie rc-local service Startabhängigkeiten bearbeiten, indem Sie eine Drop-In-Conf-Datei erstellen: /etc/systemd/system/rc-local.service.d/override.conf mit Inhalt:

[Unit]
After=network.target lxd.service

Wo Sie einen benötigten Gerätenamen hinzufügen können (wie ich lxd.service hinzugefügt habe)

Vergessen Sie nicht, danach systemctl daemon-reload.

2
user2586441