Zweck und typische Verwendung von /etc/rc.local


73

Der Header sieht folgendermaßen aus:

#!/bin/sh -e
#
# rc.local - executed at the end of each multiuser runlevel
#
# Make sure that the script will "exit 0" on success or any other
# value on error.

Was ist der Grund für diese Datei (sie enthält nicht viel) und welche Befehle geben Sie normalerweise ein? Was ist ein "Mehrbenutzer-Runlevel"? (Ich denke, rcist "Befehle ausführen"?)


2
Ich weiß nicht, ob dies der "offizielle" Zweck der Datei ist, aber ich fand heraus, dass ich die Datei für das verwenden kann, was beim Start passieren soll, und Superuser-Zugriff erfordern würde, aber ohne das Passwort anzugeben. Dazu gehören normalerweise Farben, die Tastatur und andere solche Dinge. Schauen Sie sich hier einige Beispiele an .
Emanuel Berg

Antworten:


66

Ein Runlevel ist ein Status des Systems, der angibt, ob es gerade gestartet oder neu gestartet oder heruntergefahren wird, sich im Einzelbenutzermodus befindet oder normal ausgeführt wird. Das traditionelle Init- Programm handhabt diese Aktionen, indem es zum entsprechenden Runlevel wechselt. Unter Linux lauten die Runlevel wie folgt :

  • S beim Booten,
  • 0 beim Herunterfahren,
  • 6 während des Neustarts,
  • 1 im Einzelbenutzermodus und
  • 2 bis 5 im Normalbetrieb.

Runlevel 2 bis 5 werden als Mehrbenutzer-Runlevel bezeichnet, da sich mehrere Benutzer anmelden können, im Gegensatz zu Runlevel 1, das nur für den Systemadministrator bestimmt ist.

Wenn sich der Runlevel ändert, führt init rc-Skripte aus (auf Systemen mit einem herkömmlichen Init - es gibt Alternativen wie Upstart und Systemd ). Diese rc-Skripte starten und stoppen normalerweise Systemdienste und werden von der Distribution bereitgestellt.

Das Skript /etc/rc.localwird vom Systemadministrator verwendet. Es wird traditionell ausgeführt, nachdem alle normalen Systemdienste gestartet wurden, und zwar am Ende des Prozesses des Wechsels zu einem Mehrbenutzer-Runlevel. Sie können es verwenden, um einen benutzerdefinierten Dienst zu starten, z. B. einen Server, auf dem installiert ist /usr/local. Die meisten Installationen brauchen das nicht /etc/rc.local, es wird nur für die wenigsten Fälle bereitgestellt, in denen es benötigt wird.


2
Ich habe heute herausgefunden, dass rc.local unter der aktuellen Version von FreeBSD ziemlich früh ausgeführt werden kann. Auf jeden Fall nicht, nachdem alle normalen Systemdienste gestartet wurden. Ich wollte einen Signalton, wenn SSHD-Zugriff auf eine kopflose Maschine verfügbar sein würde, und rc.localwar aus diesem Grund nicht geeignet. Da es sich bei der ursprünglichen Frage um Debian handelt, ist dieser Kommentar für das OP wahrscheinlich irrelevant.
MVG

1
@MvG Danke für die Information. rc.localwurde traditionell zuletzt ausgeführt, aber ich sehe, dass FreeBSD damit aufgehört hat, als sie zu einem abhängigkeitsbasierten System gewechselt sind. Selbst wenn rc.localdanach aufgerufen /etc/rc.d/sshdwürde, würde das nicht perfekt funktionieren: rc.localwürde sofort nach dem sshdStart des Prozesses aufgerufen werden , könnte aufgerufen werden, bevor sshddas Abhören des Netzwerks begonnen hatte (aber wir würden um eine Zehntelsekunde sprechen) die meisten in einem typischen Setup).
Gilles

