#4sysadmins

Inicio » GNU/Linux » Inicializar el sistema con SysV o Upstart

Inicializar el sistema con SysV o Upstart

Últimas Entradas

Follow #4sysadmins on WordPress.com

SysV y Upstart

Todos sabemos ya que ambos sistemas de inicialización están prácticamente en desuso, o al menos la intención es migrar a systemd. Aún se conservan servicios con scripts de inicio SysV y distribuciones que prefieren Upstart para inicializar y administrar los niveles de ejecución. El objetivo de este post no es enseñaros nada nuevo sobre SysV o Upstar (a menos que el lector se esté iniciando en GNU/Linux y esté aquí precisamente por conocer estos sistemas de inicio), simplemente estoy a esperas de publicar esto para traer al blog el sistema de inicialización systemdal detalle” y para ello me gustaría contar antes con una entrada para estos predecesores.

Nota: En el Capítulo – 5 de LPIC-1 se abarcan los tres principales sistemas de inicialización (SysV, Upstart y sistemd) y otros temas como los cargadores de arranque, BIOS y UEFI, etc…

SISTEMA DE INICIALIZACIÓN SYSTEM V (SysV)

Linux se basa en modos de ejecución para determinar que funciones hay disponibles, enumerados del 0 al 6. Cada uno de ellos tiene asignado un conjunto de servicios.
Los modos de ejecución 0,1 y 6 están reservados para fines especiales; los modos de ejecución restantes están disponible para los objetivos que desee o los que decidan los proveedores de las distintas distribuciones Linux.

Nota: Puede haber modos de ejecuciones fuera del rango 0-6, pero es algo inusual.

Funciones de los modos de ejecución

El archivo /etc/inittab define y describe los distintos modos de ejecución.

  • 0 : Se emplea para apagar el sistema. Es un modo transitorio, es decir se emplea para pasar de un estado a otro. En este caso de iniciado a cerrado. En equipos con hardware moderno el sistema se apaga por completo, no así en equipos mas antiguos donde tiene que intervenir el usuario.
  • 1 : Modo monousuario, también representado por s, S o single. Se suele emplear para realizar un mantenimiento a bajo nivel, como por ejemplo el redimensionamiento de particiones, configuración del servidor X, etc…
  • 2 : En Debian y sus derivados es un modo multiusuario completo con X en ejecución. Muchas otras distribuciones dejan este modo de ejecución sin definir.
  • 3 : Para una gran mayoría de distribuciones como Red Hat o sus derivados, se define este modo como un modo multiusuario mediante terminal
  • 4 : Disponible para configuraciones personalizadas
  • 5 : En Fedora, Mandriva, Red Hat y la mayoría de las demás distribuciones tienen el mismo comportamiento que el modo 3 pero con servidor X.
  • 6 : Se emplea para reiniciar el sistema. Al igual que el modo 0, este es un modo transitorio, donde el ordenador se apaga por completo y vuelve a iniciar.

Identificar los servicios de un modo de ejecución.

Existen varias maneras de identificar que programas se ejecutan cuando se pasa a un modo de ejecución concreto con SysV, como por ejemplo a través del archivo /etc/inittab o bien con la herramienta chkconfig. Con la herramienta update-rc.d podremos activar y desactivar servicios para runlevels específicos.

Para identificar o definir programas para un cierto modo de ejecución mediante el archivo /etc/inittab, antes tendremos que conocer su estructura.

Las entradas de /etc/inittab siguen un formato sencillo:

id:modosdeejecución:acción:proceso

Donde:

  • id es una secuencia de uno a cuatro caracteres que identifica su función
  • modosdeejecución es una lista de los modos de ejecución para los que se aplicará la entrada. Puede definirse un solo modo (por ejemplo 3) o varios de ellos (2,3,5)
  • acción indica a init cómo tratar el proceso. Por ejemplo: wait inicia el proceso una vez cuando pase a un modo de ejecución y espera a que este finalice, respawn reinicia el proceso cada vez que finalice, powerwait indica a init que apague el sistema antes una falla en el sistema eléctrico (se precisa un UPS), ctraltdel reinicia el sistema cuando el usuario presione esas teclas (podemos cambiar las funciones o anularlas), sysinit comando ejecutado cuando inicia el sistema (por ejemplo limpiar /tmp), etc… podremos conocer mas acciones a través de man inittab. Para la acción initdefault se ignora el campo proceso.
  • proceso es el proceso que ejecutar para una determinada entrada, incluyendo las opciones y argumentos que sean necesarios.

