boot-scripts(7) Descripción general de la secuencia de arranque

DESCRIPCIÓN

La secuencia de arranque varía de un sistema a otro pero se puede dividir básicamente en los siguientes pasos: (i) arranque del hardware, (ii) cargador del SO, (iii) puesta en marcha del núcleo, (iv) init e inittab, (v) scripts de arranque. Describiremos cada uno de estos pasos a continuación con más detalle.

Arranque del hardware

Después de pulsar el botón de encendido o el botón reset, se pasa el control a un programa almacenado en memoria de sólo lectura (normalmente PROM). En los PC a este programa se le denomina habitualmente BIOS.

Este programa normalmente hace una comprobación básica de la máquina y accede a memoria no volátil para leer parámetros adicionales. En el PC, esta memoria es CMOS con respaldo de batería, por lo que la mayoría de la gente se refiere a ella como CMOS, aunque fuera del mundo del PC se le llama usualmente nvram (non-volatile ram, RAM no volátil).

Los parámetros almacenados en la memoria nvram varían entre sistemas, pero como mínimo el programa de arranque debe saber cuál es el dispositivo de arranque, o qué dispositivos probar como posibles dispositivos de arranque.

Después se accede al dispositivo de arranque, se trae a memoria el cargador del S0, que está localizado en una posición fija de este dispositivo y se le transfiere el control a éste.

Nota:
Aquí no estamos tratando cómo arrancar desde la red. Aquellos que quieran investigar sobre este tema pueden mirar: DHCP, TFTP, PXE, Etherboot.

Cargador del S0

En los PC, el cargador del SO está localizado en el primer sector del dispositivo de arranque - es el llamado MBR (Master Boot Record).

En la mayoría de los sistemas, este cargador primario está limitado en base a varias restricciones. Incluso en sistemas que no son PC hay algunas limitaciones al tamaño y complejidad del cargador, así que, la limitación de tamaño del MBR en PCs (512 bytes incluyendo la tabla de particiones) hace casi imposible introducir un gestor de arranque completo dentro de él.

Además, la mayoría de sistemas operativos hacen que el cargador primario llame a un cargador secundario que puede estar localizado en una partición del disco especificada.

En Linux el gestor de arranque es normalmente lilo(8) o grub(8). Ambos pueden instalarse o bien como cargadores secundarios (donde el MBR instalado por el DOS apunta a ellos), o como un cargador en dos partes donde son ellos los que proporcionan un MBR especial que contiene el código de arranque necesario para cargar la segunda parte del cargador desde la partición raíz.

La principal tarea del gestor de arranque es localizar el núcleo en disco, cargarlo y ejecutarlo. La mayoría de gestores de arranque permiten un uso interactivo, para poder especificar un núcleo alternativo (posiblemente una copia de seguridad en caso de que el último núcleo compilado no funcione) y para pasar parámetros opcionales al núcleo.

Puesta en marcha del núcleo

Una vez que se carga el núcleo, éste inicializa los dispositivos (a través de sus drivers), arranca el intercambiador o swapper (es un "proceso del núcleo", llamado kswapd en los núcleos Linux modernos) y monta el sistema de ficheros raíz (/).

Algunos de los parámetros que se le pueden pasar al núcleo están relacionados con estas actividades (p.e: puede sobreescribir el sistema de ficheros raíz por defecto). Para más información sobre los parámetros del núcleo Linux lea bootparam(7).

Sólo después el núcleo crea el primer proceso (en espacio de usuario) al que asigna el número 1. Este proceso ejecuta el programa /sbin/init, pasándole cualquier parámetro que no haya podido ser manejado por el núcleo.

Init e inittab

Cuando init comienza lee el fichero /etc/inittab para obtener más instrucciones. Este fichero define lo que debería ejecutarse en los diferentes "niveles de ejecución" (run-levels).

