Comandes LinuxGuies de LinuxInformació del sistema LinuxLinuxUtilidades linux

GRUB a Linux: configuració, línia de comandes i recuperació del sistema

GRUB, Terminal, Arranque, Modo de Recuperación, Root, Configuración Avanzada, Solución de Problemas, Proyecto Práctico, Privilegios, Maestría


GRUB és el programa que apareix just després d’encendre l’ordinador i abans que arrenqui Linux: el gestor d’arrencada. És el que mostra el menú per triar sistema operatiu o versió del nucli, carrega el nucli i l’initramfs a la memòria i hi passa els paràmetres d’arrencada. En aquesta guia veuràs com està organitzat, com configurar-lo correctament, com fer servir la seva línia de comandes i com fer-lo servir per recuperar un sistema que no arrenca o del qual has perdut la contrasenya.

Història i propòsit

GRUB (GRand Unified Bootloader) el va començar Erich Boleyn el 1995 i aviat va passar a formar part del projecte GNU, on el van continuar Gordon Matzigkeit i Yoshinori K. Okuji. Va néixer per superar els gestors d’arrencada de l’època, que eren molt limitats: GRUB entén els sistemes de fitxers (pot llegir el nucli directament d’una partició ext4, per exemple), permet arrencar diversos sistemes operatius i té una línia de comandes pròpia per resoldre problemes.

N’hi ha hagut dues generacions:

  • GRUB Legacy (fins a la versió 0.97): el fitxer de configuració era menu.lst, s’editava a mà i les particions es numeraven des de 0. Ja no es fa servir.
  • GRUB 2: el que porten totes les distribucions actuals (Debian 13 inclou la 2.12). La configuració es genera automàticament i és la que es descriu en aquesta guia.

Un apunt: el Raspberry Pi no fa servir GRUB. El seu firmware arrenca directament el nucli, i la configuració és a config.txt i cmdline.txt (a /boot/firmware/ a Raspberry Pi OS).

Com funciona l’arrencada

En un equip amb UEFI (gairebé tots els d’avui), el firmware busca a la partició EFI (/boot/efi) l’executable de GRUB (grubx64.efi, o shimx64.efi si hi ha arrencada segura). En equips antics amb BIOS, la primera part de GRUB és al principi del disc. Després, GRUB llegeix el fitxer grub.cfg, mostra el menú, carrega el nucli (vmlinuz-…) i l’initramfs (initrd.img-…) i hi cedeix el control.

Fitxers i directoris

Fitxer o directoriQuè conté
/etc/default/grubLa configuració que has d’editar: temps d’espera, entrada per defecte, paràmetres del nucli…
/etc/grub.d/Scripts que generen el menú, en ordre numèric: 00_header, 10_linux (els nuclis instal·lats), 30_os-prober (altres sistemes), 40_custom (les teves entrades)…
/boot/grub/grub.cfgEl menú final. Es genera automàticament: no l’editis, perquè es sobreescriu cada vegada que s’actualitza el nucli
/boot/grub/Mòduls, tipus de lletra (fonts/), temes (themes/) i el fitxer d’entorn grubenv

A Fedora, RHEL, Rocky i Alma el directori és /boot/grub2/, i les entrades de cada nucli es desen com a fitxers separats a /boot/loader/entries/ (format BLS).

Després de qualsevol canvi a /etc/default/grub o a /etc/grub.d/, cal regenerar grub.cfg:

# Debian, Ubuntu i derivades
sudo update-grub

# Fedora, RHEL, Rocky, Alma
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Configuració bàsica: /etc/default/grub

Aquest és el fitxer que ve per defecte a Debian 13 (sense els comentaris):

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`( . /etc/os-release && echo ${NAME} )`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

Les variables més útils:

VariableQuè fa
GRUB_TIMEOUT=5Segons que espera abans d’arrencar l’entrada per defecte. 0 arrenca de seguida, -1 espera indefinidament
GRUB_TIMEOUT_STYLEmenu mostra el menú; hidden l’amaga (és el que fa Ubuntu en equips amb un sol sistema)
GRUB_DEFAULTEntrada per defecte: un número (comptant des de 0), l’identificador de l’entrada o saved
GRUB_SAVEDEFAULT=trueAmb GRUB_DEFAULT=saved, recorda l’última entrada triada
GRUB_CMDLINE_LINUX_DEFAULTParàmetres del nucli només per a l’arrencada normal (no per a la de recuperació), p. ex. quiet splash
GRUB_CMDLINE_LINUXParàmetres del nucli per a totes les entrades
GRUB_DISABLE_OS_PROBERA false, busca altres sistemes operatius (Windows, altres Linux) i els afegeix al menú
GRUB_BACKGROUNDImatge de fons (.png, .jpg o .tga)
GRUB_THEMERuta al theme.txt d’un tema