Una vez entendida la estructura del archivo /etc/inittab podremos saber como introducir nuevas entradas para nuevos procesos o eliminar en caso de que no queramos que un programa sea ejecutado en un determinado modo.

Antes de comentar la segunda forma de identificar programas ejecutados en un determinado modo de ejecución vamos hablar sobre los scripts de inicio Sysv.

El script /etc/init.d/rc o /etc/rc.d/rc realiza la tarea crucial de ejecutar todos los scripts asociados con el modo de ejecución. Estos scripts se encuentran almacenados en /etc/rc.d/rc?.d, /etc/init.d/rc?.d, /etc/rc?.d o en ubicaciones similares, donde ? es el modo de ejecución. Cuando se pasa a un determinado modo de ejecución, rc le pasa el parámetro start a todos los scripts que se encuentran dentro del directorio del modo especificado cuyos nombres comienzan con S y el parámetro stop a los archivos cuyo nombre comienza con K. El programa rc ejecuta los scripts en orden numerico debido a que algunos servicios dependen de otros, es por esto que los nombres de los scripts además de empezar por S o K tienen un número. En realidad estos scripts no son mas que enlaces simbólicos a los scripts principales que se suelen almacenar en /etc/rc.d, /etc/init.d o /etc/rc.d/init.d (la ubicación depende de la distribución).

Sabiendo esto podemos buscar los scripts cuyos nombres de archivos comiencen por S o por K en el directorio de scripts de inicio SysV apropiado y determinar que servicios están activos o se pararán.

Podemos usar la herramienta chkconfig para tratar esta información de forma automática:

#chkconfig –list

O si estamos interesado en un servicio concreto:

#chkconfig –list <servicio>

Gestionar los servios  de los modos de ejecución

Al igual que existen dos formas para identificar servicios en un determinado modo de ejecución (o 3 si separamos el uso de chkconfig y la búsqueda de scripts por sus directorios) podemos gestionar los programas para que sean ejecutados o parados según el modo de ejecución de la misma  manera.

Mediante el archivo /etc/inittab:

Bastará con añadir o eliminar entradas del archivo

Con chkconfig:

Modificar los modos de ejecución para un determinado servicio

# chkconfig –level 235 <servicio> on|off|reset

Nota: Con reset le asignaremos su valor por defecto

Si hemos añadido un script de inicio al directorio principal de los scripts (/etc/init.d) podemos hacer que chkconfig lo registre y añada los enlaces de inicio y fin apropiados en los directorios de modo de ejecución adecuados.

# chkconfig –add <servicio>

