¿Qué pasa cuando pulsamos el botón de encendido de nuestro ordenador?

Por Laura Maño
Desarrolladora Open Source en OpenSistemas

Una de las cosas que más me ha llamado la atención siempre es cómo con un simple gesto podemos convertir un montón de hierros y plástico en una máquina tan compleja como es un ordenador. ¿Qué pasa cuando pulsamos el botón de encendido de nuestro ordenador? ¿Cómo se define este proceso y qué partes tiene? Voy a intentar explicarlo de la manera más sencilla posible.

Empecemos por la definición…

El proceso de arranque de un ordenador es un conjunto de acciones que inician el sistema operativo cuando el usuario enciende la máquina, y termina una vez el ordenador está preparado para contestar a los requerimientos del exterior.

La parte más o menos física es algo que podemos entrever: el botón de encendido está conectado con la fuente, esta se enciende y convierte la corriente de alterna a continua y empezamos a pasarla a través de los circuitos de la placa. Después, llegamos a la BIOS y aquí ya entran en juego los programas aun a medio camino entre el software y el hardware. En este punto la BIOS pide un chequeo de los dispositivos conectados al ordenador y lee la CMOS-RAM que contiene la información de los dispositivos físicos. Aquí ya ha reconocido el disco duro principal, la hora y la fecha del sistema y está preparado para cargar el sistema operativo, leyendo el primer sector del disco, que en él se encuentra el MBR (master boot record), un programa que determina el proceso de arranque.

La principal diferencia entre los sistemas Linux y Windows en el proceso de arranque reside en este punto. Mientras que en Linux este sector está vacío, en Windows además del código ejecutable, tiene información sobre el sistema de archivos.

En el MBR de Windows hay una partición del disco duro marcada como activa, y busca en ella el SO, comprueba si este sector es válido y carga el código del mismo sector. Después aparece el promt o la interfaz de Windows. En el caso del Linux existe un programa, el gestor del arranque, que busca el núcleo
del SO, lo carga en memoria y le cede el control. Algunas veces, también se lo pasa la dirección del disco duro que contiene el sistema de ficheros.

Un gestor de arranque (bootloader) es un programa sencillo que está diseñado para preparar todo lo que necesita el sistema operativo para funcionar. En la década de los 50 se utilizaban tarjetas perforadas para arrancar el SO y que estaban preparadas para ejecutar en la máquina (bastaba con apretar un botón para que se cargara el programa en la memoria).

Actualmente, el sistema de arranque es más complejo pero la idea es la misma, como hemos visto antes y dependiendo de las características los gestores pueden clasificarse de varias maneras.

Ficheros Map

El principal problema que tenemos cuando cargamos el sistema de arranque es que el kernel se encuentra en alguna parte del disco duro, en algún sector, y esto no es comprensible para la BIOS.

Para solucionar este problema tenemos los ficheros MAP, en los cuales se anotan los bloques físicos que contienen archivos lógicos. La BIOS los lee en orden de este fichero y se anotan los archivos lógicos en la RAM.

E gestor de arranque LILO se basa principalmente en estos mapas, cuando queremos cambiar algo en el gestor debemos reinstalarlo. El gestor tiene que volver a escribir los bloques físicos donde están ubicados los sistemas operativos, que daremos como opción de arranque.

Actualmente el sistema de arranque es más complejo, pero la idea es la misma. El gestor de arranque GRUB los utiliza pero se libera de ellos porque es capaz de examinar el sistema de archivos; esto le facilita acceder a ellos mediante la ruta y no mediante números de bloque.

Este es solo un pequeño ejemplo de las diferencias que existen entre los distintos gestores de arranque más conocidos en Linux. Ambos pertenecen al tipo de gestor de arranque de segunda etapa, ya que consisten en varios programas pequeños que se llaman los unos a los otros hasta que el último carga el sistema operativo. Este tipo es el más común aunque existen otros como los gestores de arranque flash, de red, para sistemas empotrados, etc.

Proyecto GNU GRUB

GNU GRUB (GNU Grand Unified Bootloader) es un gestor múltiple desarrollado por el proyecto GNU y se usa sobre todo en sistemas operativos GNU/Linux. La versión más conocida de este gestor es GRUB Legacy, aunque es mejor que sus predecesoras, se ha optado por cambiar completamente el gestor, reescribirlo de nuevo y crear GRUB 2.

Este proyecto se inició con el nombre de PUPA. Su objetivo era desarrollar un GRUB más limpio, seguro, robusto y potente, así como más portable y con soporte para diferentes idiomas.

