8.2. Proceso init

El programa init, cuyo ID de proceso es el 1, es responsable de iniciar el sistema en el modo requerido y desempeña además una función especial. Se inicia directamente mediante el núcleo y resiste la señal 9, que generalmente cierra todos los procesos. Los demás programas se inician directamente mediante init o mediante uno de sus subprocesos.

init se configura en el archivo /etc/inittab en el que están definidos los niveles de ejecución (consulte la Sección 8.2.1, “Niveles de ejecución”). El archivo también especifica qué servicios y daemons están disponibles para cada uno de los niveles. En función de las entradas en /etc/inittab, init ejecutará varios guiones. Por razones de claridad, estos guiones, denominados init scripts, están ubicados en el directorio /etc/init.d (consulte la Sección 8.2.2, “Guiones init”).

init se encarga de todo el proceso de encendido y apagado del sistema. Desde este punto de vista, el núcleo se puede considerar un proceso en segundo plano cuya tarea es mantener el resto de procesos y ajustar el tiempo de la CPU y el acceso de hardware en función de las peticiones de otros programas.

8.2.1. Niveles de ejecución

En Linux, los niveles de ejecución definen cómo se inicia el sistema y qué servicios están disponibles en el sistema en funcionamiento. Después del arranque, el sistema se inicia tal y como se ha explicado en /etc/inittab en la línea initdefault. Generalmente, esto es 3 o 5. Consulte la Tabla 8.1, “Niveles de ejecución disponibles”. Como alternativa, el nivel de ejecución se puede especificar durante el arranque (por ejemplo, en el indicador de inicio). Los parámetros que el núcleo no evalúa directamente pasan a init.

Tabla 8.1. Niveles de ejecución disponibles

Nivel de ejecución

Descripción

0

Parada del sistema

propiedades

Modo monousuario; en el indicador de inicio, sólo para asignaciones de teclado de EE.UU.

1

Modo monousuario

2

Modo multiusuario local sin red remota (NFS, etc.)

3

Modo multiusuario completo con red

4

No utilizado

5

Modo multiusuario completo con red y gestor de pantalla X (KDM, GDM o XDM)

6

Reinicio del sistema

[Important]evite el nivel de ejecución 2 con una partición montada a través de NFS

No se debe utilizar el nivel de ejecución 2 si el sistema monta una partición como /usr a través de NFS. El sistema podría comportarse de modo inesperado si faltan archivos de programa o bibliotecas debido a que el servicio NFS no está disponible en el modo de ejecución 2 (modo multiusuario local sin red remota).

Para cambiar los niveles de ejecución mientras el sistema se esté ejecutando, introduzca telinit y el número correspondiente como argumento. Únicamente el administrador del sistema tiene permiso para realizar esta operación. La siguiente lista resume los comandos más importantes del área de niveles de ejecución.

telinit 1 o shutdown now

El sistema cambia a modo monousuario. Este modo se utiliza para las tareas de administración y mantenimiento del sistema.

telinit 3

Todos los programas y servicios fundamentales (incluida la red) se inician y los usuarios normales pueden iniciar sesión y trabajar en el sistema sin necesidad de un entorno gráfico.

telinit 5

Se habilita el entorno gráfico. Normalmente se inicia un gestor de pantalla como XDM, GDM o KDM. Si está habilitado el inicio de sesión automático, se inicia la sesión del usuario local en el gestor de ventanas preseleccionado (GNOME, KDE o cualquier otro gestor de ventanas).

telinit 0 o shutdown -h now

El sistema se detiene.

telinit 6 o shutdown -r now

El sistema se detiene y, a continuación, se reinicia.

El nivel de ejecución 5 es el nivel por defecto en todas las instalaciones estándar SUSE Linux. Se solicita a los usuarios que inicien la sesión con una interfaz gráfica o se inicia la sesión del usuario por defecto automáticamente. El nivel de ejecución por defecto es 3, X Window System debe configurarse correctamente, tal y como se describe en el Capítulo 14, El sistema X Window, antes de que el nivel de ejecución pase a 5. A continuación, compruebe si el sistema funciona como se espera introduciendo telinit 5. Si todo funciona tal y como se espera, puede utilizar YaST para establecer el nivel de ejecución por defecto en 5.