Cuando lo hagamos, chkconfig inspeccionará el nuevo script en busca de comentarios (las líneas que comienzan por #) especiales donde se indica los modos de ejecución por defecto para la activación del servicio. Puede que este método no funcione si el script carece de estas líneas.

Podemos hacer este trabajo de forma manual que sería creando nosotros mismos el enlace simbólico del script principal en los directorios de los modos de ejecución en los que queremos que se inicie o detenga un programa concreto. Tenemos que tener en mente los nombres de archivos con S, K y los números de orden.

Importante: Podemos iniciar, detener o comprobar el estado de los servicios mediante la ejecución del comando ‘service‘:

# service samba status|start|stop

o con la ejecución del script principal

# /etc/init.d/samba status|start|stop

Existe la herramienta ntsysv la cual nos permitirá marcar aquellos servicios que queremos ejecutar durante el arranque. Es una herramienta “gráfica” de línea de comandos, su uso es sencillo y puede resultar útil incluso para ver que servicios tenemos marcados en el arranque. También puede ser usada para especificar un runlevel concreto.

Comprobar y cambiar el modo de ejecución

Podemos comprobar el modo de ejecución por defecto y el modo de ejecución actual.

Para comprobar el modo de ejecución por defecto basta con desplegar el contenido del archivo /etc/inittab y localizar la entrada que contiene como acción :initdefault:, esto no suele ser válido para equipos que usen Upstart, systemd u otra herramienta de inicialización.

Si por el contrario el sistema está en funcionamiento, puede ver su modo de ejecución actual como el comando runlevel:

#runlevel
N 2

El primer caracter es el modo de ejecución anterior, en este caso N, lo cual indica que el sistema no ha cambiado de modo de ejecución desde el arranque. El segundo caracter 2 es su modo de ejecución actual.

Se puede cambiar a modos de ejecución diferentes en un sistema operativo en funcionamiento con los programas init (o telinit), shutdown, halt, reboot y poweroff.

Por ejemplo para cambiar al modo monousuario o reiniciar el sistema podemos usar:

#init 1#init 6 (respectivamente)

init no es el comando mas lógico para reiniciar, apagar o pasar a modo monousuario, ya que lo hace de forma inmediata y podríamos molestar a otros usuarios conectados al sistema, pero si que sirve por ejemplo para que el sistema vuelva a leer el archivo /etc/inittab

El comando telinit es una variante de init, normalmente es un enlace simbólico, aunque la páginas man de ambos comandos presentan una sintaxis ligeramente distinta. Si quisiéramos por ejemplo que se volviese a leer el archivo /etc/inittab, podríamos usar telinit o init de la siguiente manera:

# telinit q 
# telinit Q

Nota: Las herramientas Upstart y systemd ofrecen los comandos init y telinit que funcionan de una forma similar.

Cuando desee reiniciar (6), apagar (0) o pasar a modo monousuario (1) en un entorno multiusuario, lo mejor será emplear el comando shutdown.

Pasar a modo monousuario de forma inmediata:

# shutdown now

Reiniciar el sistema en 5 minutos

# shutdown -r +5

Apagar el sistema a las 13:45

# shutdown -P 13:45

Suspender el equipo (no lo apaga) a las 1:30 AM avisando a los usuarios.

# shutdown -H 1:30 “A las 1:30 de la madrugada el sistema va a ser detenido”

Nota: La opción -h puede detener o apagar el equipo, aunque normalmente acaba apagándolo.

Detener el apagado de un equipo por un cambio de ultima hora (por ejemplo):

# shutdown -c “Se pospone el reinicio del sistema, se avisará nuevamente. Disculpen”

Nota: Upstart y systemd ofrecen la herramienta shutdown

Otros tres comandos útiles para detener, reiniciar o apagar el sistema respectivamente tanto en SysV, Upstart como con systemd son: halt, reboot y poweroff

Comandos para la administración de servicios y runlevels SysV

init (telinit): Nos permiten cambiar del nivel de ejecución desde la línea de comandos.

# init runlevel

runlevel: Nos permite ver el nivel de ejecución en el que estamos actualmente y desde el que vinimos. Runlevel devuelve dos números, por ejemplo ‘1 3‘, esto indica que estamos en el nivel 3 y el anterior (desde el que venimos) es el modo monousuario. Si el primero número es una ‘N‘ significa que no existe un modo de ejecución anterior.

update-rc.d: Instala o elimina scripts SysV mediante links a sus respectivos directorios de modo de ejecución. Algunos ejemplos:

# update-rc.d [-n] foo defaults

Activa (genera los enlaces apropiados para el servicio) foo para los runlevels 2345 y los detiene para 016. La opción ‘-n‘ es opcional, si la pasamos se realizará una simulación pero no se efectuarán cambios. Si los enlaces ya existiesen no se crearan nuevos, esto es así para no machar posibles configuraciones personales del administrador en los scripts.

# update-rc.d [-n] foo disable|enable [ S|2|3|4|5 ]

Deshabilita o habilita el servicio foo para los modos de ejecución seleccionado. Opcionalmente podemos elegir entre [ S|2|3|4|5 ]. Este comando realiza automáticamente el cambio de prefijo de los enlaces y además modifica el número. Si se usa disable, el número que adopta es 100 menos el número que poseía anteriormente y si se usa enable se realiza la opción contraria, es decir, se resta a 100 el número que adopta el servicio cuando está desactivado y la diferencia será el nuevo número de servicio. S20myservice (activado), lo desactivamos (100-20=80) K80myservice, lo volvemos a activar (100-80) S20myservice.

# update-rc.d [-n] [-f] foo remove

Se eliminará cualquier links en los directorios /etc/rc?.d para el script /etc/init.d/foo. Para que los links sean eliminados correctamente deberemos de eliminar el script principal de init.d, de lo contrario dará error y, si usamos la opción -f o los eliminamos manualmente, cuando se actualice de nuevo el servicio, update-rc.d será ejecutado y los links creados. Para desactivar los servicios también podemos modificar su nombre en los directorios de cada modo de ejecución y cambiar el prefijo ‘S‘ por ‘K

Vamos a ver un par de ejemplos donde veremos otra forma de activar un servicio de modo mas específico:

# update-rc.d foo start 30 2 3 4 5 . stop 70 0 1 6 .
# update-rc.d foobar stop 80 2 3 4 5 .

Crear links interpretando que B depende de A

# update-rc.d service_A defaults 80 20
# update-rc.d service_B defaults 90 10

chkconfig: Consulta y actualiza los servicios para cada runlevel

chkconfig [opciones] servicio

Opciones:

  • Listar todos los servicios y su modo de ejecución, o mostrar un solo servicio: –list [service]
$ sudo chkconfig --list [foobar]
  • Habilitar/Deshabilitar un servicio para los runlevels 2345:
$ sudo chkconfig foobar on|off
  • Habilitar/Deshabilitar un servicio en unos runlevels concretos:
$ sudo chkconfig foobar on|off --level 2

ntsysv: Herramienta ‘gráfica’ de línea de comandos, que nos permite habilitar/deshabilitar servicios en el runlevel predeterminado o seleccionar alguno(s) en particular.

Para su uso básico bastaría con escribir ntsysv como root y se mostrará un panel para marcar o desmarcar aquellos servicios que queremos (o no) ejecutar durante el arranque.

Si por el contrario queremos especificar un runlevel concreto:

# ntsysv --level 35

service: Arranca, detiene, comprobar el estado de un servicio para scripts SysV

service <service> start|stop|restart|status|reload

SISTEMA DE INICIALIZACIÓN UPSTART

Básicamente, Upstart hace lo mismo que las secuencias de comandos Sysvinit (SysV) pero está mejor diseñado para admitir el hardware actual y su continuo dinamismo, lo que permite conectarlo y desconectarlo de un ordenador en ejecución. Mientras SysV trabaja de una forma síncrona, el modelo basado en eventos de Upstart le permite responder a los eventos de una forma asíncrona cuando estos son generado, resolviendo así alguno de los problemas que presenta SysV, como el bloqueo de futuras tareas hasta que la actual se haya completado.

Para sistemas con Upstart el PID 1 sigue siendo para init, padre de todos los procesos en el sistema (incluso de los procesos huérfanos) y responsable de iniciar el resto de procesos.

Upstart ofrece funciones compatibles con SysV, no obstante también cuenta con sus propios scripts y difiere en algunos aspectos importantes, en concreto Upstart ignora el archivo /etc/inittab, en su lugar proporciona un conjunto integrado de scripts de arranque que en principio pueden reemplazar totalmente a /etc/inittab y a los scripts de arranque específico del modo de ejecución de SysV, que en vez de encontrarse bajo directorios como /etc/init.d/rc?.d, /etc/rc.d/rc?.d o /etc/rc?.d se encuentran en el directorio /etc/init, con nombre ‘servicio’.conf, donde servicio es el programa que init tratará como un job. Los scripts de Upstart ofrecen mas acciones que los de SysV, por ejemplo iniciar un servicio siempre que se conecte un determinado dispositivo de hardware.

Al igual que usábamos el comando #service <servicio> start|stop|status para iniciar un script SysV, en Upstart tenemos la opción de utilizar el comando initctl con el que podremos iniciar, parar, ver el estado, etc… de los servicios del sistema o directamente usar start y stop

$ sudo initctl stop smbd
$ sudo stop smbd

Nota: Para ver un listado de estos servicios podemos listar el contenido de /etc/init donde se encuentran como ya sabemos todos archivos de configuración de servicios Upstart, por lo que el nombre del servicio es igual a los del directorio pero sin .conf

El comando service podremos seguir usándolo para servicios SysV instalados en el sistema. Anteriormente hemos comentado que los scripts de Upstart sustituyen de forma completa a los scripts de SysV y a su archivo /etc/inittab, pero esto no es del todo cierto ya que Upstart concede en cierto modo la compatibilidad con SysV. Upstart continúa ejecutando scripts de SysV (ubicados en los mismos directorios como si de un sistema SysV se tratase) debido a que existen programas que aún no incluyen los scripts de configuración Upstart y necesitan ser arrancado de forma habitual.
Si ha instalado utilidades como chkconfig en sistemas que inicializan con Upstart deberá poder usarla para gestionar sus servicios SysV. No obstante chkconfig y estos servicios que aun se mantienen en SysV acabarán desapareciendo debido a que el progreso apunta a Upstart y systemd.

Gracias a la API inotify no será necesaria la recarga de un archivo de configuración (archivo con el que se configura un servicio por ejemplo smb.conf) para un determinado servicio, ya que esta proporciona un mecanismo para el seguimiento de eventos del sistema de archivos, lo cual supervisa tanto archivos individuales como directorios, por lo que si se diera el caso de que un archivo a sido modificado este será recargado automáticamente

Para cambiar los modos de ejecución en los que se ejecuta un servicio concreto, tendrá que editar su archivo de configuración Upstart (/etc/init/’servicio’.conf), localice el script del servicio que quieres modificar, ábrelo para editar, y encuentre las líneas que contengan el texto start on y stop on.
Estos archivos suelen tener un formato similar al siguiente:

console.conf

Vemos la cadena start on y stop on runlevel, seguidas de [2345] y [!2345], en este caso se indica que el servicio ssh se inicie en los modos 2345 y sea detenido para cualquier modo distinto (!) de los indicados, también 2345.

Podemos ver cadenas de start on mas complejas en las que se hace uso de mountall, es un demonio propio de Debian y Ubuntu que se encarga de montar los sistemas de ficheros que se especifican en /etc/fstab y /lib/init/fstab, y que además emite una serie de eventos útiles cuando estos son o no montados como por ejemplo:

  • mounting: Emitido cuando un sistema de archivos en particular está a punto de ser montado.
  • mounted: Emitido cuando un sistema de archivos en particular ha sido montado correctamente.
  • all-swaps: Se emite cuando se montan todos los dispositivos de intercambio
  • filesystem: Una vez que todos los sistemas de archivos han sido montados (o intentado)
  • virtual-filesystem: Emitida después de que se haya montado el último sistema de archivos virtual
  • local-filesystem y remote-filesystem: Cuando el último sistema de archivos local o remoto (respectivamente) hayan sido montado

Por lo tanto podemos encontrar entradas como esta:

mountall

Existen situaciones en las que nos interesa que un proceso se restaure automáticamente como por ejemplo en casos de fallos y cierres inesperados del servicio, para ello Upstart (al igual que SysV) ofrece el comando respawn con el que además podemos especificar límites como en el caso de la imagen (respawn 10 5) que viene a significar que si el proceso se reinicia mas de 10 veces en 5 segundos, finalice definitivamente.

Nota: Para un proceso, un ‘cierre inesperado’ será siempre que no se detenga con la orden stop, mientras que para una tarea es cuando el código de retorno sea diferente a 0.

Se pueden seleccionar secciones del archivo .conf, como por ejemplo en nuestro caso aparece pre-start script que indica que los siguientes comandos sean ejecutados antes de que el servicio sea arrancado

Podemos habilitar los trabajos de usuarios para permitir que los usuarios tengan acceso a los métodos y propiedades de Upstart, el archivo para esto es /etc/dbus-1/system.d/Upstart.conf, los trabajos de usuario se encuentran en ~/.init

Para ver los comandos que podemos utilizar dentro de un archivo .conf viste la web: http://upstart.ubuntu.com/wiki/Stanzas

Para mas información podemos acudir a la siguiente página, donde aprenderemos incluso a crear nuestros propios archivos de configuración de servicios: http://upstart.ubuntu.com/cookbook/

Comando initctl: Administrando init en Upstart

initctl: Permite al administrador comunicarse e interactuar con el demonio init de Upstart. Nos permite iniciar, detener, comprobar el estado, etc… de los servicios.

initctl [opciones] comando [opciones comandos] servicio|job

Comandos:

  • start, stop, restart, status: Inicia, detiene, reinicia y comprueba el estado de un servicio respectivamente.
  • reload: Recarga el archivo de configuración (servicio.conf)
  • list: Lista que muestra el nombre del servicio, su estado y su PID
  • reload-configuration: Recarga el archivo de configuración/preferencias de un servicio (smb.conf). Ya no es necesario, gracias a inotify.
  • show-config: Muestra el contenido del archivo de configuración del JOB. Podremos ver en que niveles arranca, etc…
  • check-config: Comprueba la configuración del servicio. Es útil cuando algún servicio no se inicia o detiene con normalidad
Anuncios

Deja un comentario, Gracias!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: