Tabla de contenidos
Una de las características más importantes de Linux es el método altamente configurable que se utiliza para el inicio del sistema operativo. El administrador es libre de configurar muchos aspectos del proceso de arranque, incluyendo qué programas se lanzarán en el momento del arranque. De forma parecida, la parada del sistema finaliza los procesos de forma organizada y configurable, aunque la personalización de este proceso casi nunca es necesaria. Entender el funcionamiento del proceso de arranque y parada no solo le permite personalizarlo, sino que también facilita resolver problemas relacionados con el inicio y el cierre del sistema.
Cuando un ordenador arranca, el procesador busca al final de la memoria del sistema el programa de la BIOS (Basic Input/Output System) y lo ejecuta. La BIOS controla no sólo el primer paso del proceso de arranque, sino que también proporciona una interfaz de bajo nivel para dispositivos periféricos.
Una vez que se haya cargado, la BIOS chequea los periféricos y localiza un dispositivo con el que arrancar el sistema. Habitualmente, en primer lugar comprueba cualquier disquete y unidades de CD-ROM presente por los medios de arranque, y a continuación si esto falla, echa un vistazo a las unidades de disco duro del sistema. El orden de las unidades necesario para arrancar puede ser controlado por la BIOS. La BIOS carga en memoria cualquier programa que resida en el primer sector de este dispositivo, llamado Master Boot Record o MBR. El MBR sólo tiene 512 bytes de tamaño y contiene las instrucciones de código de máquina para el arranque del equipo, llamado gestor de arranque así como también la tabla de particiones. Una vez que la BIOS haya encontrado y cargado el gestor de arranque en memoria, le deja el control del proceso de arranque a éste.
Los gestores de arranque de Linux para la plataforma x86 se dividen en dos etapas. La primera es un pequeño código binario que se encuentra en el MBR. Su única función es la de localizar el gestor de arranque de la segunda etapa y cargar la primera parte de éste en memoria. GRUB es uno de los gestores de arranque más modernos, siendo capaz de leer particiones casi de cualquier tipo, pudiendo cargar su archivo de configuración — /boot/grub/grub.conf — en el momento de arranque desde cualquiera de ellas
Una vez que la segunda etapa del gestor de arranque está en memoria, presenta al usuario una pantalla gráfica mostrando los diferentes sistemas operativos o kernels que puede arrancar. En esta pantalla el usuario puede usar las flechas direccionales para escoger el sistema operativo o kernel con el que desea arrancar y presionar la tecla [Intro]. Si no se presiona ninguna tecla, el gestor de arranque carga la entrada predeterminada después de un período de tiempo de espera (también configurable).
Una vez que el gestor de arranque de la segunda etapa haya determinado qué kernel arrancar, localizará el binario del kernel correspondiente en el directorio /boot/. La llamada al kernel sigue el siguiente formato — /boot/vmlinuz-<kernel-version> (donde <kernel-version> corresponde a la versión del kernel especificada en las configuraciones del gestor de arranque). El gestor de arranque cargará una imagen inicial de RAM apropiada (initial RAM disk), conocida como initrd, en la memoria. El initrd es usado por el kernel para cargar controladores necesarios para arrancar el sistema. Esto es muy importante si posee unidades de disco duro SCSI o si está usando el sistema de ficheros ext3
Cuando el kernel se carga, inmediatamente se inicializa y configura la memoria del ordenador y los diferentes dispositivos hardware conectados al sistema, incluyendo procesadores, subsistemas de entrada/salida y dispositivos de almacenamiento. A continuación buscará la imagen initrd en una ubicación predeterminada en memoria, la descomprimirá, la montará y cargará todos los controladores necesarios. A continuación inicializa los dispositivos virtuales relacionados con el sistema de ficheros, tal como LVM o software RAID antes de desmontar la imagen del disco initrd y liberar toda la memoria que la imagen del disco ocupó anteriormente. El kernel montará la partición raíz (root) como sólo lectura y liberará cualquier memoria no utilizada. Llegados a este punto, el kernel está cargado en memoria y operativo. Sin embargo, pocas cosas interesantes se pueden hacer, ya que no existe una forma de interactuar con el kernel. Para configurar el entorno de usuario que interactue con el kernel, este inicia el programa /sbin/init (también llamado init) que coordina el resto del proceso de arranque y configura el ambiente del usuario..
Cuando el comando init arranca, se convierte en el proceso padre de todos los procesos que comienzan automáticamente en el sistema. Init lee el fichero /etc/inittab que describe cómo el sistema debería configurarse en cada nivel de ejecución (ver sección “Niveles de ejecución”). Básicamente, antes de establecer el nivel de ejecución, init ejecuta el script /etc/rc.d/rc.sysinit, que establece la variable PATH, activa el swap, controla los sistemas de fichero y se encarga de todo lo que el sistema necesita tener hecho al momento de la inicialización. A continuación procede a ejecutar todos los servicios que estén definidos en el nivel de ejecución predeterminado (ver sección “Niveles de ejecución”)
Los niveles de ejecución son un estado, o modo, en el que entra el sistema en el proceso de arranque y que define los servicios que serán arrancados por la máquina. Linux está programado para ejecutarse en un determinado nivel de ejecución. El número de niveles y sus nombres están predeterminados. En cambio, las acciones a realizar en cada nivel son configurables por el superusuario tal como se explica más tarde en este documento.
La configuración de niveles en Fedora Core Linux se presenta en la siguiente tabla:
Tabla 2.1. Niveles de ejecución
0 | Halt | Este nivel detiene el sistema |
1 | Single User | Modo de administración. El sistema crea un shell con los privilegios del superusuario sin solicitar nombre de usuario o contraseña. |
2 | Multiuser | Modo de funcionamiento normal sin algunos servicios de red. |
3 | Multiuser + network | Como el modo 2 pero con todos los servicios de red activos, NFS por ejemplo. |
4 | Generalmente no utilizado | |
5 | Modo gráfico multiusuario completo | Con una pantalla de inicio de sesión basada en X |
6 | Reboot | Se reinicia el sistema. |
s,S | Emergency single user | Igual al nivel 1 pero sin acceder a los ficheros de configuración de inicio. |
Bajo esta perspectiva, un sistema Linux no se arranca o detiene, sino que simplemente se cambia su nivel de ejecución. Algunas consideraciones importantes sobre los niveles son:
Durante un arranque normal, el sistema se coloca en el nivel 3 (multiusuario con red) o en el nivel 5 (análogo al 3 pero con el sistema de ventanas activo desde el inicio).
shutdown -h now cambia el nivel actual al nivel 0 (halt).
shutdown -r now cambia el nivel actual al nivel 6 (reboot).
/sbin/init nivel cambia al nivel especificado
/sbin/runlevel indica el nivel de ejecución previo y el actual.
Desde el cargador puede expresarse el nivel de ejecución deseado pasándole como parámetro al kernel el nivel de ejecución.
El nivel de ejecución por defecto para el sistema está definido en el fichero /etc/inittab. Para saber el nivel de ejecución por defecto de un sistema, busque una línea similar a la que se muestra abajo cerca de la parte superior de /etc/inittab:
id:5:initdefault:
El programa init inicia todas las entradas de /etc/inittab que se correspondan con el nivel de ejecución por defecto. Un listado con las entradas más relevantes que se ejecutarán en el nivel 5 se muestra a continuación:
l5:5:wait:/etc/rc.d/rc 5 # Run gettys in standard runlevels 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
Cuando se arranca el nivel de ejecución 5, el programa init ejecuta el script /etc/rc.d/rc 5. Este script consulta el directorio /etc/rc.d/rc5.d/ para determinar qué procesos iniciar o parar.
De forma general, existirá un directorio /etc/rc.d/rc<x>.d/ , por cada nivel de ejecución definido por el sistema, donde se encuentran los servicios que deberán ser lanzados y parados en ese nivel de ejecución.
Realmente, /etc/rc.d/rc cuando entra en un determinado nivel de ejecución realiza las siguientes acciones:
Ejecuta, por orden de nombre, todos los scripts que comienzan por K en el directorio correspondiente al nivel, utilizando como argumento para dicho script la opción stop.
Ejecuta, por orden de nombre, todos los scripts que comienzan por S en el directorio correspondiente al nivel, utilizando como argumento para dicho script la opción start.
A título de ejemplo, a continuación se muestra un listado del directorio que corresponde al nivel multiusuario con red (/etc/rc.d/rc3.d).
ls -l rc3.d/ total 0 lrwxrwxrwx 1 root root 13 Apr 1 1998 K15gpm -> ../init.d/gpm lrwxrwxrwx 1 root root 13 Apr 1 1998 K60lpd -> ../init.d/lpd lrwxrwxrwx 1 root root 15 Apr 1 1998 K95nfsfs -> ../init.d/nfsfs lrwxrwxrwx 1 root root 17 Apr 1 1998 S01kerneld -> ../init.d/kerneld lrwxrwxrwx 1 root root 17 Apr 1 1998 S10network -> ../init.d/network lrwxrwxrwx 1 root root 16 Apr 1 1998 S20random -> ../init.d/random lrwxrwxrwx 1 root root 16 Apr 1 1998 S30syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 13 Apr 1 1998 S40atd -> ../init.d/atd lrwxrwxrwx 1 root root 15 Apr 1 1998 S40crond -> ../init.d/crond lrwxrwxrwx 1 root root 18 Apr 1 1998 S75keytable -> ../init.d/keytable lrwxrwxrwx 1 root root 11 Apr 1 1998 S99local -> ../rc.local
Como puede apreciar, ninguno de los scripts que inician y apagan los servicios están localizados en el directorio /etc/rc.d/rc3.d/. Casi todos los ficheros en /etc/rc.d/rc3.d/ son enlaces simbólicos apuntando a los scripts localizados en el directorio /etc/rc.d/init.d/. Los enlaces simbólicos se usan en cada uno de los directorios rc de manera que los niveles de ejecución puedan ser reconfigurados al crear, modificar y eliminar los enlaces simbólicos sin que afecte a los scripts actuales a los que se refiere.
El nombre de cada enlace simbólico empieza con K o S. Como ya habíamos comentado, los scripts que empiezan por K son procesos candidatos a ser parados en ese nivel de ejecución, mientras que aquellos que empiezan por S son procesos candidatos a ser iniciados.
El administrador puede configurar las acciones que deben realizarse al entrar en un determinado nivel de ejecución. A modo de resumen, los directorios y ficheros relevantes para configurar el proceso de arranque se detallan a continuación:
Fichero base de configuración del arranque de la máquina.
En él residen todos los scripts de inicialización.
Script de inicialización del ordenador, independiente del nivel.
Existe un directorio por cada nivel de ejecución, que contiene enlaces simbólicos a los scripts que configuran la entrada a este nivel.
Aquí residen todos los scripts reales que pueden ser ejecutados cuando se entra en un nivel de ejecución.
Hay que tener en consideración que los scripts que residen en el directorio /etc/rc.d/init.d pueden utilizarse directamente, lo que permite iniciar o detener servicios de forma manual. Por ejemplo, los siguientes mandatos detienen el subsistema de red y lo vuelven a iniciar:
# /etc/rc.d/init.d/network stop # /etc/rc.d/init.d/network start
Como ya se ha dicho, el administrador tiene la potestad de variar el proceso de arranque de un sistema Linux, bien simplemente cambiando el nivel de ejecución al editar el fichero /etc/inittab o pasándole un parámetro al kernel indicando el nivel de ejecución deseado.
El sistema Linux, según la distribución elegida, vendrá con una configuración predeterminada de servicios que se deben lanzar en el proceso de arranque del sistema. De nuevo el administrador puede variar ese comportamiento. Si hemos seguido con atención la sección anterior, la forma más directa de hacer que un determinado servicio no se lance en un nivel de ejecución, sería borrar el enlace simbólico que exista en el directorio predeterminado del nivel de ejecución ( /etc/rc.d/rc<x>.d ). Si queremos volver a arrancar en el proceso de inicio el servicio, crearemos el enlace de nuevo y listo.
Si por el contrario, nuestras necesidades pasan por añadir al proceso de arranque un nuevo servicio, los pasos necesarios para integrarlo serían los siguientes:
Crear un script en el directorio /etc/rc.d/init.d, cuyo esqueleto sea el siguiente:
#! /bin/bash # # miservicio Start/Stop miservicio. # # chkconfig: 2345 90 60 # description: # Source function library. . /etc/init.d/functions prog=/usr/sbin/miservicio start() { echo -n "Iniciando $prog:" daemon miservicio RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/miservicio return $RETVAL } stop() { echo -n "Parando $prog: " killproc miservicio RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/miservicio return $RETVAL } case "$1" in start) start ;; stop) stop ;; esac
Crear los enlaces simbólicos necesarios para parar y arrancar el servicio en el directorio que represente el nivel de ejecución predeterminado:
# cd /etc/rc.d/rc5.d # ln -s /etc/rc.d/init.d/miservicio S90miservico
Para facilitar la tarea al administrador, Fedora Core 1 posee un par de herramientas que ayudan en todo este proceso.
El comando chkconfig permite añadir y eliminar servicios en los niveles de ejecución, así como consultar la configuración de cada servicio. La sintaxis de este mandato es la siguiente:
chkconfig --list [name] chkconfig [--level levels] name <on|off|reset>
Utilizado con la opción --list, este mandato visualiza la configuración de todos los servicios o de un nivel concreto. Las acciones on y off activan y desactivan respectivamente un servicio en los niveles especificados. La acción reset reestablece los valores predeterminados para este servicio.
Desde la versión RedHat 8, el sistema incorpora una serie de utilidades gráficas para poder configurar las diferentes opciones del sistema. En Fedora Core 1, las herramientas que aparecen bajo el nombre redhat-config-<servicio> son las encargadas de la configuración.
El comando redhat-config-services permite al administrador modificar los servicios que se lanzarán en los diferentes niveles de ejucución.
Esta herramienta nos permite Arrancar, Parar y Reiniciar un servicio, así como definir en que niveles se ejecutará por defecto.
GNU GRand Unified Boot loader o GRUB es un programa que permite al usuario seleccionar qué sistema operativo instalado deseamos arrancar en el momento de arranque del sistema. Permite también que el usuario pase argumentos al kernel.
GRUB posee una serie de características que lo convierten en el método favorito respecto al resto de gestores de arranque disponibles para la arquitectura x86. A continuación exponemos una lista de las características más importantes:
GRUB proporciona un entorno verdadero basado en comandos, lo cual supone disponer de un pre-sistema operativo en el momento del arranque. Esto proporciona la máxima flexibilidad en la carga de los sistemas operativos que admitan determinadas opciones.
GRUB soporta el modo Direccionamiento Lógico de Bloques (LBA). El modo LBA permite la conversión de direccionamiento utilizada para buscar archivos en la unidad de disco duro del firmware y se utiliza en muchos discos IDE y en todos los discos duros SCSI. Antes de LBA, los gestores de arranque encontraban la limitación del cilindro 1024 de la BIOS, donde la BIOS no podía encontrar un archivo después de ese cabezal de cilindro del disco. El soporte LBA permite que GRUB arranque los sistemas operativos desde las particiones más allá del límite de 1024 cilindros, siempre y cuando la BIOS del sistema soporte el modo LBA
GRUB puede leer casi todo tipo de particiones. Esto permite que GRUB acceda a su archivo de configuración, /boot/grub/grub.conf, cada vez que el sistema arranca, eliminando la necesidad que tiene el usuario de escribir una nueva versión de la primera etapa del gestor de arranque al MBR en caso de que se produzcan cambios de la configuración. El único caso en el que el usuario necesitaría reinstalar GRUB en el MBR es en caso de que la localización física de la partición /boot/ se traslade en el disco.
Si decidió no instalar GRUB durante el proceso de instalación, se puede hacer después. Una vez instalado, se convierte en el gestor de arranque por defecto. Para instalar el paquete que contiene GRUB en Fedora Core 1, ejecute el siguiente comando:
# rpm -ivh grub-0.93-7.i386.rpm
Una vez que el paquete GRUB esté instalado, abra un intérprete de comandos de la shell y ejecute el comando /sbin/grub-install <location>, donde <location> es la ubicación en la que la Etapa 1 de GRUB debería ser instalado. Por ejemplo, el comando siguiente instala GRUB al MBR del dispositivo maestro IDE en el bus IDE primario:
# /sbin/grub-install /dev/hda
La próxima vez que arranque el sistema, el menú del gestor de arranque gráfico de GRUB aparecerá antes de que el kernel se cargue en memoria.
GRUB posee una interfaz de menú que permite escoger entradas que han sido definidas en el fichero de configuración de GRUB, así como acceder a una línea de comando muy flexible para ejecutar las acciones de arranque que deseemos.
GRUB busca su fichero de configuración (/boot/grub/grub.conf) tan pronto es cargado. Si lo encuentra, la interfaz de menú se activa, utilizando las entradas encontradas en el fichero. Si se elije la opción de menú línea de comandos o no se encuentra el fichero de configuración, entonces GRUB entra la interfaz de línea de comandos.
La interfaz de línea de comandos proporciona al usuario un prompt parecido a una shell de UNIX o DOS. Cada comando introducido aquí es ejecutado inmediatamente después de presionar la tecla [Enter].
Los comandos disponibles en esta sección son un subconjunto de los que pueden aparecer en el fichero de configuración de GRUB. A continuación se muestran los más importantes:
boot. Arranca el sistema operativo o gestor de encadenamiento que se ha cargado.
chainloader </path/to/file>. Carga el archivo especificado como gestor de encadenamiento. Si el archivo está ubicado en el primer sector de la partición especificada, puede utilizar la notación de lista de bloques, +1, en vez del nombre del archivo.
initrd </path/to/initrd>. Le permite especificar un disco RAM inicial para utilizarlo al arrancar. Es necesario un initrd cuando el kernel necesita ciertos módulos para poder arrancar adecuadamente.
kernel </path/to/kernel><opcion-1> <opcion-N> ... Especifica el archivo del kernel a cargar cuando se cargue el sistema operativo. Se sustituye </path/to/kernel> con una ruta absoluta desde la partición especificada por el comando root. Reemplace <opcion-1> con las opciones para el kernel de Linux, tales como root=/dev/hda5 para especificar el dispositivo en el que se ubica la partición root para el sistema.
root (<device-type><device-number>,<partition>). Configura la partición raíz para GRUB, tal como (hd0,0) y monta la partición.
rootnoverify (<device-type><device-number>,<partition>). Configura la partición raíz para GRUB, tal como el comando root pero no monta la partición.
makeactive. Define la actual partición raíz (configurada con el comando root[noverify]) como la partición activa.
hide <partition>. Oculta la partición especificada por la opción <partition>. Este comando es útil cuando se pretende arrancar un sistema operativo como Windows donde existen múltiples particiones FAT o NTFS en el mismo disco.
Esta es la interfaz por defecto cuando se configura GRUB desde el programa de instalación. En esta interfaz hay un menú de sistemas operativos o kernels preconfigurados en forma de lista ordenada por nombre. Puede utilizar las teclas de flecha para seleccionar una opción en lugar de la selección por defecto y pulsar la tecla [Enter] para arrancar el sistema.
El archivo de configuración de la interfaz de menú de GRUB es /boot/grub/grub.conf. Los comandos para configurar las preferencias globales para la interfaz de menú están ubicados al inicio del archivo, seguido de las diferentes entradas para cada sistema operativo o kernels listados en el menú.
El siguiente es un ejemplo de archivo de configuración de menú de GRUB muy básico diseñado para arrancar bien Fedora Core Linux o Microsoft Windows 2000:
default=1 timeout=10 splashimage=(hd0,5)/boot/grub/splash.xpm.gz password --md5 $1$lcF0V/$zaN1LNyAr5TA6NG/4KP1N/ title Fedora Core 1 root (hd0,5) kernel /boot/vmlinuz ro root=/dev/hda6 initrd /boot/initrd.img title Windows 2000 unhide (hd0,0) hide (hd0,1) hide (hd0,2) rootnoverify (hd0,0) makeactive chainloader +1
Los siguientes comandos son exclusivos de la interfaz de menú:
default=<valor>. Entrada que será ejecutada por defecto sino hay intervención del usuario.
timeout=<valor>. Tiempo de espera sino hay intervención del usuario.
splashimage=<path-to-image> — Especifica la ubicación de la imagen de pantalla splash que se utilizará al arrancar.
password=<contraseña>. Será necesario conocer la contraseña si queremos modificar las opciones de las diferentes entradas del menú.