Entre bastidores en el proceso de arranque.

NotaNota
 

Esta sección trata del proceso de arranque x86 en particular. Según la arquitectura de su sistema, su proceso de arranque podría ser ligeramente diferente. Sin embargo, una vez que el sistema haya encontrado y cargado el núcleo, el proceso de arranque predeterminado de Red Hat Linux es idéntico para todas las arquitecturas. Para más información acerca de un proceso de arranque diferente al x86 consulte la sección la sección de nombre Diferencias en el proceso de arranque en otras arquitecturas.

Cuando el ordenador está encendido, el procesador busca la BIOS (Entrada/Salida Básica del sistema) en la ROM del equipo y lo ejecuta. El programa de la BIOS está escrito dentro de la memoria permanente de sólo lectura (ROM) y está siempre disponible para el uso. El programa de la BIOS provee el más bajo nivel de interfaz para dispositivos periféricos y controla el primer paso del proceso de arranque.

El programa de la BIOS prueba el sistema, busca y controla los periféricos y después busca una unidad en uso para activar el sistema. Normalmente, busca en la disquetera (o en la unidad CD-ROM de los sistemas más nuevos) medios de arranque, si los hubiera, y luego se dirije a la unidad del disco duro. El orden de las unidades usadas para el arranque se controla normalmente por medio de una configuración especial de la BIOS en el sistema. Una vez que Red Hat Linux esté instalado en la unidad del disco duro de un sistema, la BIOS intentará iniciar desde el Master Boot Record (MBR) en el primer sector de la primera unidad del disco duro, que carga sus contenidos en la memoria, y lo controla todo.

Entonces, este código del programa del MBR busca la primera partición activa y lee el registro de arranque de la misma. El registro de arranque contiene instruciones acerca de cómo cargar el gestor de arranque, LILO (LInux LOader). El MBR carga LILO, que se hace cargo del proceso (siempre que LILO esté instalado en el MBR). En la configuración de Red Hat Linux predeterminada, LILO usa el MBR para mostrar opciones de arranque y permitirle al usuario la entrada en el sistema operativo con el que realmente iniciará.

La pregunta que surge es:¿Cómo sabe LILO, en el MBR, qué hacer cuando el MBR ha sido leído? LILO ya ha leído allí las instrucciones a través del fichero /etc/lilo.conf.

Opciones de /etc/lilo.conf

La mayor parte de las veces no necesitará cambiar el Master Boot Record de su unidad del disco duro a menos que necesite activar un sistema operativo recién instalado o bien esté tratando de usar un núcleo nuevo. Si necesita crear un nuevo MBR usando LILO pero usando, a su vez, una configuración diferente, deberá editar el fichero /etc/lilo.conf y hacer funcionar lilo de nuevo para que se actualicen los cambios.

AvisoAdvertencia
 

Si quiere modidificar /etc/lilo.conf, asegúrese de tener una copia de seguridad antes de hacer algún cambio. Asegúrese también de tener a disposición un disquete de arranque funcionando, para poder activar el sistema y hacer cambios en el MBR si hubiera un problema. Para más información sobre la creación de un disquete de arranque vea el manual de mkbootdisk.

El fichero /etc/lilo.conf se usa a través del comando lilo para determinar qué sistema operativo utilizar o qué núcleo activar, así como para saber donde auto-instalar ( por ejemplo /dev/hda para la primera unidad del disco duro IDE). Una muestra de fichero /etc/lilo.conf:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
lba32
default=linux

image=/boot/vmlinuz-2.4.0-0.43.6
	label=linux
	initrd=/boot/initrd-2.4.0-0.43.6.img
	read-only
	root=/dev/hda5

other=/dev/hda1
	label=dos

Este ejemplo muestra un sistema configurado para activar dos sistemas operativos: Red Hat Linux y DOS. He aquí un análisis más profundo de unas pocas líneas de este archivo (su fichero /etc/lilo.conf podría aparecer un poco diferente):

A continuación, LILO mostrará la pantalla inicial de Red Hat Linux y los diferentes sistemas operativos o núcleos con los que ha sido configurado para el arranque. Si tan sólo tiene instalado Red Hat Linux y no ha cambiado nada en el fichero /etc/lilo.conf, sólo verá la opción linux. Si ha configurado LILO para activar también otros sistemas operativos, esta pantalla le dará la oportunidad de seleccionar el sistema operativo con el que arrancará. Utilice la tecla de la flecha para resaltar el sistema operativo y pulse la tecla Intro