El proyecto PUPA fue apoyado por la organización IPA (Information-technology
Promotion Agency) en Japón. PUPA se integró en el desarrollo de GRUB 2 alrededor del 2002 cuando la versión 0.9x de GRUB fue renombrada como GRUB Legacy. Desde febrero del 2008, GRUB 2 sigue en desarrollo y ha sido renombrada formalmente como GRUB, aunque está siendo usado en las versiones más recientes de distribuciones de GNU/Linux.

Fue diseñado por Erich Stefan Boleyn para formar parte del sistema GNU Hurd, en 1999. Gordon Matzigkeit y Yoshinori Okuji consiguieron que este fuera parte del paquete oficial del proyecto GNU, además de permitir que se pueda desarrollar libremente. Algunos de los objetivos del proyecto incluyen numerosas funcionalidades como, por ejemplo, el soporte de plataformas no-x86, la internacionalización, localización, caracteres no ASCII, módulos dinámicos, gestión de memoria, un mini-lenguaje de escritura de scripts, la migración de plataforma específica (x86) de código a la plataforma de módulos específicos y un marco orientado a objetos…

Arranque con GRUB

Este gestor tiene dos etapas. La primera está guardada en el MBR o en el sector de arranque de una partición. La etapa 1 puede cargar ya sea la etapa 1.5 o directamente, la 2.

La etapa 1.5 de GRUB Legacy, ubicada en los siguientes 30 kilobytes del disco duro, carga la etapa 2. En GRUB, esta fase ha dejado de existir. La segunda etapa contiene el código del gestor que presenta al usuario un menú de inicio y puede acceder al sistema de archivos, esta etapa se carga el núcleo del SO.

Cuando GRUB arranca vuelve a acceder a los archivos del menú de inicio, incluyendo las rutas, las particiones actuales hacia el kernel y el Ramdisk de inicio encuentra los archivos rápidamente.

El menú de arranque que vemos cuando inicia el ordenador está almacenado el
/boot/grub/menú.lst. Este archivo contiene la información de las particiones o de los sistemas operativos que se pueden arrancar desde el menú.
Dicho fichero está compuesto por comandos sencillos tipo bash, cada línea contiene un comando seguido de un parámetro.

Para reconocer cada entrada de un sistema operativo diferente se le da el título que vemos en el menú, esto nos permitirá seleccionar la partición que queremos. Por ello, el gestor puede acceder a los sistemas de archivos en los dispositivos de disco soportados por la BIOS antes de arrancar el SO, de esta forma los cambios en la BIOS no obligan a reinstalarlo. Esto es una gran ventaja, ya que permite cambiar todos los parámetros de arranque antes de reiniciar el ordenador y, además, podemos introducir parámetros en la consola del gestor, comprobar el kernel y el initrd antes de arrancar.

Este gestor nos ofrece múltiples posibilidades de arranque. Podemos seleccionar un SO concreto para que arranque si expira un tiempo de espera, un tiempo que también podemos modificar. Además del menú tenemos varios archivos más que nos permiten cambiar las direcciones de los archivos lógicos, darle una contraseña para el arranque, etc.

La diferencia que observamos a primera vista es que si solo tenemos un sistema operativo, el menú desparece y entramos directamente en la pantalla principal. En el caso de tener más de un sistema instalado en el equipo, el aspecto del menú es muy parecido al anterior.

Otras diferencias que encontramos son, por ejemplo, que la etapa 1,5 ha sido
eliminada, el gestor arranca directamente desde la dirección guardada en el MBR. La lista de kernels disponibles se genera automáticamente mientras actualizamos el archivo de configuración del gestor, incluso busca la de otros sistemas operativos tipo Windows.

Con un enfoque hacia el interior del gestor debemos comentar que la numeración de las particiones cambia, la primera es 1 en lugar de 0, aunque se puede modificar si es necesario en el archivo device.map en la carpeta /boot/ grub.

El archivo menú.lst ha sido reemplazado por grub.cfg, que es el producto de varios scripts y normalmente no debería ser editado directamente. Este archivo se actualiza cuando se modifica el núcleo o si el usuario ejecuta update-grub.
Este comando lanza la ejecución de los scripts del directorio etc/grub.d que genera automáticamente el fichero anterior con los ajustes del menú contenidos en /etc/default/grub.

Como hemos podido comprobar, la tarea de encender un ordenador es compleja y sumamente importante, así que resulta bastante interesante conocer un poco nuestros sistemas operativos y los diferentes tipos de arranque que nos pueden proporcionar e, incluso, podemos ser parte de su creación o mantenimiento.