inicio - Proceso de inicio de sistemas basados en la versión 4 de System
V de Unix
El
proceso de incio (o "secuencia de inicio") varía en
ciertos detalles entre sistemas, pero puede dividirse en varias etapas en base
al componente que lo controle:
- (1)
- hardware
- (2)
- cargador de inicio del sistema operativo
- (3)
- núcleo
- (4)
- proceso base en espacio de usuario (init e
inittab)
- (5)
- scripts de inicio
A continuación se describe cada uno de ellos con mayor detalle.
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). Por razones históricas de los PC, a este programa
se suele denominar
BIOS.
Este programa normalmente hace una autocomprobación básica del
equipo y accede a la memoria no volátil para leer parámetros
adicionales. En el PC, esta memoria es de tipo 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).
La cantidad de parámetros almacenados en la NVRAM varía entre
sistemas, pero debería -como mínimo- definir qué
dispositivo puede proporcionar un cargador para el sistema operativo o en
cuales se debería comprobar si existe uno. Este dispositivo se conoce
como
dispositivo de inicio. Durante la primera etapa de inicio
(hardware) se carga el cargador del sistema operativo desde una
posición definida del dispositivo de inicio y luego se le transfiere el
control.
- Nota:
- El dispositivo desde el que se cargará el sistema
operativo puede estar acoplado al equipo a través de una red, en
cuyo caso los detalles para el inicio se darán mediante protocolos
como DHCP, TFTP, PXE, Etherboot, etc...
La principal tarea del cargador de inicio es localizar el núcleo,
cargarlo y ejecutarlo. La mayoría de cargadores de inicio 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.
Tradicionalmente, en los PC, el cargador del SO está localizado en el
primer sector del dispositivo de inicio - es el llamado
MBR (Master
Boot Record).
En la mayoría de los sistemas, este cargador de inicio 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 los PC (512 bytes
incluyendo la tabla de particiones) hace casi imposible introducir un cargador
de inicio completo dentro de él.
La mayoría de sistemas operativos dividen la tarea de iniciarse entre un
cargador de inicio primario y otro secundario; éste último puede
estar localizado dentro dentro de otra partición mayor de
almacenamiento permanente como por ejemplo una partición de disco.
En linux, el cargador de inicio suele ser
lilo(8) o
grub(8).
Una vez que se carga el núcleo, éste inicializa diversos
componentes del equipo y del sistema operativo. Cada porción de
software responsable de esta tarea se suele considerar un
controlador o
driver para dicho componente. El núcleo arranca el
intercambiador de memoria virtual (es un proceso del núcleo llamado
"kswapd" en los núcleos recientes de Linux) y monta el
sistema de archivos 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 archivos raíz por defecto). Para más
información sobre los parámetros del núcleo Linux
consulte
bootparam(7).
Después de esto, el núcleo creará el primer proceso en
espacio de usuario al que asigna como número de
PID (ID de
proceso) el número 1. Tradicionalmente, este proceso ejecuta el
programa
/sbin/init, pasándole cualquier parámetro que no
haya podido ser manejado por el núcleo.
- Nota:
- La siguiente descripción es de aplicación en
sistemas operativos basados en la versión 4 de System V de UNIX.
Muchos sistemas ampliamente utiizados adoptaron un sistema relacionado
pero con una base diferente conocido como systemd(1) en el cual el
proceso de inicio se describe en su bootup(7) asociado.
Cuando se inicia
/sbin/init, éste lee
/etc/inittab en busca
de instrucciones. En este archivo se define qué debe ejecutarse
según el
nivel de ejecución permitiendo al administrador
del sistema definir el entorno para ciertos usos de forma sencilla. Cada nivel
de ejecución está asociado a un conjunto de servicios. Por
ejemplo: el nivel de ejecución
S es el modo
monousuario y
el nivel de ejecución
2 implica la ejecución de la
mayoría de servicios de red.
El administrador puede modificar el nivel de ejecución actual mediante
init(1) y ver el que está actualmente en ejecución con
runlevel(8).
Sin embargo, puesto que no es conveniente gestionar los servicios individuales
editando directamente este archivo,
/etc/inittab solamente lanza un
conjunto de scripts que son los que realmente arrancan/paran los servicios
individuales.
- Nota:
- La siguiente descripción se aplica a los sistemas
basados en la versión de Unix System V. Sin embargo, algunos
sistemas ampliamente usados (Slackware Linux, FreeBSD, OpenBSD) tienen una
estructura para los scripts de inicio algo diferente.
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' (haciendo
que se inicie el servicio) y la palabra 'stop' (hace que se detenga).
También podrán aceptar otros argumentos a conveniencia como por
ejemplo 'restart' que hace que se detenga y se vuelva a iniciar, 'status' que
muestra el estado en que se encuentra el servicio, etc... Si se ejecuta sin
ningún argumento, se listan todas las posibilidades que ofrece.
Para conseguir que ciertos scripts se inicien o se paren en diferentes niveles
de ejecución y en un orden concreto, 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
/etc/init.d.
Un script principal (normalmente
/etc/rc) se invoca desde
inittab(5) y es el encargado de invocar 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, deteniendo el
servicio).
Para establecer el orden de inico o parada 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 ocurriría
después de ejecutar
/etc/rc2.d/S12syslog pero antes de ejecutar
/etc/rc2.d/S90xfs.
Para gestionar el orden de inicio y los niveles de ejecución, tenemos que
manejar estos enlaces. En muchos sistemas, existen herramientas que para esta
tarea (p.ej:
chkconfig(8)).
Una aplicación que proporciona un servicio suele denominarse
demonio. 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 inicio, se utilizan los archivos
de configuración. Éstos están localizados en un
directorio específico (
/etc/sysconfig en sistemas RedHat
antiguos) y son utilizados por los scripts de inicio.
En versiones antiguas de Unix, estos archivos contenían las opciones de
línea de órdenes reales para un demonios, pero en sistemas Linux
modernos (y también en HP-UX), tan solo contienen variables de la
shell. Los scripts de inicio en
/etc/init.d leen e incluyen sus
archivos de configuración y usan los valores de las variables.
/etc/init.d/,
/etc/rc[S0-6].d/,
/etc/sysconfig/
init(1),
systemd(1),
inittab(5),
bootparam(7),
bootup(7),
runlevel(8),
shutdown(8)
La traducción al español de esta página del manual fue
creada por Miguel Pérez Ibars <
[email protected]> y Marcos
Fouces <
[email protected]>
Esta traducción es documentación libre; lea la
GNU
General Public License Version 3 o posterior con respecto a las
condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.
Si encuentra algún error en la traducción de esta página
del manual, envíe un correo electrónico a
[email protected]