Propósito y uso típico de /etc/rc.local

73

El encabezado se ve así:

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

¿Cuál es la razón de este archivo (no contiene mucho) y qué comandos usualmente incluye? ¿Qué es un "nivel de ejecución multiusuario"? (Supongo que rces "ejecutar comandos"?)

Emanuel Berg
fuente
2
No sé si este es el propósito "oficial" del archivo, pero descubrí que puedo usar el archivo para lo que debería suceder en el inicio, y requeriría acceso de superusuario, pero sin tener que proporcionar la contraseña. Por lo general, eso implicaría colores, el teclado y otras cosas similares. Mira algunos ejemplos aquí .
Emanuel Berg

Respuestas:

66

Un nivel de ejecución es un estado del sistema, que indica si se encuentra en el proceso de inicio, reinicio o apagado, o en modo de usuario único, o si se ejecuta normalmente. El programa init tradicional maneja estas acciones cambiando al nivel de ejecución correspondiente. Bajo Linux, los niveles de ejecución son por convención :

  • S durante el arranque,
  • 0 mientras se apaga,
  • 6 mientras reinicia,
  • 1 en modo de usuario único y
  • 2 a 5 en funcionamiento normal.

Los niveles de ejecución 2 a 5 se conocen como niveles de ejecución multiusuario, ya que permiten que varios usuarios inicien sesión, a diferencia del nivel de ejecución 1, que está destinado solo al administrador del sistema.

Cuando el nivel de ejecución cambia, init ejecuta scripts rc (en sistemas con un init tradicional; hay alternativas, como Upstart y Systemd ). Estos scripts rc generalmente inician y detienen los servicios del sistema, y ​​son proporcionados por la distribución.

El script /etc/rc.locales para uso del administrador del sistema. Se ejecuta tradicionalmente después de que se inician todos los servicios normales del sistema, al final del proceso de cambio a un nivel de ejecución multiusuario. Puede usarlo para iniciar un servicio personalizado, por ejemplo, un servidor instalado /usr/local. La mayoría de las instalaciones no necesitan /etc/rc.local, se proporciona para la minoría de los casos en que se necesita.

Gilles 'SO- deja de ser malvado'
fuente
2
Hoy descubrí que en FreeBSD actual, rc.local puede ejecutarse bastante pronto. Definitivamente no después de que se inicien todos los servicios normales del sistema. Quería un pitido cuando el acceso sshd a una máquina sin cabeza estuviera disponible, y rc.localno era adecuado por este motivo. Dado que la pregunta original es sobre Debian, este comentario probablemente sea irrelevante para el OP.
MvG
1
@ MVG Gracias por la información. rc.localTradicionalmente se ejecutaba en último lugar, pero veo que FreeBSD dejó de hacerlo cuando cambiaron a un sistema basado en la dependencia. Eso sí, incluso si rc.localse invocara después /etc/rc.d/sshd, eso no funcionaría perfectamente: rc.localse invocaría poco después de sshdque se iniciara el proceso, se podría invocar antes de sshdhaber comenzado a escuchar la red (pero estaríamos hablando décimas de segundo en más en una configuración típica).
Gilles 'SO- deja de ser malvado'
Estoy tratando de usarlo para configurar la red para contenedores lxc e iniciarlos automáticamente. Pero se detiene después iptables-apply /root/iptables. Estoy en el proceso de descubrir qué está mal (esperando el próximo reinicio). Pero si tienes alguna sugerencia, soy todo oídos.
x-yuri
1
@ x-yuri Esto requiere mucha más información que la que publicaste aquí. Ni siquiera sé qué es "eso" en "se detiene". Haga una nueva pregunta que explique lo que hizo.
Gilles 'SO- deja de ser malvado'
14

rc denota "control de ejecución",

El multiusernivel de ejecución se definiría como el nivel en el que la red está disponible y, por lo tanto, las conexiones al servidor podrían realizarse utilizando esos servicios en lugar de las conexiones de consola cableadas.

Eso sí, los servidores generalmente son administrados por un procesador de servicios (con varios nombres) que admiten conexiones de red y, a su vez, actúan como si realmente tuvieras una consola cableada.

En cuanto al rc.localarchivo, esta es una conveniencia que le permite especificar todos los objetos "locales" (específicos del sitio) (demonios y / o scripts de inicio único) que desea iniciar. Puede optar por utilizar este paradigma o llenar '/etc/init.d' con scripts de inicio / detención, de manera adecuada.

JRFerguson
fuente
1
De acuerdo, pero ¿por qué está el archivo allí, y cuándo lo usa típicamente y cómo (por ejemplo, qué comandos tienen sentido poner en él)?
Emanuel Berg
4

Lo uso principalmente para dos cosas:

  1. para registrar la fecha y la versión del núcleo de cada reinicio. una línea simple que se puede agregar fácilmente a los sistemas sin ningún tipo de relleno ... y mucho menos propenso a que el historial de arranque se corrompa que la ejecución uptimed.

  2. para revivir el antiguo directorio /etc/rc.boot/ que solía estar en Debian hasta hace unos años. Todavía tengo algunas secuencias de comandos simples que no merecen el esfuerzo de reescribir como una secuencia de comandos init.d (por ejemplo, una secuencia de comandos de preguntas y respuestas para enviar dmesg a la raíz, y otra para usar hdaparm para deshabilitar spindown inactivo y blockdev para configurar read- tamaño anterior), y estoy feliz de que se ejecuten después de todos los demás scripts de tiempo de arranque.

p.ej

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

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

Además, escribí scripts /etc/rc.local a principios de este año para centos y distribuciones de Debian para obtener los metadatos de estilo ec2 de openstack (on http://169.254.169.254/) para que las máquinas virtuales obtengan su IP, nombre de host, claves ssh y otra información específica de la instancia . cloud-init se ha portado desde entonces a estas distribuciones, por lo que los scripts están obsoletos ahora.

cas
fuente
3

El rc.localarchivo en Debian es principalmente para compatibilidad con sistemas de estilo no init. No deberías usarlo.

En su lugar, se recomienda que copie /etc/init.d/Skeletonen un nuevo script de inicio para lo que quiera que suceda mientras cambia los niveles de ejecución, y luego use inservpara habilitarlo.


Actualización: según el comentario a continuación, esta respuesta ya no se recomienda. Sin embargo, esta respuesta se publicó varios años antes de la degradación del esqueleto, y ese esqueleto todavía existe en Debian inestable a partir de enero de 2019.

bahamat
fuente
unix.stackexchange.com/a/480897/5132 /etc/init.d/skeleton no es el camino.
JdeBP