Si desea poder obtener una línea de comando para dar órdenes a LILO, pulse la combinación de teclas Ctrl-X. LILO mostrará un mensaje de LILO: en la pantalla. LILO esperará el período de tiempo que se haya predefinido para la entrada del usuario. (La cantidad de tiempo que LILO espera se establece en la línea timeout en el fichero /etc/lilo.conf). Si su fichero /etc/lilo.conf estuviera configurado para permitir a LILO la posibilidad de elegir sistema operativo, podría escribir en la etiqueta cualquier sistema operativo que desee activar.

Si LILO está activando Linux, cargará primero el núcleo en la memoria, que es un archivo del estilo vmlinuz (más el número de versión, por ejemplo, vmlinuz-2.4.0-xx), ubicado en el directorio /boot. Depués, es el núcleo quien controla el proceso init (inicialización) del sistema.

En este momento, con el núcleo cargado en la memoria y en funcionamiento, Linux ya habrá sido iniciado, aunque a un nivel muy básico. Sin embargo, sin las aplicaciones que utilicen el núcleo y sin la capacidad del usuario para dar un significado al inicio del sistema, no se puede hacer mucho. El programa de comando init resuelve este problema sacando a relucir los diferentes servicios que permiten al sistema desempeñar su papel.

Init

El kernel encuentra init en el directorio /sbin y lo ejecuta. init coordina el resto del proceso de arranque.

Cuando el comando init inicia, se transforma en el padre (o en el abuelo) de todos los procesos que se producen automáticamente en su sistema Red Hat Linux. Primero, pone en funcionamento el guión establecido en el fichero /etc/rc.d/rc.sysinit, que establece la ruta a otros programas, comienza a intercambiar datos, controla los sistemas de archivo, etc. Básicamente, el fichero rc.sysinit se encarga de todo lo que su sistema tiene que realizar durante la inicialización. Por ejemplo, en un sistema de red, el fichero rc.sysinit utiliza la información del archivo /etc/sysconfig/network para iniciar la red. La mayor parte de los sistemas usan un reloj, por lo tanto, en ellos, el rc.sysinit tendrá una referencia a /etc/sysconfig/clock para inicializar el reloj. Si tiene procesos especiales en el puerto serie que necesiten ser inicializados, el rc.sysinit podría también poner en funcionamiento el rc.serial.

Entonces, el init ejecuta el guión /etc/inittab, que describe cómo debería de ser configurado el sistema en cada nivel de ejecución y configura el nivel de ejecución predeterminado. (vea la la sección de nombre Niveles de ejecución Init para obtener más información acerca de los niveles de ejecución en las diversas utilidades.) Este archivo establece, entre otras cosas, que el comando /sbin/update debería ser ejecutado siempre que comience un nivel de ejecución. El programa update se usa para reenviar al disco buffers sucios.

Siempre que el nivel de ejecución cambia, init utiliza los guiones de /etc/rc.d/init.d para iniciar e interrunpir diferentes servicios, como puedan ser su servidor de red, su servidor DNS, etc. Primero, el comando init establece la librería de funciones de origen para el sistema (normalmente /etc/rc.d/init.d/functions), que explica cómo iniciar o anular un programa y cómo encontrar el PID de un programa. Luego, el comando init determina el nivel de ejcución en curso y el precedente.

El comando init inicia todos los procesos de segundo plano necesarios para que el sistema los ejecute considerando el directorio rc apropiado para ese nivel de ejecución (/etc/rc.d/rc<x>.d, donde el <x> se numera de 0 a 6). El comando init ejecuta cada uno de los guiones anulados (el nombre de sus archivos comienza con una K), con un parámetro stop. El comando init ejecuta el inicio de todos los guiones (los nombres de sus archivos comienzan con una S) en el nivel de ejecución apropiado del directorio mediante el comando start, para que todos los servicios y aplicaciones se inicien correctamente. De hecho, puede ejecutar los mismos guiones manualmente después de que el sistema haya terminado de arrancar con un comando como /etc/rc.d/init.d/httpd stop o un comando service httpd stop, registrado como root. Esto interrumpirá el servidor httpd.

