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

49

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 beheben, 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 rc.localmehr stattdessen systemd . Wofür ist die Alternative rc.local? Wie kann ich die obigen Befehle beim Start ausführen?

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

Saurabh Sharma
quelle
Führen Sie es als root aus und haben Sie Ihr System neu gestartet?
George Udosen
@ George ja, ich habe beides getan
Saurabh Sharma
versuchen Sie es
George Udosen
@ George Das funktioniert nicht so gut
Saurabh Sharma
Hab

Antworten:

65

Intro

Ich denke, Sie sollten keinen neuen Dienst erstellen, wie in dem Link von George vorgeschlagen. Das ist rc-local.servicebereits in systemd vorhanden, und die Servicedatei schlägt vor, dass das automatischrc.local abgerufen wird, sofern es vorhanden und ausführbar ist . Es ist also nicht erforderlich, etwas neu zu erstellen oder zu erzwingen, das nur auf eine andere Weise von der .multi-user.targetsystemd-rc-local-generator

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 rc.localwird beim Systemstart der 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 zeigt an, dass in diesem System, wenn eine Datei aufgerufen wird, /etc/rc.localdie ausführbar ist, diese automatisch in multi-user.target abgerufen wird. Sie erstellen also einfach die entsprechende Datei ( sudo touch...) und machen sie ausführbar ( sudo chmod +x ...).

Jan
quelle
4
Verwenden Sie es jedoch nicht #!/bin/bash, es #!/bin/shsei denn, Sie benötigen Bash in Ihrem Skript. Alle anderen Systemskripte verwenden aus Leistungsgründen Bindestrich und nicht Bash.
Spikyjt
"Keine Notwendigkeit, etwas neu zu erstellen oder zu erzwingen, das nur auf eine andere Weise vom systemd-rc-local-generator rc-localerledigt wird ", erlaubt es nicht, es nach einer anderen Einheit zu bestellen, nicht wahr?
X-Yuri
20

Ich sah diese Lösung vorgeschlagen, die Verwendung von systemd hier 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 Sie einen /etc/rc.localausführbaren Code, stellen Sie sicher, dass er ausführbar ist, und fügen Sie den folgenden 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 Ihre codezu der /etc/rc.localDatei 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

George Udosen
quelle
Ich habe alle Schritte gemacht. Ich habe die rc.local mit: touch "hello"vor der exit 0. Der Service scheint aktiv zu sein , aber es schafft keine Datei im Verzeichnis / etc / dir Laufen auf ubuntu 16.04 Arabian 5,31
Danny182
Wie die Antwort von @Jan zeigt, ist das Erstellen eines neuen Dienstes nicht erforderlich, da systemd bereits rc.local unterstützt.
TommyPeanuts
Vielen Dank, dass Sie sich für diese Funktion entschieden haben
GPrathap
2

Um der Antwort von Jan hinzuzufügen , wird diese im Gegensatz zur üblichen rc.localDatei rc-local servicenicht ausgeführt, nachdem alle Dienste gestartet wurden, sondern nachdem das Netzwerk online gegangen ist.

In einigen Fällen möchten Sie möglicherweise Befehle rc.localspäter ausführen . Ich wollte zum Beispiel, dass es nach dem lxdStart ausgeführt wird.

In diesem Fall können Sie rc-local serviceStartabhä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 können Sie einen benötigten Einheitennamen hinzufügen (wie ich hinzugefügt habe lxd.service)

Vergiss danach nicht systemctl daemon-reload.

user2586441
quelle
Willkommen bei Ask Ubuntu! Wenn Sie eine andere Antwort verbessern möchten, schlagen Sie bitte eine Änderung vor. Wenn Sie eine teilweise Alternative präsentieren möchten, wiederholen oder zitieren Sie bitte die gleichen Teile (falls sich die ursprüngliche Antwort ändert) und heben Sie die Unterschiede hervor. Erstellen Sie auf keinen Fall eine neue unvollständige Antwort! Danke.
David Foerster