Per exemple, per veure tots els missatges d’arrencada (molt útil per diagnosticar), treu quiet de GRUB_CMDLINE_LINUX_DEFAULT, desa i executa sudo update-grub.

Si el menú no apareix

Si GRUB_TIMEOUT_STYLE=hidden o només hi ha un sistema instal·lat, GRUB pot no mostrar el menú. Mantén premuda la tecla Maj (equips amb BIOS) o prem Esc repetidament (equips amb UEFI) just després d’encendre. Si vols que surti sempre, posa GRUB_TIMEOUT_STYLE=menu i un GRUB_TIMEOUT més gran que 0.

Canviar l’entrada per defecte

# Per a la propera arrencada només
sudo grub-reboot 2

# De manera permanent (requereix GRUB_DEFAULT=saved)
sudo grub-set-default 2

El número és la posició al menú, comptant des de 0. Si l’entrada és dins d’un submenú (com «Advanced options for Debian»), cal indicar-ne el camí amb >, p. ex. "1>2". A Fedora i RHEL les comandes es diuen grub2-reboot i grub2-set-default, i per canviar paràmetres del nucli es fa servir grubby.

Entrades personalitzades

Les entrades pròpies van a /etc/grub.d/40_custom, no a grub.cfg. El fitxer ja té aquesta capçalera, que no s’ha de tocar:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

A sota pots afegir entrades. Per exemple, una que arrenca el nucli en mode de rescat:

menuentry "Debian (mode de rescat)" {
    search --no-floppy --fs-uuid --set=root 8abab6b9-ef90-4fee-ae3d-91079bfae7c1
    linux /vmlinuz root=UUID=8abab6b9-ef90-4fee-ae3d-91079bfae7c1 ro systemd.unit=rescue.target
    initrd /initrd.img
}
  • search --fs-uuid --set=root busca la partició per UUID (el pots veure amb blkid) i la fa servir com a arrel per a GRUB. És molt més fiable que escriure set root=(hd0,1), que deixa de funcionar si canvia l’ordre dels discos.
  • linux indica el nucli i els seus paràmetres; initrd, la imatge inicial. A Debian i Ubuntu, /vmlinuz i /initrd.img solen ser enllaços al nucli més recent. Si tens /boot en una partició separada, les rutes són relatives a aquella partició (/vmlinuz-…).

Després, sudo update-grub. Per a l’arrencada dual amb Windows o una altra distribució no cal escriure res a mà: activa os-prober (GRUB_DISABLE_OS_PROBER=false) i regenera el menú.

Personalitzar l’aparença

GRUB_BACKGROUND="/boot/grub/fons.png"

GRUB_BACKGROUND és una imatge, no un color. Per a un canvi més complet, fes servir un tema:

  1. Copia’l a /boot/grub/themes/el_meu_tema/.
  2. Afegeix a /etc/default/grub: GRUB_THEME="/boot/grub/themes/el_meu_tema/theme.txt".
  3. Executa sudo update-grub.

Fixa’t que tant la imatge com el tema han de ser en una partició que GRUB pugui llegir en arrencar (millor dins de /boot/grub/).

Canviar opcions per a una sola arrencada

Al menú de GRUB, selecciona una entrada i prem e. Veuràs el seu contingut i el podràs editar. Busca la línia que comença per linux i afegeix-hi paràmetres al final, per exemple:

  • nomodeset: no carrega els controladors gràfics del nucli (útil si la pantalla queda en negre).
  • systemd.unit=rescue.target: mode de rescat (un sol usuari, amb el sistema de fitxers muntat).
  • systemd.unit=emergency.target: mode d’emergència (el mínim: l’arrel en només lectura).
  • acpi=off: desactiva l’ACPI (només per a maquinari amb problemes; pot deixar l’equip sense gestió d’energia).

