| Arranque del sistema: Administración de linux: Una guía básica | ||
|---|---|---|
| Anterior | Arranque del sistema | Siguiente |
Es el proceso por el cual el gestor de arranque toma la información necesaria de un dispositivo, la carga en memoria principal y le cede el control de la ejecución.
Aquí hay un detalle que hay que tener en cuenta cuando se instale un sistema operativo. Las ROM BIOS actuales almacena el número de cluster de un disco en una zona de 10 bits, por lo cual la BIOS no es capaz de leer más allá de 1024 cluster. Como en el momento de la carga no hay sistema operativo presente, el núcleo se tiene que leer del dispositivo utilizando los mecanismos de la BIOS. Por este motivo, si tenemos el fichero que contiene el núcleo del sistema operativo más allá del sector 1024 entonces no podremos cargarlo, la BIOS no podrá leerlo.
Existen otra posibilidad para cargar el núcleo: cargar el núcleo a partir de otro sistema operativo que ya estuviera en funcionamiento, como sería el caso de Loadlin. En este caso necesitamos tener DOS en ejecución, el programa loadlin y un fichero con un núcleo Linux.
En cualesquiera de los casos anteriores, un vez cargado el núcleo del sistema, se procede a activar los procesos que van a definir el comportamiento de nuestro sistema.
En linux existen otros gestores de arranque, entre ellos grub una alternativa que se está imponiendo a lilo.
La primera operación que realiza el núcleo es leer el fichero /etc/inittab que describe qué procesos se inician en la carga y durante la operación normal. Este fichero contiene la configuración del proceso init que siempre tiene el PID 1 como primer proceso del sistema. Init es el padre de todos los procesos, y su misión fundamental es crear los procesos a partir de los guiones indicados en el fichero /etc/inittab.
Init distingue múltiples niveles de ejecución (runlevels), cada uno de los cuales puede tener su propio conjunto de procesos que se inician o se cancelan. Los niveles de ejecución válidos son del 0 al 6, S y s más A, B y C para entradas bajo demanda.
Un nivel de ejecución es una configuración de software que define la existencia de un conjunto de procesos en el sistema. Los procesos levantados mediante init para cada uno de estos niveles de ejecución también se definen en el fichero /etc/inittab. El cambio de nivel de ejecución se realiza medinte la orden init junto con el nivel de ejecución al que se quiere acceder.
Los niveles de ejecución 0, 1 y 6 están reservados. El nivel de ejecución 0 se reserva para detener el sistema y el nivel 6 se utiliza para reiniciarlo. En nivel 1 se utiliza para llevar al sistema al modo monousuario. El nivel de ejecución S en realidad no se usa directamente, sino que toma parte de sus datos del nivel de ejecución 1.
Los niveles de ejecución restantes serían el 2 que corresponde al modo multiusuario sin parte de la configuración de red, el 3 que es un sistema mutiusuario completo, el 4 que no se usa y el 5 que corresponde al modo gráfico.
Los niveles de ejecución del 7 al 9 también serían válidos, pero no se usan.
El fichero /etc/inittab
|
Una entrada del fichero inittab tiene el siguiente formato:
id:niveles_ejecución:acción:proceso
|
Las líneas que comienzan con `#' se consideran comentarios.
id es una secuencia única de 1 a 4 caracteres que identifica una entrada de inittab. Para gettys u otros procesos de presentación al sistema, el campo id debería de ser el sufijo tty de la correspondiente tty, por ejemplo, 1 para tty1. En otro caso, los registros de conexiones puede que no funcionen correctamente.
niveles_ejecución es la lista de niveles de ejecución para lo cuales se llevarán a cabo las acciones especificadas. El campo niveles_ejecución tiene que contener múltiples caracteres para diferente niveles de ejecución. Por ejemplo, 123 especifica que el proceso se debería iniciar en los niveles de ejecución 1, 2 y 3. Las entrada de niveles ejecución bajo demanda pueden contener una A, B, o C. Las entradas de campos de niveles de ejecución para sysinit, boot y bootwait se ignoran. Esto se describe más abajo. Cuando se cambia un nivel de ejecución, cualesquiera procesos en ejecución que no estén especificados en el nuevo nivel de ejecución se matan, primero con SIGTERM y después con SIGKILL.
acción describe qué acción se debería llevar a cabo.
Las acciones válidas para el campo acción son:
respawn El proceso se reiniciará cuando termine (v.g. getty).
wait El proceso se iniciará una vez cuando se entre en el nivel de ejecución especado e init esperará a su terminación.
once El proceso se ejecutará una vez cuando se entre en el nivel de ejecución especificado.
boot El proceso se ejecutará durante el arranque del sistema. El campo niveles_ejecución se ignora.
bootwait El proceso se ejecutará durante el arranque del sistema, mientras init espera su terminación (v.g. /etc/rc). El campo nivel_ejecución se ignora.
off Esto no hace nada.
ondemand Un proceso marcado con un nivel de ejecución ondemand se ejecutará cuando se llame al nivel de ejecución especificado ondemand. Sin embargo, no se produce cambio de nivel de ejecución (los niveles de ejecución ondemand son `a', `b', y `c').
initdefault Una entrada initdefault especifica el nivel de ejecución en el cual se entrará tras el arranque del sistema. Si no existe ninguno, init pedirá un nivel de ejecución en la consola. El campo proceso se ignora.
sysinit El proceso se ejecutará durante el arranque del sistema. Se ejecutará antes de cualquier entrada boot o bootwait. El campo niveles_ejecución se ignora.
powerwait El proceso se ejecutará cuando init reciba la señal SIGPWR, indicando que hay algún problema con la alimentación eléctrica. Init esperará que el proceso termine antes de continuar.
powerfail Como en powerwait, excepto que init no espera que el proceso se complete.
powerokwait El proceso se ejecutará cuando init reciba la señal SIGPWR, con la condición de que haya un fichero llamado /etc/powerstatus que contenga la palabra OK. Esto significa que la alimentación eléctrica ha vuelto.
ctrlaltdel El proceso se ejecutará cuando init reciba la señal SIGINT. Esto significa que alguien en la consola del sistema ha pulsado la combinación de teclas CTRL-ALT-DEL. Normalmente uno quiere ejecutar algún tipo de shutdown, bien para entrar en modo monosuario o reiniciar la máquina.
kbrequest El proceso se ejecutará cuado init reciba una señal del gestor de teclado que se ha pulsado una combinación especial de teclas en el teclado de la consola.
proceso especifica el proceso a ejecutar. Si el campo proceso comienza con un caracter `+', init no registrará utmp y wtmp para ese proceso. Esto es necesario para gettys que insisten en hacer sus propias labores de utmp/wtmp.
Ejemplos
# inittab para linux
id:1:initdefault:
rc::bootwait:/etc/rc.d/rc
1:1:respawn:/etc/getty 9600 tty1
2:1:respawn:/etc/getty 9600 tty2
3:1:respawn:/etc/getty 9600 tty3
4:1:respawn:/etc/getty 9600 tty4
|
Este fichero inittab ejecuta /etc/rc.d/rc durante el arranque e inicia gettys en tty1-tty4. El proceso de arranque toma el nivel de ejecución 1 al iniciar el sistema.
Otro inittab más elaborado con diferentes niveles de ejecución (vea los comentarios interiores):
# Nivel para ejecutar id:2:initdefault:
# Inicialización del sistema antes de cualquier otra cosa.
si::sysinit:/etc/rc.d/bcheckrc
# Nivel de Ejecución 0,6 es halt y reinicio, 1 modo mantenimiento.
l0:0:wait:/etc/rc.d/rc.halt
l1:1:wait:/etc/rc.d/rc.single
l2:2345:wait:/etc/rc.d/rc.multi
l6:6:wait:/etc/rc.d/rc.reboot
# Qué hacer ante el "saludo de 3 dedos".
ca::ctrlaltdel:/sbin/shutdown -t5 -rf now
# Nivel de ejecución 2&3: getty en consola, nivel 3 también getty
# en el puerto del módem.
1:23:respawn:/sbin/getty tty1 VC linux
2:23:respawn:/sbin/getty tty2 VC linux
3:23:respawn:/sbin/getty tty3 VC linux
4:23:respawn:/sbin/getty tty4 VC linux
S2:3:respawn:/sbin/uugetty ttyS2 M19200
|
Ahora un ejemplo del fichero de configuración similar al estilo utilizado por la distribución RedHat.
#
# inittab Este fichero describe como el proceso INIT debería
# configurar el sistema en un cierto nivel de ejecución
#
# Los niveles de ejecución por omisión son:
# 0 - halt (No lo ponga como el nivel de ejecución por omisión )
# 1 - Modo monousurio
# 2 - Modo multiusuario, sin NFS (igual que el 3 si no tiene red)
# 3 - Modo multiusuario completo
# 4 - No se usa
# 5 - X11
# 6 - Reiniciar el sistema (No lo ponga como el nivel de ejecución por omisión )
#
id:3:initdefault:
# Inicialización del sistema
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Las cosas que se ejecutan en todos los niveles de ejecución
ud::once:/sbin/update
# Recoge la pulsación de p CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -h now
# Cuando un SAI (Sistema de Alimentación ininterrumpida) notifica un
# fallo de alimentación eléctrica
# suponemos que tenemos algunos minutos aun de alimentación.
# Notificamos una secuecia de parada en 2 minutos.
# Esto supone que tenemos powerd instalado y su SAI
# funciona correctamente.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# Si se recupera la alimentación antes de que comenzar el shutdown.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Ejecutar en los niveles de ejecución estándares.
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
# Ejecutar xdm en el nivel de ejecución 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon
|
El proceso init puede reiniciarse leyendo las modificaciones del fichero /etc/inittab y comportarse según las modificaciones. Para esto basta enviarle la señal SIGHUP e init leerá su fichero de configuración y se adaptará a sus modificaciones. Para hacer esto es necesario disponer privilegios de root.
# kill -HUP 1
|
Observe que no es necesario reiniciar el sistema para que las modifiaciones sean efectivas, basta con reinciar sólo el proceso init.
Durante el normal funcionamiento del sistema podemos cambiar el nivel de ejecución usando la orden init de la siguiente forma:
# init nivel_ejecución
|
Por ejemplo si ejecutamos
# init 1
|
entraríamos en modo monousuario.
Los cambios de nivel de ejecución suelen ser útiles para realizar tareas de mantenimiento del sistema
Para cambiar el nivel de ejecución necesitamos tener privilegios de root. Un usuario sin privilegios no puede modificar el nivel de ejecución.