Ich versuche, es zu verwenden, um Netzwerk für LXC-Container einzurichten und sie automatisch zu starten. Aber es hört danach auf iptables-apply /root/iptables. Ich bin dabei herauszufinden, was los ist (und warte auf den nächsten Neustart). Aber wenn Sie Vorschläge haben, bin ich ganz Ohr.
X-Yuri

1
@ x-yuri Dies erfordert weit mehr Informationen als das, was Sie hier gepostet haben. Ich weiß nicht einmal, was "es" in "es hört auf" ist. Stellen Sie eine neue Frage, die erklärt, was Sie getan haben.
Gilles

14

rc bedeutet "Laufkontrolle",

Der multiuserRunlevel wird als die Ebene definiert, auf der das Netzwerk verfügbar ist, und daher können Verbindungen zum Server mithilfe dieser Dienste anstelle von fest verdrahteten Konsolenverbindungen hergestellt werden.

Allerdings werden Server in der Regel von einem Serviceprozessor (unter verschiedenen Namen) verwaltet, der Netzwerkverbindungen unterstützt und sich so verhält, als ob Sie tatsächlich eine fest verdrahtete Konsole hätten.

Mit rc.localdieser Funktion können Sie für die Datei alle "lokalen" (standortspezifischen) Objekte (Daemons und / oder Skripts, die beim Start ausgeführt werden sollen) angeben, die Sie starten möchten. Sie können dieses Paradigma verwenden oder '/etc/init.d' entsprechend mit Start / Stopp-Skripten füllen.


1
Okay, aber warum ist die Datei dort und wann wird sie normalerweise verwendet und wie (z. B. welche Befehle sind sinnvoll, um sie einzufügen)?
Emanuel Berg

4

Ich benutze es hauptsächlich für zwei Dinge:

  1. um das Datum und die Kernelversion jedes Neustarts zu protokollieren. Ein einfacher Einzeiler, der problemlos zu Systemen hinzugefügt werden kann, ohne dass es zu Problemen kommt. Er ist weitaus weniger anfällig für die Beschädigung des Startverlaufs als für das Ausführen uptimed.

  2. um das alte /etc/rc.boot/-verzeichnis wiederzubeleben, das bis vor ein paar Jahren in debian war. Ich habe immer noch ein paar einfache Skripte, die es nicht wert sind, als init.d-Skript umgeschrieben zu werden (z. B. ein Q & D-Skript, um dmesg an root zu senden, und ein anderes, um hdaparm zum Deaktivieren von Idle-Spindown und blockdev zum Festlegen von Read-Down zu verwenden. und ich bin froh, dass sie nach allen anderen Startskripten ausgeführt werden.

z.B

echo "$(date +%s),$(date),$(uname -a)"  >> /var/log/reboot.log

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot

Außerdem habe ich Anfang dieses Jahres /etc/rc.local-Skripte für Centos und Debian-Distributionen geschrieben, um die ec2-artigen Metadaten von openstack (on http://169.254.169.254/) abzurufen, damit VMs ihre IP, Hostnamen, SSH-Schlüssel und andere instanzspezifische Informationen erhalten . cloud-init wurde inzwischen in diese Distributionen portiert, daher sind die Skripte jetzt veraltet.


3

Die rc.localDatei unter Debian dient hauptsächlich der Kompatibilität mit Nicht-Init-Systemen. Du solltest es nicht benutzen.

Stattdessen wird empfohlen, dass Sie /etc/init.d/Skeletonin ein neues Init-Skript kopieren , damit beim Ändern von Runlevels alle gewünschten Aktionen ausgeführt werden. inservAktivieren Sie es dann mit.


Update: Laut dem Kommentar unten wird diese Antwort nicht mehr empfohlen. Diese Antwort wurde jedoch einige Jahre vor der Skeleton-Verfallrate veröffentlicht, und dieses Skelett existiert seit Januar 2019 immer noch in Debian unstable.


unix.stackexchange.com/a/480897/5132 /etc/init.d/skeleton ist nicht der Weg.
JdeBP
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.