Generalmente, ocurren dos cosas al cambiar los niveles de ejecución. En primer lugar, se inician los guiones de detención del nivel de ejecución actual al mismo tiempo que se cierran algunos programas fundamentales para el nivel de ejecución. A continuación, se inician los guiones de inicio del nuevo nivel de ejecución. En este paso y en la mayoría de los casos, se inician algunos programas. Por ejemplo, al cambiar del nivel de ejecución 3 al 5, sucede lo siguiente:

  1. El administrador (root) solicita a init que cambie a un nivel de ejecución diferente introduciendo telinit 5.

  2. init consulta su propio archivo de configuración (/etc/inittab) y determina si debe iniciar /etc/init.d/rc con el nuevo nivel de ejecución como parámetro.

  3. Ahora rc llama a todos los guiones de detención del nivel de ejecución actual, pero en el nivel de ejecución nuevo, sólo a aquéllos para los que no existe un guión de inicio. En este ejemplo, aparecen todos los guiones ubicados en /etc/init.d/rc3.d (el nivel de ejecución antiguo era 3) y que comiencen por la letra K. El número que sigue a la letra K especifica el orden de inicio, puesto que es necesario tener en cuenta algunas dependencias.

  4. Los últimos elementos que se inician son los guiones de inicio del nivel de ejecución nuevo. En este ejemplo, éstos se ubican en /etc/init.d/rc5.d y comienzan con S. Aquí, también se aplica el mismo procedimiento para el orden en el que se inician.

Al cambiar al mismo nivel de ejecución que el actual, init sólo comprueba si existen cambios en /etc/inittab y lleva a cabo los pasos adecuados, por ejemplo, para iniciar un getty en otra interfaz. Se puede conseguir la misma funcionalidad con el comando telinit q.

8.2.2. Guiones init

Existen dos tipos de guiones en /etc/init.d:

Guiones ejecutados directamente por init

Únicamente durante el proceso de arranque o si el sistema se ha apagado de forma inmediata (debido a un fallo en la alimentación o si el usuario ha pulsado Ctrl-Alt-Del). La ejecución de estos guiones se describe en /etc/inittab.

Guiones ejecutados indirectamente por init

Se ejecutan al cambiar el nivel de ejecución y siempre llaman al guión maestro /etc/init.d/rc, que garantiza el orden correcto de los guiones correspondientes.

Todos los guiones se ubican en /etc/init.d. Para llamar a los guiones que se ejecutan durante el arranque, se utilizan enlaces simbólicos de /etc/init.d/boot.d. Para llamar a los guiones que se encargan de cambiar el nivel de ejecución, se utilizan enlaces simbólicos desde un subdirectorio (de /etc/init.d/rc0.d a /etc/init.d/rc6.d). Esto se debe a razones de claridad y evita la creación de guiones duplicados al utilizarlos en varios niveles de ejecución. Puesto que cada guión se puede ejecutar como guión de inicio o de detención, estos guiones deben poder admitir los parámetros de start y stop. Los guiones también admiten las opciones restart (reiniciar), actualizar, force-reload (forzar-actualizar) y estado. Estas opciones se explican en la Tabla 8.2, “Posibles opciones del guión init”. Los guiones ejecutados directamente mediante init no disponen de estos enlaces. Cuando sea necesario, se ejecutan de forma independiente desde el nivel de ejecución.

Tabla 8.2. Posibles opciones del guión init

Opción

Descripción

start

Inicia el servicio.

stop

Detiene el servicio.

restart

Si el servicio está en funcionamiento, lo detiene y, a continuación, lo reinicia. Si no está en funcionamiento, lo inicia.

actualizar

Actualiza la configuración sin detener ni reiniciar el servicio.

force-reload (forzar-actualizar)

Actualiza la configuración si el servicio es compatible con esta función. De lo contrario, realiza lo mismo que si la opción fuese restart (reiniciar).

status

Muestra el estado actual del servicio.

Los enlaces de cada subdirectorio específico del nivel de ejecución permiten asociar guiones a diferentes niveles de ejecución. Al instalar o desinstalar los paquetes, estos enlaces se agregan y se eliminan mediante el insserv del programa (o utilizando /usr/lib/lsb/install_initd, guión que ejecuta este programa). Para obtener más información, consulte la página Man de insserv(8).

A continuación, se ofrece una introducción corta de los guiones de arranque y detención ejecutados en primer o último lugar, así como una explicación del guión de mantenimiento.

