Arrencada d'un sistema Linux

En aquest article parlarem sobre l’arrencada en un sistema Linux, incloent el procès i els seus elements. Tractarem el que són el BIOS i el UEFI amb les seves diferències, donarem informació sobre el procès d’arrencada en cada cas, el GRUB i alguna cosa més.

És un programa (firmware) que es troba dins una memòria no volàtil de la placa base i s’executa a l’encendre l’ordinador. Aquest programa suposa que els primers 440 bytes del primer dispositiu corresponen a emmagatzematge (bootstrap). Els primers 512 bytes d’un dispositiu d’emmagatzematge formatat en DOS s’anomenen MBR (Master Boot Record). Les passes per iniciar un sistema amb BIOS són:

  1. Procès POST (power-on self-test) Identifica falles de dispositius a l’encendre la màquina.
  2. El BIOS activa els components bàsics per carregar el sistema (sortida de vídeo, teclat, mitjans d’emmagatzematge).
  3. El BIOS carrega la primera etapa del gestor d’arrencada des de l’MBR (primers 440 bytes del primer dispositiu).
  4. La primera etapa del gestor d’arrencada crida a la segona (la que presenta les opcions d’arrencada i carrega el nucli del SO).

La seva funció és la mateixa que la de la BIOS, però té algunes diferències. El UEFI pot identificar particions i llegir sistemes de configuració que s’hi trobin. No es basa en MBR, sinó que es basa en la configuració de la seva memòria no volàtil (NVRAM) connectada a la placa base. La NVRAM indica la ubicació de programes compatibles amb UEFI (EFI applications) que s’executaran de manera automàtica o cridades des del menú d’arrencada.

Les EFI applications han d’estar en una partició del dispositiu d’emmagatzematge en un sistema d’arxius compatible (FAT12, FAT16 o FAT32). La seva partició és la EFI System partition (ESP). Aquesta conté les aplicacions assenyalades per les entrades guardades a la NVRAM. Les passes per iniciar un sistema amb UEFI són:

  1. Procès POST.
  2. El UEFI activa els components bàsics per carregar el sistema.
  3. El firmware UEFI llegeix les definicions emmagatzemades a NVRAM per executar l’aplicació EFI predefinida (dins la partició ESP). Normalment és un gestor d’arrencada.
  4. Si és un gestor d’arrencada, carregarà el nucli per iniciar el SO.

El UEFI admet Secure Boot, que només permet executar aplicacions EFI firmades (aplicacions EFI autoritzades pel fabricant de hardware).

El carregador d’arrencada més popular (per Linux x86) és GRUB (Grand Unified Bootloader). Quan és cridat per BIOS o UEFI, mostra una llista dels SO disponibles.

Des del menú GRUB es pot triar quin nucli carregar i passar-li paràmetres. Alguns dels paràmetres més útils són:

  • acpi Habilita/deshabilita el suport ACPI.
  • init Estableix un iniciador de sistema alternatiu.

    text

        init=/bin/bash #iniciarà una sessió de bash
  • systemd.unit Estableix systemd perquè s’activi.

    text

        systemd.unit=graphical.target #iniciarà una sessió gràfica que iniciarà serveis com gdm.
  • mem Estableix la quantitat de RAM disponible per al sistema.
  • maxcpus Estableix la quantitat de nuclis i CPUs disponibles per al sistema. El valor 0 desactiva el suport per màquines multiprocessador.
  • root Estableix la partició arrel (diferent de la preconfigurada en el gestor d’arrencada).

Normalment no cal canviar aquests paràmetres, però si es vol, s’agreguen a la línia GRUB_CMDLINE_LINUX dins /etc/default/grub per fer-los persistents. Un cop fet el canvi, s’ha d’executar la comanda:

bash

grub-mkconfig -o /boot/grub/grub.cfg

Quan el sistema està en execució, els paràmetres del nucli utilitzats es troben a /proc/cmdline.

El sistema operatiu depèn del nucli i també d’altres components, dels quals molts es carregaran en el procès d’inicialització del sistema. Els serveis/dimonis poden estar actius sempre, ja que poden ser responsables d’elements intrínsecs del sistema.

Hi ha varies maneres d’integrar dimonis i scripts d’inici a Linux. Sigui quina sigui, tan el sistema com l’administrador podran iniciar, detenir i reiniciar aquests serveis.

Un sistema operatiu com a tal només és el nucli i els components que controlen els dispositius i gestionen els processos, tot i que normalment ens referim a un SO com a un conjunt de software més ampli.

La inicialització del sistema comença quan el carregador d’arrencada carrega el nucli a la RAM. Desprès, el nucli prendrà control de la CPU i començarà a detectar i configurar aspectes fundamentals del sistema com configuracions de dispositius i el direccionament de la memòria.

El nucli del SO obrirà l’initramfs (initial RAM filesystem), que conté un sistema d’arxius temporal durant l’arrencada. Serveix per proporcionar els mòduls necessaris perquè el sistema pugui accedir al sistema d’arxius arrel.

Quan el sistema d’arxius arrel estigui disponible, el nucli muntarà els sistemes d’arxius a /etc/fstab i executarà el primer programa init. Aquest programa és responsable d’executar els scripts d’inicialització i els dimonis del sistema. Un cop executat, s’elimina initramfs de la ram. Hi ha diferents implementacions a més d’init, que tractarem més detalladament en un pròxim article:

  • SysV standard Administrador de serveis basat en SysVinit. Es basa en runlevels que van del 0 al 6.
  • systemd Administrador modern de sistemes i serveis amb estructura concurrent. Utilitza sockets i D-Bus per activar serveis, executar dimonis a comanda, monitorejar processos amb cgroups, suporta snapshots,… És el predeterminat en moltes distros Linux.
  • Upstart Substitut d’init. El seu objectiu és accelererar el procès d’arrencada paral·lelitzant el procès de càrrega de serveis del sistema.

L’espai de memòria on s’emmagatzemen els missatges (inclosos els d’arrencada), és el kernel ring buffer. Es buida quan el sistema s’apaga o s’executa:

bash

dmesg --clear

Si s’executa sense opcions, mostra els missatges actuals en el buffer:

bash

\# dmesg
[    0.000000] Linux version 6.9.5-arch1-1 (linux@archlinux) (gcc (GCC) 14.1.1 20240522, GNU ld (GNU Binutils) 2.42.0) #1 SMP PREEMPT_DYNAMIC Sun, 16 Jun 2024 19:06:37 +0000
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-linux root=UUID=d30d5ea1-5dc1-46a4-8148-d04d02a414b8 rw quiet splash loglevel=3 udev.log_level=3 vt.global_cursor_default=0 splash nvidia_drm.modeset=1
[    0.000000] BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009f000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000738fdfff] usable
[    0.000000] BIOS-e820: [mem 0x00000000738fe000-0x0000000075172fff] reserved
(...)

Si s’utilitza amb el paràmetre -b (o –boot=0), mostrarà els missatges de l’arrencada actual. Si es fa amb -b -1, els mostrarà de l’anterior (i així amb -b -2, -b -3,…). Si hi ha algun problema, els logs es troben a /var/log. Si no tenen format, és necessària la comanda journalctl -D ruta/al/log per llegir-los.

Fins aquí seria un petit resum del temari d’LPIC 101 sobre l’arrencada a Linux. Si t’ha estat útil pots deixar un comentari. Ens veiem al següent!