NOMBRE¶
boot-scripts - 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/
VÉASE TAMBIÉN¶
inittab(5),
bootparam(7),
init(8),
runlevel(8),
shutdown(8)