ARRANQUE DEL SISTEMA |
4.2 Arrancando el Sistema
Hay varias maneras de arrancar el sistema, bien sea desde disquete o bien desde el disco duro. Antes de esto, aprendamos algo del arranque de Linux.
4.2.1 Comprendiendo el Arranque
Unix es un sistema complejo, y por lo tanto su arranque y parada son más complicados de lo que podrían ser en un
sistema tipo MS-DOS. Tanto el arranque como la parada tienen gran importancia para que el sistema se comporte correctamente.
Al accionar el interruptor se ejecuta un monitor que reside en memoria ROM, cuya misión es cargar en la memoria RAM el
programa almacenado en el sector 0, cilindro 0 del disco duro configurado como unidad de arranque
El programa de arranque almacenado en sector 0, cilindro 0 no es todavía el núcleo del sistema operativo, sino generalmente
un programa cargador que nos permite seleccionar qué sistema operativo deseamos arracancar en ordenadores que pueden ejecutar
más de un sistema operativo.
La misión del programa cargador es localizar en el disco duro el código del núcleo del sistema operativo, llevarlo a
memoria y posteriormente cederle el control. En ciertas ocasiones también se encarga de pasar algún parámetro de configuración específico al núcleo
(como por ejemplo partición del disco duro que contiene el sistema de ficheros raíz, direcciones de entrada/salida de
dispositivos, etc.). A partir de este momento el núcleo se encarga de inicializar los diferentes drivers, y arrancar
un primer proceso que será el encargado de crear el resto de los procesos.
Este momento es de especial importancia ya que cualquier error en la configuración del sistema puede provocar que sea necesario
volver a realizar una instalación desde cero.
Hasta ahora hemos descrito el caso típico de arranque, es decir, desde el disco duro local, pero pueden existir otras formas de arrancar
un ordenador. En una gran empresa con miles de ordenadores, si cada ordenador tuviera instalado en su disco duro local una copia del sistema
operativo, cuando llegara el momento de realizar una actualización del mismo, el proceso sería muy costoso. En estos casos se requiere
una configuración de los ordenadores que permita una fácil y rápida gestión de los mismos.
Algunas técnicas:
- Cinta o CD-ROM: Se necesita que el código de la ROM (monitor) disponga de la funcionalidad para poder arrancar desde
una cinta o CDROM. En la actualidad casi todos los ordenadores soportan el arranque desde distintos dispositivos
de almacenamiento. Esta técnica se suele utilizar en el momento de realizar instalaciones o actualizaciones del sistema
operativo. Los núcleos aquí almacenados suelen ser muy genéricos con soporte para una gran cantidad de drivers, para
facilitar de este modo la instalación en ordenadores con muy variadas configuraciones hardware.
- Red: Esta técnica se utiliza tanto para instalar o actualizar versiones como para el arranque típico del ordenador.
Para poder utilizar esta técnica es necesario que el ordenador disponga de una tarjeta de red y que el código del monitor
en ROM sea capaz de cominucarse con otro ordenador (previamente configurado) mediante la tarjeta de red. Los ordenadores
que hacen uso del arranque a través de red (estaciones de trabajo) no suelen disponer de un disco duro local o si lo tienen
es de reducido tamaño y sólo se utiliza para almacenar ficheros de intercambio (memoria virtual) o temporales.
En entornos Unix y redes TCP/IP, los protocolos utilizados para realizar el arranque mediante red suelen ser BOOTP y TFTP. A
través de la red el ordenador recivbe el núcleo del sistema operativo que debe ejecutar. Con esta técnica se facilita la tarea
de gestión en instalaciones con un gran número de ordenadores, ya que ahora sólo será necesario actualizar el núcleo
en un único punto y no en todos los ordenadores de la red.
4.2.3 Utilizando un disquete de arranque
Mucha gente arranca Linux utilizando un "disquete de arranque" que contiene una copia del núcleo de Linux.
Este núcleo tiene la partición raíz de Linux codificada en él, para que sepa donde buscar en el disco duro el sistema
de ficheros raíz. (El comando rdev puede ser utilizado para poner la partición raíz en la imagen del núcleo.
Por ejemplo, este es el tipo de disquete creado por Slackware durante la instalación.
Para crear su propio disquete de arranque, localice en primer lugar la imagen del núcleo en su disco duro. Debe estar
en el fichero /boot/vmlinuz. Algunas instalaciones utilizan el fichero /vmlinux para el núcleo. En su lugar,
puede que tenga un núcleo comprimido. Un núcleo comprimido se descomprime a si mismo en memoria en tiempo de arranque,
y utiliza mucho menos espacio en el disco duro. Si se tiene un núcleo comprimido, puede encontrarse en el fichero
/vmlinuz.
Una vez que se sabe donde esta el núcleo, hay que poner el nombre de la partición raíz de un dispositivo raíz en la
imagen del núcleo, utilizando el comando rdev. El formato de este comando es
rdev <nombre-de-nucleo> <dispositivo-raiz> |
# rdev /etc/Image /dev/hda2 |
# cp /boot/vmlinuz /dev/fd0 |
Otro método de arranque es utilizar LILO, un programa que reside en el sector de arranque del disco duro. Este programa
se ejecuta cuando el sistema se inicia desde el disco duro, y puede arrancar automáticamente Linux desde una imagen de
núcleo almacenada en el propio disco duro.
LILO puede utilizarse también como una primera etapa de carga de varios sistemas operativos, permitiendo seleccionar
en tiempo de arranque qué sistema operativo (como Linux, MS-DOS o Windows) arrancar. Cuando se arranca utilizando LILO,
se inicia el sistema operativo por defecto, a menos que cambie el sistema operativo durante la secuencia de arranque.
La forma más simple de instalar LILO es editar el fichero de configuración, /etc/lilo.conf, y ejecutar el comando
# /sbin/lilo |
# Le indicamos a LILO que modifique el registro de arranque de # /dev/hda (el primer disco duro no-SCSI). Si se quiere arrancar desde # una unidad distinta de /dev/hda, se debe cambiar la siguiente linea boot = /dev/hda # Nombre del cargador de arranque. No hay razón para cambiarlo, a menos # que se este haciendo una modificación seria del LILO install = /boot/boot.b # Dejemos a LILO efectuar alguna optimización. compact # Indicamos cual es el sistema operativo a cargar por defecto default="linux" # indicando el 'label' establecido por cada sistema. # Estrofa para la partición raíz de Linux en /dev/hda1. image = /boot/vmlinuz-2.4 # Ubicación del kernel label = linux # Nombre del SO (para el menú de arranque de LILO) root = /dev/hda1 # Ubicación de la partición raíz vga = ask # Indicar al nucleo que pregunte por modos SVGA en tiempo de arranque # Estrofa para la partición MSDOS en /dev/hda2. other = /dev/hda2 # Ubicación de la partición table = /dev/hda # Ubicación de la tabla de partición para /dev/hda2 label = Windows # Nombre del SO (para el menú de arranque) |
4.2.5 Niveles de ejecución del sistema
El sistema operativo Unix dispone de dos modos de arranque: monousuario y multiusuario. El primero
se utiliza para realizar labores de mantenimiento del equipo y sólo es posible acceder a él mediante la consola
del sistema, es decir, no permite el acceso al mismo ni a sus servicios desde otro lugar que no sea la consola.
En modo multiusuario el sistema permite el acceso a todos los servicios que el ordenador tenga configurados. Este es el
típico funcionamiento de un ordenador con sistema operativo Unix.
Los modos (mono o multi) de funcionamiento en Unix se representan por números que van generalmente de 0 a 6. Cada uno
de estos números representa un nivel de ejecución. Todo ordenador Unix en un momento dado está ejecutando
un determinado nivel. En un sistema Unix se podrá pasar de un nivel a otro con unos comando que veremos a posteriori. Cada
nivel tendrá unas tareas de inicialización y terminación asociadas, y que también podremos variar de acuerdo a nuestras
necesidades
El modo monousuario tiene asignado por convenio el nivel 1, y el multisuario los niveles 2, 3 y 5.
Los niveles 0 y 6 tienen un cometido especial. El 0 se utiliza para representar el estado de parado (halt), y el 6
para representar el rearranque (reboot) del sistema.
El nivel 4 no tiene un uso específico.
A continuación vamos a describir un poco más en profundidad los niveles 2, 3 y 5.
- NIVEL 2: Multiusuario normal. Los usuarios pueden acceder al sistema mediante las líneas de comunicación (RS 232)
o por red (TCP/IP). Pero no se dispone de servicio NFS (Network File System) o sistema de ficheros en red.
- NIVEL 3: Dispone de la misma funcionalidad que el Nivel 2, pero con servicio NFS.
- NIVEL 5: Laa funcionalidad del nivel 3 más el servicio de acceso mediante protocolos X11 (ventanas X window)
El nivel en el que arranca el sistema se indica en el fichero /etc/inittab del sistema y que a continuación describiremos.
4.2.6 El proceso init y /etc/inittab
Después del arranque del núcleo del sistema operativo Unix, éste procede a crear el primer proceso del sistema
cuyo nombre es init. Generalmente este proceso suele tener como identificador el número 1 ó 2.
En algunas versiones de Unix el núcleo junto con init crea otros procesos que ejecutan tareas específicas como
intercambio de páginas de memoria a disco (memoria virtual).
Como ya hemos citado en la sección anterior el comportamineto del proceso init es configurable mediante el fichero
/etc/inittab.
/etc/inittab es un fichero de texto donde cada línea corresponde con una determinada acción que el proceso
init tiene qye llevar a cabo. Cada línea dispone de la estructura:
identificador : nivel de ejecución : acción : proceso |
#nivel inicial de ejecución del sistema id:3:initdefault: # acciones a llevar a cabo por el proceso init l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l5:5:wait:/etc/rc.d/rc 5 |
4.2.7 Ficheros de Inicialización
El arranque de un sistema Unix puede llegar a ser muy complejo por la cantidad de procesos que tienen que arrancarse
y la relación que existe entre ellos.
El arranque del sistema se configura mediante una serie de ficheros escritos en el lenguaje del intérprete de comandos
(shell), y que se ejecutan de una forma ordenada de acuerdo al nivel de ejecución del sistema operativo.
Tradicionalmente, cada fabrincante de Unix disponía de su propia organización de ficheros de inicialización. A partir
de la aparición de la versión System V en los laboratorios AT&T, se ha impuesto la organización que a continuación
os describo.
Como ya sabemos, init es el primer proceso del sistema y su comportamiento lo definimos en el fichero /etc/inittab.
También sabemos que el sistema en un momanto dado está en un determinado nivel.
En Unix System V el sistema de arranque tiene las siguientes características:
- Los ficheros de inicialización están agrupados por niveles de ejecución
- Soporte para un fichero de inicialización previo a cualquier otro (pre-arranque)
- Soporte para tener un fichero de inicialización posterior a cualquier otro (post-arranque)
- Todos los ficheros de inicialización deberán disponer como mínimo de funcionalidad para
arrancar y parar las tareas
- Cada fichero será específico de una tarea o grupo de tareas
- Los ficheros de inicialización se escribirán en el lenguaje de la Bourne shell (/bin/sh)
A continuación se muestra el contenido típico de un fichero /etc/inittab
#nivel inicial de ejecución del sistema id:3:initdefault: # acciones a llevar a cabo por el proceso init 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 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 |
#!/bin/sh $nivel=$1 #primer parámetro for $i in /etc/rc.d/rc${nivel}.d/S* do $i start done |
Telinit Permite cambiar el nivel de ejecución, así por ejemplo
# telinit 0 |