NotaNota
 

Cuando se inicien los servicios manualmente, debería estar como super-usuario. Si aparece un error cuando ejecute el comando service httpd stop, podría no estar en la ruta /sbin ni en /root/.bashrc (o no tener el archivo .rc adecuado para su shell preferida). Podría escribir el comando completo, como /sbin/service httpd stop o agregar el directorio mediante el comando export PATH="$PATH:/sbin" a su archivo de shell .rc. Si edita el archivo de configuración de su shell, salga del sistema y entre de nuevo como administrador para hacer que la configuración cambiada del archivo de shell sea efectiva.

Ninguno de los guiones que inician e interrunpen los servicios está realmente localizados en el fichero /etc/rc.d/init.d. Más bién, todos los archivos de /etc/rc.d/rc<x>.d son enlaces simbólicos que señalan los guiones localizados en el /etc/rc.d/init.d. Una conexión simbólica no es más que un archivo que señala simplemente a otro archivo, y se usa en este caso porque puede ser creada y borrada sin afectar al guión real que anula o inicia el servicio. Las conexiones simbólicas a los diferentes guiones están numeradas en un orden particular para que empiecen en ese orden. Podrá cambiar el orden en que los servicios inician o se interrumpen cambiando el nombre del enlace simbólico que se refiere al guión, y que realmente es quien inicia o interrumpe el servicio. Puede dar un mismo número a diferentes conexiones simbólicas si quiere que ese servicio empiece o termine inmediatamente después o antes de otro servicio.

Por ejemplo, para el nivel de ejecución 5, el comando init entra en el directorio /etc/rc.d/rc5.d y podría encontrar lo siguiente (la salida que verá por pantalla podría variar en función de su sistema y de su configuración):

K01pppoe -> ../init.d/pppoe
K05innd -> ../init.d/innd
K10ntpd -> ../init.d/ntpd
K15httpd -> ../init.d/httpd
K15mysqld -> ../init.d/mysqld
K15pvmd -> ../init.d/pvmd
K16rarpd -> ../init.d/rarpd
K20bootparamd -> ../init.d/bootparamd
K20nfs -> ../init.d/nfs
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwalld -> ../init.d/rwalld
K20rwhod -> ../init.d/rwhod
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K30mcserv -> ../init.d/mcserv
K34yppasswdd -> ../init.d/yppasswdd
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K50snmpd -> ../init.d/snmpd
K54pxe -> ../init.d/pxe
K55routed -> ../init.d/routed
K60mars-nwe -> ../init.d/mars-nwe
K61ldap -> ../init.d/ldap
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K75gated -> ../init.d/gated
K80nscd -> ../init.d/nscd
K84ypserv -> ../init.d/ypserv
K90ups -> ../init.d/ups
K96irda -> ../init.d/irda
S05kudzu -> ../init.d/kudzu
S06reconfig -> ../init.d/reconfig
S08ipchains -> ../init.d/ipchains
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13portmap -> ../init.d/portmap
S14nfslock -> ../init.d/nfslock
S18autofs -> ../init.d/autofs
S20random -> ../init.d/random
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S35identd -> ../init.d/identd
S40atd -> ../init.d/atd
S45pcmcia -> ../init.d/pcmcia
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S60lpd -> ../init.d/lpd
S75keytable -> ../init.d/keytable
S80isdn -> ../init.d/isdn
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90FreeWnn -> ../init.d/FreeWnn
S90xfs -> ../init.d/xfs
S95anacron -> ../init.d/anacron
S97rhnsd -> ../init.d/rhnsd
S99linuxconf -> ../init.d/linuxconf
S99local -> ../rc.local

Estos enlaces simbólicos informan a init de que necesita eliminar los comandos pppoe, innd, ntpd, httpd, mysqld, pvmd, rarpd, bootparamd, nfs, rstatd, rusersd, rwalld, rwhod, squid, amd, mcserv, yppasswdd, dhcpd, smb, vncserver, arpwatch, named, snmpd, pxe, routed, mars-nwe, ldap, kadmin, kprop, krb524, krb5kdc, gated, nscd, ypserv, ups, y irda. Después de que todos los procesos hayan sido eliminados, el proceso init mira en el mismo directorio y encuentra comienzos de guión para los comandos kudzu, reconfig, ipchains, portmap, nfslock, autofs, random, netfs, apmd, identd, atd, pcmcia, sshd, rawdevices, xinetd, lpd, keytable, isdn, sendmail, gpm, canna, crond, FreeWnn, xfs, anacron, rhnsd, y linuxconf. La última cosa que init ejecuta es /etc/rc.d/rc.local para hacer funcionar cualquiera de los guiones especiales configurados para el host. En este momento, se considera que el sistema está operando en el nivel de ejecución 5.

