ant

ARRANQUE DEL SISTEMA
4.2

sig

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.

4.2.2 Formas de Arranque

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>
donde <nombre-del-nucleo> es el nombre de la imagen del nucleo, y <dispositivo-raiz> es el nombre de la partición raíz de Linux. Por ejemplo, para hacer que el dispositivo raíz en el nucleo /etc/Image sea /dev/hda2, utilice el comando
# rdev /etc/Image /dev/hda2
rdev también puede poner otras opciones en el núcleo, como puede ser el modo SVGA por defecto a utilizar en tiempo de arranque. Tan solo utilice "rdev -h" para obtener un mensaje de ayuda.

Una vez puesto el dispositivo raíz, tan solo hay que copiar la imagen del nucleo al disquete. Siempre que se copia datos a un disquete, es una buena idea formatear previamente el disquete en MS-DOS. Esto establece la informacion de pista y sector en el disquete con la que puede detectarse como de alta o baja densidad.

Por ejemplo, para copiar el núcleo en el fichero /boot/vmlinuz al disquete en /dev/fd0, se puede utilizar el comando
# cp /boot/vmlinuz /dev/fd0
Este disquete debe arrancar ahora Linux.

4.2.4 Utilizando LILO

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
El fichero de configuración de LILO contiene una "estrofa" para cada sistema operativo que se pueda querer arrancar. La mejor forma de mostrarlo es con un ejemplo de un fichero de configuración LILO. El ejemplo siguiente es para un sistema que tiene una partición raíz Linux en /dev/hda1 y una partición MS-DOS en /dev/hda2.
# 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)
La primera "estrofa" de sistema operativo en el menú del fichero de configuración será el sistema operativo que arrancará LILO por defecto. (siempre que no se cambie con el parámetro default. Se puede seleccionar otro sistema operativo en el indicador de arranque de LILO, tal y como se indico anteriormente.

Recuerde que cada vez que actualice la imagen del nucleo en disco, se debe reejecutar /sbin/lilo para que los cambios queden reflejados en el sector de arranque de su unidad.

También tenga en cuenta que si utiliza la linea "root =", no hay motivo para utilizar rdev para poner la partición raíz en la imagen del nucleo. LILO se encarga de ponerlo en tiempo de arranque.

Las FAQ (Preguntas frecuentemente formuladas) dan más información sobre LILO, incluyendo como utilizar LILO con el "OS/2's Boot Manager".

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
El separador de campos es el carácter ":"

identificador corresponde con el nombre de la línea, deberá ser único en el fichero.

nivel de ejecución indica el nivel o niveles de ejecución en los que la línea deberá procesarse.
/
acción indica al proceso nit cómo procesar la línea. Algunos valores pueden ser wait (init esperará a que el proceso haya terminado), once (sólo ejecturá el proceso una única vez, ejemplo el proceso de login), respawn (arrancará el proceso de nuevo cuando éste termine), off (ignorará la línea).

Un ejemplo de un fichero /etc/inittab:

#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
La línea id:3:initdefault: suele ser la primera del fichero /etc/inittab e indica cuál es el nivel de ejecución en el que arrancará el sistema, en este caso es el nivel 3.

La línea l2:2:wait:/etc/rc.d/rc 2 indica que para el nivel de ejecución 2, el proceso init deberá arrancar el programa /etc/rc.d/rc y esperar (wait) a que termine. El número 2 es un parámetro del programa /etc/rc.d/rc.

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
En el monitor anterior existen 7 líneas describiendo cada una de ellas las tareas de inicialización que deberán llevarse a cabo cuando se entre en un determinado nivel de ejecución.

El programa /etc/rc.d/rc es un fichero de comandos de shell que en función del parámetro pasado (nivel de ejecuación), realiza unas tareas u otras.

Como ya habíamos indicado antes, los ficheros de arranque de un determinado nivel están todos agrupados en un mismo directorio, así por ejemplo, todos los ficheros de arranque que corresponden con el nivel de ejecución 2 estarán almacenados en el directorio /etc/rc.d/rc2.d. Y los del nivel 1 en /Etc/rc.d/rc1.d, y así sucesivamente.

El programa /etc/rc.d/rc tiene la siguiente estructura:
#!/bin/sh
$nivel=$1 #primer parámetro
for $i in /etc/rc.d/rc${nivel}.d/S*
do
$i start
done
Como vemos todos los nombres de los scripts de arranque deben comenzar por una S y deben admitir como parámetros start y stop

También hay que tener en cuenta que el orden de ejecución de los scripts por parte del programa /etc/rc.d/rc sigue un orden que coincide con la ordenación alfabética de los nombres de los ficheros. Así por ejemplo, se ejecutará antes el fichero de nombre S10web, que S20correo.

Como norma general el nombre de los ficheros de arranque deberá comenzar por una S seguido de 2 dígitos y por último un nombre significativo (correo, web, nfs, etc.)

Otra característica del sistema de arranque/parada de Unix consiste en disponer de un repositorio de scripts de arranque/parada que puedan ser utilizados en los diferentes niveles de ejecución del sistema. Generalmente este directorio suele ser /etc/rc.d/init.d.
Es en este directorio donde se encuentran los ficheros de inicialización, mientras que en los directorios /etc/rc.d/rc{NIVEL}.d se encuentran enlaces simbólicos a estos ficheros.

Normalmente estos ficheros de inicialización arrancarán varios servidores que correran en la máquina hasta su parada, tales como el servidor web (httpd) o el del sitema Cron (crond).

4.2.8 Comandos y Trazas

Telinit Permite cambiar el nivel de ejecución, así por ejemplo
# telinit 0
pararía el sistema. telinit 1 -> pasaría a modo monousuario

Reboot Permite reiniciar el sistema. Rearranca el sistema después de haberlo parado.

Shutdown Permite parar un sistema Unix. Existe en todas las versiones de Unix, pero tiene diferentes parámetros según la versión.

Halt Similar a shutdown. Deja el sistema totalmente parado.

En el fichero ASCII /var/log/messages quedan registradas todas las trazas que se producen en el sistema, incluidas las del proceso de arranque. Existe un comando dmesg que permite conocer información sobre el último arranque realizado en la máquina.