9.1. Arranque del sistema
Cuando inicia el equipo, los muchos mensajes que aparecen en la pantalla muestran varias inicializaciones y configuraciones automáticas que se están ejecutando. Algunas veces deseará alterar ligeramente cómo funciona esta etapa, lo que significa que necesitará entenderlas bien. Éste es el propósito de esta sección.
Primero el BIOS toma el control del equipo, detecta los discos, carga el registro maestro de arranque («MBR») y ejecuta el gestor de arranque. Este toma el control, busca el núcleo en el disco, lo carga y lo ejecuta. Luego se inicializa el núcleo y empieza la búsqueda y montaje de la partición que contiene el sistema de archivos raíz y finalmente ejecuta el primer programa — init
. Frecuentemente esta «partición raíz» y su init
están, de hecho, ubicados en un archivo virtual del sistema que sólo existe en RAM (de aquí el nombre «initramfs», anteriormente llamado «initrd» por «disco RAM de inicialización»: «initialization RAM disk»). El gestor de arranque carga este sistema de archivos en memoria, muchas veces desde un archivo en el disco duro o desde la red. Contiene sólo lo mínimo requerido por el núcleo para cargar el «verdadero» sistema de archivos raíz: estos pueden ser módulos de controladores para el disco duro u otros dispositivos sin los cuales el sistema no puede iniciar o, más frecuentemente, scripts de inicialización y módulos para ensamblar arreglos RAID, abrir particiones cifradas, activar volúmenes LVM, etc. Una vez que se montó la partición raíz el initramfs entrega el control al verdadero init y la máquina regresa al proceso de inicio estándar.
Actualmente sysv-rc («System V») provee el «init real» y esta sección documenta este sistema de inicio.
Init pone en marcha varios procesos, siguiendo instrucciones del archivo
/etc/inittab
. El primer programa ejecutado (el cual corresponde al paso
sysinit) es
/etc/init.d/rcS
, un script que ejecuta todos los programas en el directorio
/etc/rcS.d/
.
Entre estos encontrará sucesivamente programas a cargo de:
configurar el teclado de la consola;
cargar controladores: el núcleo carga por sí mismo la mayoría de los módulos a medida que el hardware es detectado; los controladores extras se cargan automáticamente cuando los módulos correspondientes son listados en /etc/modules
;
verificar la integridad de los sistemas de archivos;
montar particiones locales;
configurar la red;
montar sistemas de archivos de red (NFS).
Luego de esta etapa, init
toma el control e inicia los programas activados en el nivel de ejecución («runlevel») predeterminado (generalmente el nivel 2). Ejecuta /etc/init.d/rc 2
, un script que inicia todos los servicios enumerados en /etc/rc2.d/
y aquellos cuyos nombres comiencen con la letra «S». Los números de dos cifras que le sigue fueron utilizados históricamente para definir el orden en el que se iniciarán los servicios, pero actualmente el sistema de inicio predeterminado utiliza insserv
, que programa todo automáticamente basándose en las dependencias de los scripts. Cada script de inicio, por lo tanto, declara las condiciones a cumplir para iniciar o detener el servicio (por ejemplo, si debe iniciar antes o después de otro servicio); init
luego los ejecuta en un orden que satisfaga estas condiciones. El enumerado estático de los scripts ya no se tiene en cuenta (pero sus nombres siempre deben comenzar con «S» seguidos de dos números y el nombre real del script utilizado para dependencias). Generalmente, se inician primero los servicios de base (como los registros con rsyslogd
o la asociación de puertos con portmap
) seguidos de los servicios estándar y la interfaz gráfica (gdm
).
Este sistema de inicio basado en dependencias hace posible renumerar automáticamente los scripts, lo que sería tediososo de hacer manualmente y limita el riesgo de error humano ya que se realiza la programación según los parámetros indicados. Otro beneficio es que se pueden iniciar los servicios en paralelo cuando son independientes entre ellos, lo cual puede acelerar el proceso de inicio.
init
distingue varios niveles de ejecución («runlevel») y puede cambiar de uno a otro ejecutando telinit nuevo-nivel
. Inmediatamente, init
ejecuta nuevamente /etc/init.d/rc
con el nuevo nivel de ejecución. Luego, este script ejecutará los servicios faltantes y detendrá aquellos que ya no se desean. Para hacerlo, se refiere al contenido del archivo /etc/rcX.d
(donde X representa el nuevo nivel de ejecución). Los scripts cuyos nombres comienzan con «S» (por «start», iniciar) son los servicios a iniciar; aquellos cuyos nombres comienzan con «K» (por «kill», matar) son los servicios a detener. El script no inicia ningún servicio que ya haya estado activo en el nivel de ejecución anterior.
De forma predeterminada, Debian utiliza cuatro niveles de ejecución diferentes:
Nivel 0: sólo se lo utiliza temporalmente mientras se apaga el equipo. Como tal, sólo contiene scripts «K».
Nivel 1: también conocido como modo de usuario único, corresponde al sistema en modo degradado; sólo incluye servicios básicos y está destinado a operaciones de mantenimiento donde no se desea la interacción con usuarios normales.
Nivel 2: es el nivel para operaciones normales, lo que incluye servicios de red, una interfaz gráfica, sesiones de usuario, etc.
Nivel 6: similar a nivel 0, excepto a que es utilizada durante la fase de cierre que precede a un reinicio.
Existe otros niveles, especialmente del 3 al 5. De forma predeterminara están configurados para operar de la misma forma que el nivel 2, pero el administrador puede modificarlos (agregando o eliminando scripts en los directorios /etc/rcX.d
correspondientes) para adaptarlos a necesidades particulares.
Todos los scripts en los varios directorios /etc/rcX.d
son sólo enlaces simbólicos — creados durante la instalación del paquete por el programa update-rc.d
— que apuntan a los scripts reales que están almacenados en /etc/init.d/
. El administrador puede ajustar los servicios disponibles en cada nivel de ejecución ejecutando update-rc.d
nuevamente con los parámetros correctos. La página de manual update-rc.d(1) describe la sintaxis en detalle. Sepa que eliminar todos los enlaces simbólicos (con el parámetro remove
) no es un buen método de desactivar un servicio. En su lugar, simplemente debería configurar para que el mismo no se ejecute en el nivel de ejecución deseado (preservando las llamadas para detenerlo en caso que el servicio esté ejecutando en el nivel de ejecución anterior). Debido a que update-rc.d
tiene una interfaz bastante compleja, puede preferir utilizar rcconf
(en el paquete rcconf) que provee una interfaz mucho más amigable.
Finalmente, init
inicia los programas de control para varias consolas virtuales (getty
). Muestra un prompt esperando por un nombre de usuario y luego ejecuta login usuario
para iniciar una sesión.