Después de que el init haya pasado a través de todos los niveles de ejecución, el guión de /etc/inittab ejecuta un proceso getty para cada consola virtual (login prompts) para cada nivel de ejecución (los niveles de ejecución 2-5 emplea seis consolas; el nivel de ejecución 1, que funciona en el modo de usuario único, sólo emplea una; los niveles de ejecución 0 y 6 no tienen consolas virtuales). Basicamente, el getty abre las líneas tty, establece sus modos, imprime el indicador de comandos de inicio de sesión, toma el nombre del usuario y luego comienza con el proceso de inicio de sesión para ese usuario. Esto permite a los usuarios autentificarse en el sistema y comenzar a usarlo.

También, el fichero /etc/inittab indica al init cómo debería manejar el que un usuario pulse Ctrl-Alt-Suprimir en la consola. Como Red Hat Linux debería ser cerrado e inmediatamente reiniciado, se da la orden a init de ejecutar el comando /sbin/shutdown -t3 -r now cuando un usuario ejecuta esta combinación de teclas. Además, en /etc/inittab se establece qué comando init debería funcionar en caso de fallar la energía, si su sistema tiene una unidad SAI (Sistema de Alimentación Ininterrumpida) conectado.

En el nivel de ejecución 5, el /etc/inittab ejecuta un guión llamado /etc/X11/prefdm. El guión prefdm hace funcionar su gestor de pantalla para X preferido (gdm si utiliza GNOME, kdm si utiliza KDE, o xdm si utiliza otro, basándose en los contenidos del archivo del directorio /etc/sysconfig/desktop

Ahora, debería estar viendo un indicador de comandos de inicio de sesión parpadeando en su pantalla. Todo esto no dura más que unos pocos segundos.

SysV Init

Como hemos visto, el programa init se pone en funcionamento a través del núcleo en el momento del arranque. Éste se encarga de iniciar todos los procesos normales que se necesita iniciar junto con el sistema. Éstos incluyen los procesos preparados que le permiten el registro de usuarios, demonios de NFS, demonios de FTP y cualquier otra cosa que necesite ejecutar cuando su máquina arranque.

SysV init es el proceso init estáandar en el mundo linux para controlar el inicio del software en el arranque del sistema, porque es más fácil de usar, más potente y flexible que el comando tradicional BSD init.

SysV init se diferencia también de BSD init en que los archivos de configuración están en /etc/rc.d en vez de encontrarse directamente en /etc. En /etc/rc.d, encontrará el fichero rc, el rc.local, el rc.sysinit y los siguientes directorios:

init.d
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

SysV init representa cada uno de los niveles de ejecución de init con un directorio separado, usando el init y enlaces simbólicos en cada uno de los directorios para interrumpir e iniciar los diferentes servicios mientras que el sistema cambia de un nivel de ejecución a otro.

Resumiendo, lo que ocurre en el arranque de un SysV init es lo siguiente:

El nivel de ejecución predeterminado se decide en el fichero /etc/inittab. Debería haber una línea en la parte superior como la siguiente:

id:3:initdefault:

El nivel de ejecución predeterminado es 3 en este ejemplo, el número inmediatamente después de los primeros dos puntos. Si desea cambiarlo, puede editar el fichero /etc/inittab manualmente. Tenga mucho cuidado cuando esté modificando el archivo inittab. Si se equivoca, puede solucionarlo reiniciando el equipo, accediendo al indicador de comandos boot: con la combinación de teclas Cntl-X y tecleando

boot:  linux single

Esto debería permitirle arrancar en el modo de usuario único para que pueda volver a modificar el fichero inittab en su valor precedente.

A continuación hablaremos de información dentro de los archivos de /etc/sysconfig, que definen los parámetros usados por los servicios de diferentes sistemas cuando se inicia el sistema.