boot

Ejecutado al iniciar el sistema directamente mediante init. Es independiente del nivel de ejecución seleccionado y sólo se ejecuta una vez. Aquí, se montan los sistemas de archivos proc y pts y se activa blogd (daemon de inicio de sesión de arranque). Si se arranca el sistema por primera vez después de una actualización o una instalación, se inicia la configuración del sistema inicial.

El daemon blogd es un servicio iniciado por boot y rc antes que cualquier otro. Se detiene una vez completadas las acciones originadas por los guiones anteriores (por ejemplo, ejecución de varios guiones). blogd escribe cualquier salida de pantalla en el archivo de registro /var/log/boot.msg, pero sólo si /var está montado en lectura-escritura. De lo contrario, blogd mantiene en el búfer todos los datos de la pantalla hasta que /var esté disponible. Puede obtener más información acerca de blogd en la página Man de blogd(8).

El guión boot también se encarga del inicio de todos los guiones en /etc/init.d/boot.d con un nombre que empieza por S. Los sistemas de archivos se comprueban y los dispositivos loop se configuran si fuese necesario. También se establece la hora del sistema. Si se produce un error durante la comprobación y la reparación automática del sistema de archivos, el gestor del sistema puede intervenir después de haber introducido la contraseña root. El último guión ejecutado es el boot.local.

boot.local

Introduzca aquí los comandos adicionales para ejecutar durante el arranque antes de cambiar a un nivel de ejecución. Se puede comparar a AUTOEXEC.BAT en sistemas DOS.

boot.setup

Este guión se ejecuta al cambiar del modo monousuario a cualquier otro nivel de ejecución y es responsable de varios ajustes básicos, como la distribución del teclado y la inicialización de las consolas virtuales.

halt

Este guión sólo se ejecuta durante el cambio al nivel de ejecución 0 o 6. Se ejecuta como halt o como reboot. El apagado o la reinicialización del sistema dependen de como se ha ejecutado halt.

rc

Este guión ejecuta los guiones adecuados del nivel de ejecución actual e inicia los guiones del nuevo nivel de ejecución seleccionado.

Puede crear sus propios guiones e integrarlos fácilmente en el esquema descrito anteriormente. Si desea obtener instrucciones sobre el formato, el nombre y la organización de guiones personalizados, consulte las especificaciones de LSB y las páginas Man de init, init.d e insserv. También puede consultar las páginas Man de startproc y killproc.

[Warning]Los guiones init incorrectos pueden detener el sistema.

Los guiones init incorrectos pueden bloquear la máquina. Edite esos guiones con cuidado y, si es posible, realice una comprobación exhaustiva en el entorno multiusuario. Puede encontrar información útil acerca de los guiones init en la Sección 8.2.1, “Niveles de ejecución”.

Para crear un guión init personalizado para un determinado programa o servicio, utilice como plantilla el archivo /etc/init.d/skeleton. Guarde una copia de este archivo con un nombre nuevo y edite el programa y los nombres de archivos, las vías y otros detalles correspondientes si fuese necesario. Puede que necesite mejorar el guión con código propio, por lo que las acciones correctas se originan mediante el procedimiento init.

El bloque INIT INFO de la parte superior es un componente necesario del guión y debe editarse. Consulte el Ejemplo 8.1, “Bloque INIT INFO mínimo”.

Ejemplo 8.1. Bloque INIT INFO mínimo

### BEGIN INIT INFO
# Provides:          FOO
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Description:       Start FOO to allow XY and provide YZ
### END INIT INFO
    

En la primera línea del bloque INFO, después de Provides:, especifique el nombre del programa o servicio controlado por el guión init. En las líneas Required-Start: y Required-Stop:, especifique todos los servicios que deban iniciarse o detenerse antes de que se inicie o se detenga el propio servicio. Esta información se utilizará más adelante para generar la numeración de los nombres de guiones, tal y como aparecen en los directorios del nivel de ejecución. Después de Default-Start: y Default-Stop:, especifique los niveles de ejecución en los que el servicio debería iniciarse o detenerse automáticamente. Por último, en Description:, proporcione una descripción corta del servicio en cuestión.