Després prem Ctrl+X o F10 per arrencar. El canvi no es desa: a la propera arrencada tot torna a ser com abans.

La línia de comandes de GRUB

Des del menú, prem c. També hi aniràs a parar automàticament (amb el prompt grub>) si GRUB no troba el seu grub.cfg. Les comandes més útils:

ComandaQuè fa
lsLlista els discos i les particions: (hd0) (hd0,gpt1) (hd0,gpt2)…
ls (hd0,gpt2)/Llista els fitxers d’una partició (la barra final és important)
setMostra les variables (o n’assigna una: set root=(hd0,gpt2))
search --fs-uuid --set=root UUIDBusca una partició pel seu UUID i la fa servir d’arrel
cat (hd0,gpt2)/etc/fstabMostra un fitxer
linux, initrd, bootCarreguen el nucli i l’initramfs i arrenquen
configfile (hd0,gpt2)/boot/grub/grub.cfgCarrega un altre fitxer de menú
helpLlista les comandes

A GRUB 2 els discos es numeren des de 0 i les particions des d’1, i el nom inclou el tipus de taula de particions: (hd0,gpt2) és la segona partició del primer disc amb taula GPT; (hd0,msdos1), la primera d’un disc amb MBR. La tecla Tab completa noms de dispositius i de fitxers.

Arrencar a mà un sistema

Si GRUB no troba la configuració però el sistema és sencer, pots arrencar-lo així (adapta la partició i les rutes al que vegis amb ls):

grub> ls
grub> ls (hd0,gpt2)/
grub> set root=(hd0,gpt2)
grub> linux /vmlinuz root=/dev/sda2 ro
grub> initrd /initrd.img
grub> boot

Un cop dins, repara GRUB definitivament, per exemple amb sudo update-grub i, si cal, sudo grub-install.

Errors habituals

  • error: no such partition: la partició indicada no existeix (has canviat discos o l’ordre). Fes ls per veure les que hi ha i fes servir search --fs-uuid en lloc de noms fixos.
  • error: file '/vmlinuz…' not found: el nucli no és on GRUB el busca, sovint perquè s’ha esborrat o perquè /boot és en una altra partició. Comprova la ruta amb ls.
  • Prompt grub rescue>: GRUB ni tan sols troba els seus mòduls. Arrenca des d’un USB de la distribució i reinstal·la GRUB.

Recuperar l’accés com a root

Si has oblidat la contrasenya o el sistema no arrenca bé, GRUB permet entrar-hi amb una consola de root:

  1. Mostra el menú de GRUB i, sobre l’entrada del sistema, prem e.
  2. A la línia que comença per linux, afegeix al final una de les dues opcions que tens a continuació.
  3. Prem Ctrl+X o F10.

Les dues opcions:

  • systemd.unit=rescue.target: arrenca el mode de rescat. Et demanarà la contrasenya de root, i si el compte de root està bloquejat (com a Ubuntu, o a Debian instal·lat amb sudo), és possible que no t’hi deixi entrar.
  • init=/bin/bash: en lloc d’arrencar el sistema, obre directament una consola de root, sense demanar contrasenya.

Amb init=/bin/bash ja ets root, de manera que no cal su -. Però el sistema de fitxers arrel està muntat en només lectura, i abans de canviar res cal tornar-lo a muntar en lectura i escriptura:

mount -o remount,rw /
passwd joan        # canvia la contrasenya de l'usuari joan (o passwd, per a root)
sync
exec /sbin/init    # continua l'arrencada normal

En aquest mode no hi ha systemd en marxa, de manera que reboot no funciona com sempre: fes servir exec /sbin/init o reboot -f (després del sync).

A Ubuntu, el menú «Advanced options» té entrades de recovery mode amb una opció «root – Drop to root shell prompt» que fa una cosa semblant.

Seguretat

Això vol dir que qualsevol persona amb accés físic a l’equip pot obtenir una consola de root. Per evitar-ho:

  • Protegeix GRUB amb contrasenya: genera’n un hash amb grub-mkpasswd-pbkdf2 i afegeix-lo (amb set superusers i password_pbkdf2) a /etc/grub.d/40_custom.
  • Xifra el disc amb LUKS: és l’única protecció real, perquè sense la clau ningú pot llegir les dades encara que arrenqui des d’un USB.

Articles relacionats