Esto proporciona al administrador del sistema un sencillo esquema de gestión, donde cada nivel de ejecución se asocia con un conjunto de servicios (p.e.: S es mono-usuario, en el nivel 2 se inician la mayoría de servicios de red, etc.). El administrador puede cambiar el nivel de ejecución actual con init(8) y consultarlo con runlevel(8).

Sin embargo, puesto que no es conveniente gestionar los servicios individuales editando directamente este fichero, inittab solamente lanza un conjunto de scripts que son los que realmente arrancan/paran los servicios individuales.

Scripts de arranque

Nota:
La siguiente descripción se aplica a los sistemas basados en SYSV-R4, que actualmente siguen la mayoría de los Unix comerciales (Solaris, HPUX, Irix, Tru64) así como la mayor parte de las distribuciones Linux (RedHat, Debian, Mandrake, Suse, Caldera). Algunos sistemas (Slackware Linux, FreeBSD, OpenBSD) tienen un esquema un tanto diferente de scripts de arranque.

Para cada servicio gestionado (mail, nfs server, cron, etc.) hay un único script de inicialización ubicado en un directorio específico (/etc/init.d en la mayoría de versiones de Linux). Cada uno de estos scripts acepta como único argumento la palabra `start', que provoca el arranque del servicio, o la palabra `stop', que provoca que se pare el servicio. Opcionalmente el script puede aceptar otros parámetros de "conveniencia" (p.e: `restart', para parar y arrancar, `status' para mostrar el estado del servicio). Ejecutar el script sin parámetros nos mostrará los posibles argumentos.

Directorios de ejecución en orden

Para conseguir que ciertos scripts determinados se inicien o se paren en diferentes niveles de ejecución y en un orden específico, se crearon los directorios de ejecución en orden. Se encuentran habitualmente en /etc/rc[0-6S].d. En cada uno de estos directorios hay enlaces (normalmente simbólicos) a los scripts que se encuentran en el directorio init.d.

Un script principal (normalmente /etc/rc) es llamado desde inittab(5) y es el encargado de invocar a los scripts de servicios a través de los enlaces de los directorios de ejecución en orden. Todos los enlaces cuyo nombre comienza con `S' son invocados con el argumento `start' (por tanto, iniciando el servicio). Todos los enlaces que comienzan con `K' son invocados con el argumento `stop' (por tanto, parando el servicio).

Para establecer el orden dentro de un mismo nivel de ejecución, los nombres de los enlaces contienen números de orden. Además, para hacer los nombres más claros, éstos terminan habitualmente con el nombre del servicio al que se refieren. Ejemplo: el enlace /etc/rc2.d/S80sendmail lanza el servicio sendmail en el nivel de ejecución 2. Esto ocurre despues de ejecutar /etc/rc2.d/S12syslog pero antes de ejecutar /etc/rc2.d/S90xfs.

Para gestionar el orden de arranque y los niveles de ejecución, tenemos que manejar estos enlaces. Sin embargo, en muchas versiones de Linux, hay disponibles herramientas que nos ayudan con esta tarea (p.e: chkconfig(8)).

Configuración del arranque

Normalmente, los demonios lanzados pueden recibir opciones y parámetros en la línea de órdenes de manera opcional. Para permitir a los administradores de sistemas cambiar estos parámetros sin editar los scripts de arranque por ellos mismos, se utilizan los ficheros de configuración. Éstos están localizados en un directorio específico (/etc/sysconfig en sistemas RedHat) y son utilizados por los scripts de arranque.

En versiones antiguas de Unix, estos ficheros contenían las opciones de línea de órdenes reales para los demonios, pero en sistemas Linux modernos (y también en HPUX), estos ficheros tan solo contienen variables del intérprete de órdenes. Los scripts de arranque en /etc/init.d cargan los ficheros de configuración y usar los valores de las variables.

FICHEROS

/etc/init.d/, /etc/rc[S0-6].d/. /etc/sysconfig/