L'essentiel sur GRUB legacy et GRUB2 sous Linux

Un guide simple pour vous aider à trouver rapidement votre chemin lorsque vous travaillez sur des sujets de démarrage de systèmes d'exploitation avec GRUB comme chargeur de démarrage, sur des distributions Linux basées sur Debian et Red Hat.

L'essentiel sur GRUB legacy et GRUB2 sous Linux
Photo par Laurent Herrera / Unsplash

Introduction

Pour une introduction à GRUB (aperçu, historique, modifications par rapport à l'héritage GRUB, rôle, fonctionnalités, etc.), exécutez la commande suivante sur votre distribution Linux préférée :

info -f grub -n 'introduction'

Grub legacy

Fichiers de configuration Grub legacy

Pour les distributions basées sur Debian (Debian, Ubuntu...), le fichier de configuration principal est /boot/grub/menu.lst. Les distributions basées sur Red Hat (RHEL, Centos, Fedora...) utilisent /boot/grub/grub.cfg au lieu de /boot/grub/menu.lst. Le fichier de configuration se compose de deux sections : les définitions globales et les définitions du menu de démarrage des systèmes d'exploitation.

#---------------------------------------------------------------------#
# Global definitions (all available configuration directives setting) #
#---------------------------------------------------------------------#

default 0   # Use the first OS boot menu definition by default, to boot the system
            # 0 = first menu entry , 1 = second menu entry , etc...
color white/blue yellow/blue    # white/blue = foreground/background colors for the normal menu entries ; 
                                # yellow/blue = foreground/background colors for the selected menu entries
timeout 5   # wait 5 seconds after the boot menu entries displays, before using the default
            # menu entry to boot the system
fallback 3  # Use the fourth boot menu entry as fallback (in case booting using the default menu entry fails)
            # 0 = first menu entry... 3 = fourth menu entry
splashimage path_to_the_image   # points to an image to use as background image for the boot menu
hiddenmenu  # hide the menu section options

#-------------------------------------------------------------------------------------------------#
# Operating systems boot menu definitions (essential configuration directives, not all available) #
#-------------------------------------------------------------------------------------------------#

title My_Menu_entry_Title
root (hdX,Y)    # specify the root device drive and partition
                # Examples : (hd0,0) = first partition of the first hard drive device
                             (hd0,1) = second partition of the first hard drive device
kernel (hdX,Y)/boot/vmlinuz  # specify the kernel binary file path
initrd /boot/initrd     # specify the initial RAM disk image path. / = root device defined with "root (hdX,Y)"
rootnoverify (hdX,Y)    # define the root device drive and partition (/boot) for booting into a non-Linux system like windows

Exemple de fichier de configuration Grub legacy

default 0
timeout 10
color white/blue yellow/blue

title CentOS Linux
root (hd1,0)
kernel (hd1,0)/boot/vmlinuz
initrd /boot/initrd

title Windows
rootnoverify (hd0,0)

Voir la section Fichiers de configuration GRUB legacy pour plus d'informations sur les directives utilisées dans cet exemple de fichier de configuration GRUB legacy.

Installation de Grub Legacy et Grub2

GRUB peut être installé sur le MBR (Master Boot Record) d'un disque entier à l'aide de la commande grub-install suivie du chemin du périphérique de disque :

# Linux format
grub-install /dev/sda

# GRUB legacy format
grub-install '(hd0)'

GRUB peut également être installé sur le secteur de démarrage (/boot) d'une partition de disque au lieu du MBR d'un disque dur à l'aide de la commande grub-install suivie de la partition du périphérique de disque de destination :

# Linux format
grub-install /dev/sda1

# GRUB legacy format
grub-install '(hd0,0)'

Grub2

Fichiers de configuration Grub2

Pour les distributions basées sur Debian (Debian, Ubuntu...), le fichier de configuration principal est /boot/grub/grub.cfg. Les distributions basées sur Red Hat (RHEL, Centos, Fedora...) utilisent /boot/grub2/grub.cfg. Le répertoire /etc/grub.d/ contient des fichiers de configuration distincts qui sont regroupés pour créer le fichier de configuration principal de Grub2.

Pour mettre à jour le fichier de configuration principal de Grub2 avec les configurations du répertoire /etc/grub.d, les commandes suivantes peuvent être utilisées :

# Commands to generate/update the main Grub2 configuration file

# Debian based distributions
# Main Grub2 configuration file: /boot/grub/grub.cfg
update-grub # this is a stub command to the next one:
grub-mkconfig -o /boot/grub/grub.cfg

# Red Hat based distributions
# Main Grub2 configuration file: /boot/grub2/grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg

Ne modifiez jamais directement le fichier de configuration principal de Grub2. Ajoutez plutôt de nouvelles entrées de chargeur de démarrage dans de nouveaux fichiers à l'intérieur du répertoire /etc/grub.d ou à l'intérieur du fichier /etc/grub.d/40_custom, puis exécutez les commandes de mise à jour de configuration comme indiqué ci-dessus.

Le fichier /etc/default/grub contient des paramètres de configuration clé/valeur qui peuvent être utilisés pour modifier le comportement du chargeur de démarrage Grub (définir l'entrée du chargeur de démarrage qui sera chargée par défaut, modifier la couleur/image d'arrière-plan du menu du chargeur de démarrage, définir le délai de chargement de l'entrée du chargeur de démarrage, etc.). Les configurations de ce fichier sont également récupérées lors de la génération du fichier de configuration principal de Grub2, avec les commandes présentées précédemment. Voici un exemple de contenu du fichier de configuration /etc/default/grub :

# Sample content of /etc/default/grub on Ubuntu 20.04.6 LTS

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

(...)

Exemple de fichier de configuration Grub2

menuentry "CentOS Linux" {
    set root=(hd1,1)   # specify the root device drive and partition. Unlike GRUB legacy
                       # GRUB2 uses environment variables to configure settings instead of 
                       # commands. Also, unlike GRUB legacy, GRUB2 uses 1 for the first partition 
                       # instead of 0. GRUB2 still uses 0 for the first hard drive
                       # Examples : (hd0,1) = first partition of the first hard drive device
                                    (hd1,2) = second partition of the second hard drive device
    
    linux /boot/vmlinuz   # specify the kernel binary file path. Unlike GRUB legacy, GRUB2 uses 'linux' 
                          # instead of 'kernel' command
    
    initrd /initrd        # specify the initial RAM disk image path. / = root device defined with "set root=(hdX,Y)"
}
    
menuentry "Windows" {   
    set root=(hd0,1)    # same syntax to set the root device for non-Linux systems
}

Interfaces Grub et comment obtenir des informations supplémentaires

Accéder au manuel complet de Grub

Pour ouvrir le manuel complet de Grub à partir de votre distribution Linux préférée, utilisez la commande suivante :

# Open Grub full manual
info -f grub

Tous les paramètres de configuration pour /etc/default/grub

Pour obtenir des informations sur tous les paramètres disponibles pour le fichier de configuration /etc/default/grub, utilisez la commande suivante :

# All available config parameters for /etc/default/grub
info -f grub -n 'Simple configuration'

Accéder au menu Grub avant le démarrage

La touche Echap peut être utilisée pour accéder au menu du chargeur de démarrage grub2 avant le démarrage. Utilisez la touche Maj pour le chargeur de démarrage grub legacy.

Accéder à la CLI de Grub avant le démarrage

Grub est doté d'une interface de ligne de commande intégrée qui peut être utilisée au démarrage pour modifier le comportement de Grub (mettre à jour les options de démarrage, mettre à jour les variables d'environnement de Grub, etc.). La touche c peut être utilisée pour entrer dans le shell intégré de Grub au démarrage, après l'apparition du menu du chargeur de démarrage de Grub. La commande help peut être utilisée dans le shell pour obtenir des informations sur toutes les commandes disponibles.

Modification des entrées du menu Grub avant le démarrage

La touche e peut être utilisée au démarrage, sur une entrée spécifique du menu de démarrage, pour la modifier. Après l'édition, CTRL+O peut être utilisé pour enregistrer les modifications. Les modifications ne seront disponibles que pour la session de menu Grub en cours. Un redémarrage chargera la configuration des entrées de menu Grub précédentes.

La modification des entrées du menu Grub au démarrage peut être utile pour :

  • démarrer en mode simple (single) pour les systèmes d'initialisation SysV
  • démarrer en mode secours (rescue) pour les systèmes d'initialisation Systemd (lance un shell une fois que le système de fichiers racine est monté en lecture/écriture)
  • démarrer en mode d'urgence pour les systèmes d'initialisation Systemd (lance un shell avant que la plupart des systèmes de fichiers ne soient montés)
  • démarrer dans un shell en dernier recours (lorsque le système d'initialisation est cassé par exemple)

Mettre à jour les modes de démarrage (simple, secours, urgence ou shell)

Pour cela, les mots clés single, rescue, emergency ou init=/bin/sh doivent être passés comme paramètre du noyau lors de l'édition d'une entrée de démarrage :

# For Grub legacy bootloader
kernel ... single
kernel ... rescue
kernel ... emergency
kernel ... init=/bin/sh

# For Grub2 bootloader
linux ... single
linux ... rescue
linux ... emergency
linux ... init=/bin/sh

Après avoir enregistré les modifications et démarré à l'aide de l'entrée de menu modifiée, le mot de passe root vous sera demandé pour démarrer la session, mais il n'est peut-être pas nécessaire de le saisir.

Informations sur les interfaces Grub

Pour obtenir des informations sur les interfaces Grub (interface de menu et ligne de commande) et sur ce que vous pouvez faire à l'intérieur de ces interfaces et avec quelles commandes, utilisez la commande suivante :

info -f grub -n 'interface'

Informations sur les variables d'environnement Grub

Pour obtenir des informations sur les variables d’environnement Grub, utilisez la commande suivante :

info -f grub -n 'environment'

Informations sur toutes les commandes Grub

Pour obtenir des informations sur toutes les commandes Grub disponibles, leurs portées (menu, entrée de menu, ligne de commande, etc.) et leurs descriptions, utilisez la commande suivante :

info -f grub -n 'commands'