¿Cuál es la diferencia entre /etc/rc.local y /etc/init.d/rc.local?

30

Quiero agregar una iptablesregla permanente a mi nuevo VPS, y después de una breve búsqueda en Google, me sorprendió que haya dos lugares donde se puede agregar esta regla, que parece idéntica: /etc/rc.localy /etc/init.d/rc.local. Tal vez alguien sabe por qué hay dos lugares para colocar el código de inicio simple. ¿Es específico para Linux (pero ubuntu tiene ambas)? O uno de ellos está en desuso?

grigoryvp
fuente
1
Uno debería ser un enlace simbólico al otro.
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams En Ubuntu Server 12.04 x86 LTS son completamente diferentes :(.
grigoryvp
1
@ IgnacioVazquez-Abrams: En Debian también parecen ser diferentes.
Emanuel Berg
3
Vale la pena echarle un vistazo: hice una pregunta hace /etc/rc.localun tiempo.
Emanuel Berg

Respuestas:

31

/etc/init.dse mantiene en ubuntu para compatibilidad con versiones anteriores de sysvinit. Si realmente mira /etc/init.d/rc.local, verá (también desde un servidor LTS 12.04):

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

Y "Ejecutar /etc/rc.local" es exactamente lo que hace. La totalidad de /etc/rc.locales:

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

Supongo que el propósito de hacer esto es proporcionar un lugar simple y simple para colocar los comandos de shell que desea ejecutar en el arranque, sin tener que lidiar con las cosas del servicio stop | start, que está en /etc/init.d/rc.local.

De hecho, es un servicio y puede ejecutarse como tal. Agregué una echolínea a /etc/rc.localy:

»service rc.local start
hello world

Sin embargo, no creo que se haga referencia a nada en el /etc/initdirectorio de upstart (no init.d!):

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

Hay algunos servicios "rc" en la fase inicial:

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

Pero ninguno de ellos parece tener nada que ver con rc.local.

encerrada dorada
fuente
5

Esto es más una cosa específica de distribución. (como, no encontrará diferentes rc.local en CentOS).

Ahora, volviendo a su pregunta real, creo que agregar cualquier cosa dentro de /etc/init.d/rc.local hace que comience como un "servicio", mientras que cualquier cosa dentro de /etc/rc.local simplemente lanzaría ese script en el momento del arranque.

No estoy realmente seguro de por qué Ubuntu todavía los mantiene a ambos. (¡Quizás alguien más pueda arrojar algo de luz sobre esta parte!)

pragmático
fuente
¿Cuál es la diferencia entre el comando que se ejecuta "como un servicio" y un código que "simplemente se inicia en el momento del arranque"? ¿Es algo de seguridad o qué?
grigoryvp
La diferencia principal entre los dos es esencialmente un Servicio y un proceso. ;) Supongo que la intención básica sería solo seguridad. Puede encontrar este enlace interesante: unixmen.com/managing-your-services-and-processes-in-linux
pragmático
¡Esto es incorrecto! No son el mismo script, pero son un solo servicio: /etc/init.d/rc.localel stop deja de funcionar /etc/rc.local(consulte mi respuesta para obtener más detalles).
Ricitos de Oro
@goldilocks: Gracias por una respuesta muy descriptiva y exhaustiva, pero no tengo claro qué parte de mi respuesta mencionó que es incorrecta. Decir uno como un servicio significa que puede hacer las cosas "iniciar" y "detener", mientras que el otro simplemente es un proceso. Corríjame si no tengo sentido aquí.
pragmático
2
@pragmatic Debido a que el /etc/rc.localscript es el proceso ejecutable gobernado por el /etc/initd/rc.localscript, al igual que (por ejemplo) /bin/syslogsería el proceso ejecutable gobernado por /etc/initd/syslog. Dices explícitamente que /etc/rc.locales solo un script de arranque, en lugar de /etc/initd/rc.localser un servicio de nivel de ejecución completamente separado.
Ricitos de oro