Red Hat Linux 7.1: Official Red Hat Linux Reference Guide | ||
---|---|---|
Anterior | Capítulo 3. Proceso de arranque, inicio y cierre del sistema | Siguiente |
Nota | |
---|---|
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.
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.
Advertencia | |
---|---|
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):
boot=/dev/hda, dice a LILO que mire en la primera unidad del disco duro en el primer controlador IDE.
map=/boot/map, localiza el mapa del archivo. En una utilización normal de LILO, este parámetro no debería de ser modificado.
install=/boot/boot.b, dice a LILO que instale el archivo especificado como sector de nuevo arranque. En una utilización normal, esto no debería de ser modificado. Si la línea install falta, LILO supondrá, por defecto, que quiere utilizar el fichero /boot/boot.b.
El parámetro prompt hace que LILO le muestre lo que aparece como referencia en la línea message. No se aconseja quitar la línea prompt pero, si lo hace, encontrará todavía una salida rápida manteniendo la tecla Shift pulsada mientras su máquina comienza el arranque.
timeout=50, establece la cantidad de tiempo que LILO esperará durante el inicio antes de proceder con la activación de la línea de entrada default. Este valor se mide en décimas de segundo, con 50 como valor predeterminado.
message=/boot/message, se refiere a la pantalla que LILO muestra para permitirle seleccionar el sistema operativo o el núcleo que quiere activar.
lba32, describe a LILO la geometría de la unidad del disco duro. Otro parámetro habitual aquí es linear. No debería cambiar esta línea a menos que esté muy seguro de lo que está haciendo. De lo contrario, podría poner su sistema en situación de no poder arrancarse.
default=linux, se refiere al sistema operativo predeterminado con el que LILO arrancará, partiendo de las opciones listadas debajo de esta línea. El nombre linux se refiere a la línea label en cada una de las opciones de activación abajo citadas.
image=/boot/vmlinuz-2.4.0-0.43.6, especifica el núcleo linux que se activará con esta opción particular.
label=linux, es el nombre de la opción del sistema operativo que aparecerá en la pantalla de LILO. En este caso, este es también el nombre al que se hace referencia en la línea default.
initrd=/boot/initrd-2.4.0-0.43.6.img, se refiere a la imagen initial ram disk que se usará en el arranque para inicializar y ejecutar el procedimiento que hace que la activación del núcleo sea posible. El disco de RAM inicial está formado por una acumulación de las unidades específicas de la máquina necesarias para hacer funcionar la unidad del disco duro y lo necesario para cargar el núcleo. Nunca debería tratar de usar los discos RAM de inicio en diferentes máquinas a menos que estos tengan una configuración hardware idéntica (y aún así, esto es una mala idea).
read-only, especifica que esta partición raíz (vea la línea abajo citada root ) no puede ser escrita, sino sólo leída.
root=/dev/hda5, informa a LILO qué partición de disco usar como partición de raíz.
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.
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.
Nota | |
---|---|
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.
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 núcleo entra en el /sbin en busca de init
init ejecuta el guión /etc/rc.d/rc.sysinit
rc.sysinit maneja la mayoría de los procesos de arranque del cargador y después ejecuta el rc.serial (si existe)
init ejecuta todos los guiones para el nivel de ejecución predeterminado.
init ejecuta /etc/rc.d/rc.local
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.