lunes, 7 de febrero de 2011

El proceso de arranque de GNU/Linux en detalle


El mes pasado observamos, de manera superficial, el proceso de arranque de GNU/Linux, algo que resulta muy interesante no solo para resolver problemas que se presenten sino también como un valor añadido a nuestro conocimiento sobre este sistema operativo. Un proceso que comienza en el más bajo nivel de abstracción hasta llegar a un alto nivel de programación. Hoy veremos, gracias a los amigos de The Geek Stuff, cada uno de esos pasos en detalle a fin de crear una base de conocimiento muy importante para nosotros como profesionales especializados en este sistema. 

Al presionar el botón de encendido de nuestra computadora y luego de unos segundos (dependiendo del hardware) veremos el inicio de sesión de GNU/Linux. ¿Te has preguntado qué sucede tras el telón desde que la encendemos hasta que aparece la ventana de login aparece?


Las siguientes son las 6 etapas del proceso de arranque de una típica distribución de GNU/Linux.



1. BIOS
  • BIOS significa Basic Input/Output System (Sistema Básico de Entrada y Salida).
  • Realiza algunas revisiones de integridad al sistema. 
  • Busca, carga y ejecuta el programa de arranque (boot loader). 
  • Echa una mirada buscando el boot loader en floppy, cd-rom, o disco duro. En esta etapa podemos presionar una tecla (regularmente F12 o F2, esto depende del sistema) durante el arraque el BIOS para cambiar la secuencia de arranque. 
  • Una vez que el boot loader es detectado y cargado en memoria, el BIOS le entrega el control. 
  • Entonces, en pocas palabras, el BIOS carga y ejecuta el boot loader que se encuentra en el MBR. 
2. MBR
  • MBR significa Master Boot Record. 
  • Está localizado en el primer sector de un disco arrancable. Casi siempre /dev/hda, o /dev/sda 
  • El tamaño en bytes del MBR ronda los 512 o menos. Tiene 3 componentes: 1) Información primaria del boot loader en sus primeros 446 bytes, 2) Información de la tabla de partición en los siguientes 64 bytes, y 3) Revisión de validación del MBR en los últimos 2 bytes. 
  • Contiene información acerca de GRUB (o LILO en los sistemas antiguos). 
  • Entonces, en pocas palabras, MBR carga y ejecuta el GRUB boot loader. 
3. GRUB
  • GRUB significa Grand Unified Bootloader. 
  • Si tenemos varios kernels instalados en nuestro sistema, podemos seleccionar cuál de ellos deseamos ejecutar. 
  • Aunque depende si tenemos varios sistemas operativos instalados, casi siempre GRUB muestra un menú por varios segundos, si no presionamos alguna tecla, este carga la imagen del kernel establecida por defecto en el fichero de configuración de GRUB. 
  • GRUB tiene conocimiento acerca del sistema de archivos (LILO nunca tuvo la capidad de hacer esto). 
  • El fichero de configuración de GRUB es /boot/grub/grub.conf o /boot/grub/grub.cfg (/etc/grub.conf es un enlace a este). El siguiente es un ejemplo del fichero grub.conf de CentOS. 
#boot=/dev/sda 
default=0 
timeout=5 
splashimage=(hd0,0)/boot/grub/splash.xpm.gz 
hiddenmenu
title CentOS (2.6.18-194.el5PAE) root (hd0,0) 
 kernel /boot/vmlinuz-2.6.18-194.el5PAE ro 
 root=LABEL=/ initrd /boot/initrd-2.6.18-194.el5PAE.img
  • Como podemos ver contiene el kernel y la imagen initrd. 
  • Entonces, en pocas palabras, GRUB carga y ejecuta el Kernel y la imagen initrd. 
4. Kernel
  • El Kernel monta el sistema de archivos raiz como lo especifica “root=” en el fichero de configuración de GRUB. 
  • Ejecuta el programa /sbin/init.
  • Desde que init fue el primer programa en ser ejecutado por el Kernel, tiene el identificador de proceso (PID) número 1. Esto lo podemos ver con el comando top o haciendo un ‘ps -ef | grep init’. 
  • initrd significa Initial RAM Disk. 
  • initrd es utilizado por el kernel como un sistema de archivos raiz temporal hasta que el kernel es cargado y el sistema de archivos real es montado. Además contiene controladores necesarios compilados dentro de sí, lo que ayuda a accesar las particiones de los discos y cualquier otro hardware. 