Para crear los enlaces desde los directorios de nivel de ejecución (/etc/init.d/rc?.d/) a los guiones correspondientes en /etc/init.d/, introduzca el comando insserv new-script-name. El programa insserv evalúa el encabezado INIT INFO para crear los enlaces necesarios para iniciar y detener guiones en los directorios de nivel de ejecución (/etc/init.d/rc?.d/). El programa también se encarga del orden de inicio y detención correcto de cada nivel de ejecución al incluir los números necesarios en los nombres de los enlaces. Si prefiere una herramienta gráfica para crear dichos enlaces, utilice el editor de niveles de ejecución proporcionado por YaST, tal y como se describe en la Sección 8.2.3, “Configuración de los servicios de sistema (nivel de ejecución) mediante YaST”.

Si un guión que ya aparece en /etc/init.d/ debe integrarse en el esquema de nivel de ejecución existente, cree los enlaces en los directorios de nivel de ejecución mediante insserv o habilitando el correspondiente servicio en el editor de niveles de ejecución de YaST. Los cambios que haya realizado se aplicarán durante el siguiente arranque; el nuevo servicio se iniciará automáticamente.

No establezca estos enlaces de forma manual. Si algo no funciona en el bloque INFO, surgirán problemas cuando se ejecute insserv más adelante para algún otro servicio. El servicio que se añade manualmente se suprimirá cuando se vuelva a ejecutar insserv.

8.2.3. Configuración de los servicios de sistema (nivel de ejecución) mediante YaST

Después de iniciar el módulo YaST mediante YaST+Sistema+Servicios del sistema (niveles de ejecución), éste muestra una descripción general que enumera todos los servicios disponibles y el estado actual de cada servicio (inhabilitado o habilitado). Decida si desea utilizar el módulo en Modo simple o en Modo avanzado. El Modo simple por defecto debe ser suficiente para la mayoría de finalidades. La columna de la izquierda muestra el nombre del servicio, la columna del centro indica su estado actual y la de la derecha proporciona una descripción corta. Para el servicio seleccionado, se proporciona una descripción detallada en la parte inferior de la ventana. Para habilitar un servicio, selecciónelo en la tabla y, a continuación, elija Habilitar. Se aplican los mismos pasos para inhabilitar un servicio.

Figura 8.1. Servicios de sistema (nivel de ejecución)

Servicios de sistema (nivel de ejecución)

Para llevar a cabo un control detallado de los niveles de ejecución en los que se inicia o se detiene el servicio, o para cambiar el nivel de ejecución por defecto, primero seleccione Modo avanzado. En la parte superior aparecerá el nivel de ejecución por defecto en curso o “initdefault” (el nivel de ejecución en el que se arranca por defecto el sistema). Generalmente, el nivel de ejecución por defecto de un sistema SUSE Linux es el 5 (modo multiusuario completo con red y X). Otra opción podría ser el nivel de ejecución 3 (modo multiusuario completo con red).

El cuadro de diálogo YaST permite seleccionar uno de los niveles de ejecución (tal y como aparecen en la lista de la Tabla 8.1, “Niveles de ejecución disponibles”) como el nuevo nivel por defecto. Además, utiliza la tabla de esta ventana para habilitar o inhabilitar servicios y daemons individuales. La tabla enumera los servicios y daemons disponibles, muestra si están actualmente habilitados en el sistema y, si es así, en qué niveles de ejecución. Después de haber seleccionado una de las filas con el ratón, haga clic en las casillas de verificación que representan los niveles de ejecución (B, 0, 1, 2, 3, 5, 6 y S) para definir los niveles en los que el servicio o daemon seleccionado debería ejecutarse. El nivel de ejecución 4 no está inicialmente definido para permitir la creación de un nivel personalizado. A continuación, en la descripción general de la tabla, se proporciona una descripción corta del actual servicio o daemon seleccionado.

Mediante Start (Iniciar), Detener o Actualizar, decida si se debe activar un servicio. Refrescar estado comprueba el estado actual. Set or Reset (Ajustar o Reajustar) le permite seleccionar si desea aplicar los cambios al sistema o restaurar los ajustes existentes antes de iniciar el editor de nivel de ejecución. Al seleccionar Finalizar se guardarán los ajustes modificados en el disco.

[Warning]Los ajustes de nivel de ejecución incorrectos pueden dañar el sistema.

Los ajustes de nivel de ejecución incorrectos pueden inhabilitar el sistema. Antes de aplicar los cambios, asegúrese de que conoce las consecuencias.