En Linux, ¿cómo encuentra un gestor de arranque un disco de arranque?

En Linux, ¿cómo encuentra un gestor de arranque un disco de arranque?

Estoy usando CentOS 7 y le he conectado varios discos. Sé que mi sistema operativo, kernel, initramfs, etc. reside en "/dev/sda" y ese es el disco de arranque. Pero ¿cómo deduce esto grub2? ¿Comprueba todos los discos conectados uno por uno?

Respuesta1

Técnicamente: Linux no encuentra ningún disco de arranque, porque cuando Linux se ejecuta, el gestor de arranque ha hecho su trabajo, que es:

  • copiar Linux desde un archivo a la RAM en algún lugar
  • copie el initramfs de un archivo a la RAM en algún lugar
  • en algunas arquitecturas como ARM: copie cosas adicionales como un árbol de dispositivos o un descriptor de arquitectura en algún lugar de la RAM
  • pase el control a la primera ubicación en la RAM donde se copió Linux y ahora el gestor de arranque ya no estará activo.

El firmware UEFI moderno, así como elementos en plataformas que no son x86 como U-Boot, tendrán "entradas de inicio" almacenadas en el firmware: una entrada de inicio contiene un dispositivo de almacenamiento y un nombre de archivo, y el firmware irá en orden y cargará/ejecutará el primer archivo que encuentra. Puede cambiar el orden accediendo a la configuración de UEFI y realizando cambios, o utilizando una utilidad en su sistema operativo para modificar la configuración de UEFI NVRAM.

Ahora bien, lo que pasa con UEFI en x86 es que cargará un único binario en la RAM, pero normalmente Linux también necesita al menos un initramfs para arrancar (aunque este no es un requisito estricto de Linux).

Además, históricamente, x86 tenía firmware (BIOS) más primitivo que simplemente cargaba el primer sector de un dispositivo de almacenamiento (orden determinado por la configuración del BIOS) y ni siquiera intentaba buscar/cargar archivos.

Es por eso que en la mayoría de los sistemas Linux, lo que UEFI realmente carga (que es lo que obedece el orden de arranque/busca dispositivos de arranque) es GRUB: es una plataforma de cargador de arranque común para Linux (y otros sistemas operativos si se desea) que realmente funcionará. muchas de las cosas previas al arranque quedeberíaestar en el firmware, pero no lo está por varias razones, y también le brinda un entorno para hacer cosas antes de que se cargue un sistema operativo.

Al instalar Linux, el instalador configurará GRUB generando un archivo de configuración al que GRUB pueda acceder y agregará entradas al menú de GRUB que le indican a GRUB dónde ir para cargar el kernel e initramfs. Múltiples entradas son posibles e incluso comunes; por ejemplo, Debian instalará un segundo elemento de menú para un kernel de rescate, aproximadamente equivalente al Modo seguro de Windows. Pero todo esto lo establece el instalador cuando se instala Linux, y se accede a esas opciones después de que UEFI haya hecho su trabajo.

(Por cierto, una de las cosas que me gustó de U-Boot fue que cargará el kernel y initramfs directamente, por lo que GRUB no era necesario en absoluto. Pero ese era un dispositivo ARM con firmware personalizable).

Windows tiene su propio "GRUB" llamado winload.exeque hace las cosas que Windows necesita y, opcionalmente, proporciona opciones de menú previas al inicio, antes del inicio que el firmware tampoco hace. Se utiliza bcdeditpara cambiar las opciones del menú allí. Las versiones de Windows anteriores a Vista usaban NTLDR y las cosas se podían configurar con el archivo IIRC C:\boot.ini.

Linux no requiere GRUB: durante mucho tiempo se utilizó un gestor de arranque más sencillo llamado LILO (Linux Loader) y es probable que algunas distribuciones todavía lo utilicen.

información relacionada