5. Init
  • Init da una mirada al fichero /etc/inittab (Debian, Ubuntu y distros derivadas este fichero no existe porque utilizan algo llamado upstart) para decidir el runlevel a ejecutar. 
  • Estos son los runlevels disponible: 
0 – halt
1 – Single user mode
2 – Multiuser, without NFS
3 – Full multiuser mode
4 – unused
5 – X116 – reboot
  • Init identifica el initlevel por defecto desde /etc/inittab y utiliza esto para cargar todos los programas apropiados. 
  • Con el comando ‘grep initdefault /etc/inittab’ podemos ver cuál es el runlevel por defecto de nuestro sistema 
  • Si queremos dañarlo, podemos cambiar el runlevel por defecto a 0 o 6. Pero como sabemos lo que significan los runlevels 0 y 6, es probable que no lo hagamos. 
  • Comúnmente el runlevel por defecto es 3 o 5. 
6. Runlevel programs
  • Cuando el sistema está arrancando, podemos ver los servicios iniciando. Por ejemplo: “Starting sendmail …. OK”. Estos son los programas del runlevel, ejecutados desde el direcotorio correspondiente como fue definido en el runlevel. 
  • Dependiendo de la configuración de init por defecto, el sistema ejecutará los programas desde un de los siguientes directorios, según sea el caso:
Run level 0 – /etc/rc.d/rc0.d/ 
Run level 1 – /etc/rc.d/rc1.d/ 
Run level 2 – /etc/rc.d/rc2.d/ 
Run level 3 – /etc/rc.d/rc3.d/ 
Run level 4 – /etc/rc.d/rc4.d/ 
Run level 5 – /etc/rc.d/rc5.d/ 
Run level 6 – /etc/rc.d/rc6.d/
  • Notemos que aquí hay también enlaces simbólicos disponibles para esos directorios dentro de /etc directamente. Entonces, /etc/rc0.d es enlazado a /etc/rc.d/rc0.d. 
  • Bajo los directorios /etc/rc.d/rc*.d/, podemos ver programas cuyos nombres comienzan con S y K. 
  • Los programas que comienzan con S son utilizados durante el arraque. S de "startup". 
  • Los programas que comienzan con K son utilizados durante el apagado. K de "kill". 
  • Hay números justo después de las letras S y K en los nombres de los programas. Esos son la secuencia numérica en la que son iniciados o terminados. 
  • Por ejemplo, S12syslog es para iniciar el daemon syslog, el cual tiene una secuencia de 12. S80sendmail inicia el daemon de sendmail, el cual tiene una secuencia de 80. Por lo que podemos inferir que syslog será iniciado antes de sendmail. 

Ahí lo tenemos. Todo esto es lo que pasa cuando encendemos nuestra computadora con un sistema GNU/Linux instalado!

1 comentario:

  1. Hola que tal, interesante informacion, yo tengo Ubuntu 9.04 en dual boot con win xp (actualmente), pero tengo 1 problema, cuando enciendo mi lap compaq f755la sin nada conectado en los puertos usb, en la pantalla aparece una barra titilando y se reinicia, y se cicla hasta que inserte una pendrive o tarjeta inalambrica USB en el puerto derecho, pareciera como que carga algo en ella, pero asi y me aparece el logo de COMPAQ y puedo entrar al BIOS, si preciono la tecla para entrar al BIOS se quita el guion y entra, pero parece lento. Desde el recovery de ubuntu aparece: unable to enumerate usb device on port 2. Pero si elijo Ubuntu normal, o win XP si entra, solo que en XP la tengo que quitar cuando termina de cargar, para que me salga la pantalla de inicio, sino, se queda en negro, inicialmente tenia Win Vista y con el comenzo el problema, cuando pase a XP hace unos dias prendia bien,creo fue hasta que lo actualise a SP3, unas horas despues de instalarlo, en ubuntu solo tengo que hacerlo al prender la compu, pero ya con sesion trabajo bien y la puedo quitar. Ayer le quite el disco duro, y las RAM, y las aprete, pero sin disco duro hace lo mismo del guion. Que puede ser? Te agradeceria tu ayuda
    Mi correo es demon666747@hotmail.com

    ResponderEliminar