Was ist der Unterschied zwischen /etc/rc.local und /etc/init.d/rc.local?

30

Ich möchte eine permanente iptablesRegel zu meiner neuen hinzufügen VPS, und nach einer kurzen Google-Suche war ich überrascht, dass es zwei Stellen gibt, an denen diese Regel hinzugefügt werden kann, die identisch zu sein scheinen: /etc/rc.localund /etc/init.d/rc.local. Vielleicht weiß jemand warum wo zwei Stellen für einfachen Startcode zu platzieren sind? Ist es Linux-spezifisch (aber Ubuntu hat beides!)? Oder ist einer von ihnen veraltet?

grigoryvp
quelle
1
Einer sollte ein Symlink zum anderen sein.
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams Auf Ubuntu Server 12.04 x86 LTS sind sie völlig anders :(.
grigoryvp
1
@ IgnacioVazquez-Abrams: Unter Debian scheinen sie auch anders zu sein.
Emanuel Berg
3
Lohnt sich: Ich habe eine fragte Frage über /etc/rc.localeine Weile zurück.
Emanuel Berg

Antworten:

31

/etc/init.dwird aus Gründen der Abwärtskompatibilität mit Sysvinit-Inhalten auf Ubuntu gepflegt. Wenn Sie sich das anschauen, werden /etc/init.d/rc.localSie sehen (auch von einem 12.04 LTS Server):

#! /bin/sh
### BEGIN INIT INFORMATION
# Provides:          rc.local
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

Und "Run /etc/rc.local" ist genau das, was es tut. Die Gesamtheit von /etc/rc.localist:

#!/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

Ich vermute, der Zweck dabei ist, einen absolut einfachen Ort zu bieten, an dem Shell-Befehle, die Sie beim Booten ausführen möchten, abgelegt werden können, ohne sich mit dem Stop-Start-Service-Zeug befassen zu müssen, das sich in befindet /etc/init.d/rc.local.

Es handelt sich also tatsächlich um einen Dienst, der als solcher ausgeführt werden kann. Ich habe eine echoZeile hinzugefügt zu /etc/rc.localund:

»service rc.local start
hello world

Ich glaube jedoch nicht, dass es von irgendetwas im /etc/initVerzeichnis von upstart (not init.d!) Referenziert wird :

»initctl start rc.local
initctl: Unknown job: rc.local

Es gibt ein paar "rc" -Dienste in upstart:

»initctl list | grep rc
rc stop/waiting
rcS stop/waiting
rc-sysinit stop/waiting

Aber keine davon scheint irgendetwas mit rc.local zu tun zu haben.

Goldlöckchen
quelle
5

Dies ist eher eine verteilungsspezifische Sache. (wie, Sie werden nicht anders rc.local in CentOS finden).

Kommen wir nun zu Ihrer eigentlichen Frage. Ich denke, wenn Sie irgendetwas in /etc/init.d/rc.local hinzufügen, wird es als "Dienst" gestartet, wohingegen alles in /etc/rc.local dieses Skript einfach beim Booten startet.

Ich bin mir nicht ganz sicher, warum Ubuntu beide weiterhin unterstützt. (Vielleicht könnte jemand anderes etwas Licht über diesen Teil werfen !!)

pragmatisch
quelle
Was ist der Unterschied zwischen einem Befehl, der "als Dienst" ausgeführt wird, und einem Code, der "einfach beim Booten gestartet wird"? Ist es Sicherheit oder was?
Grigoryvp
Der Hauptunterschied zwischen den beiden besteht im Wesentlichen in einem Service und einem Prozess. ;) Ich denke die grundsätzliche Absicht wäre nur die Sicherheit. Dieser Link könnte Sie interessieren: unixmen.com/managing-your-services-and-processes-in-linux
pragmatisch
Das ist falsch! Sie sind nicht das gleiche Skript, aber sie sind ein Dienst - /etc/init.d/rc.localmacht das Stop-Start-Zeug an /etc/rc.local(siehe meine Antwort für weitere Details).
Goldlöckchen
@goldilocks: Danke für eine sehr aussagekräftige und gründliche Antwort, aber mir ist nicht klar, welchen Teil meiner Antwort Sie als falsch bezeichnet haben. Das eine als Service zu bezeichnen, bedeutet, dass es das "Starten" und "Stoppen" erledigen kann, während das andere einfach ein Prozess ist. Bitte korrigieren Sie mich, wenn ich hier keinen Sinn mache.
pragmatisch
2
@pragmatic Da das /etc/rc.localSkript der ausführbare Prozess ist, der vom /etc/initd/rc.localSkript gesteuert wird , ist dies genauso wie (z. B.) /bin/syslogder ausführbare Prozess, der von gesteuert wird /etc/initd/syslog. Sie sagen ausdrücklich, dass /etc/rc.locales sich nur um ein Boot-Skript handelt und /etc/initd/rc.localnicht um einen vollständig separaten Service auf Run-Level-Ebene.
Goldlöckchen