GRUB et mises à jour Debian : ce qui se déclenche automatiquement, ce qu’on touche à la main
Sur une Debian stable, GRUB se met à jour tout seul à chaque installation ou suppression de noyau Linux : le script update-grub est appelé par un hook dpkg, et grub-mkconfig régénère /boot/grub/grub.cfg sans intervention. Ce qui demande une action à la main, c’est l’installation initiale (paquet grub-pc ou grub-efi-amd64, grub-install sur le bon disque), la modification de la configuration (/etc/default/grub, scripts dans /etc/grub.d/), et le recovery quand le menu GRUB apparaît parce que la machine n’a plus démarré normalement. Ce qui suit décrit ces trois gestes, les commandes documentées par le wiki Debian, et deux opérations qu’il ne faut pas improviser. Pour situer GRUB dans les décisions Debian, consultez la vue d’ensemble de Debian.
Sommaire

Les éléments mesurés ici viennent d’une machine de contrôle (Ubuntu 24.04.4 LTS, GRUB 2.12, paquets grub-common, grub-efi-amd64-bin, grub-pc, grub2-common, linux-base) et des pages de manuel grub-mkconfig(8), grub-install(8), update-grub(8) du paquet grub-common. Le comportement est identique sur Debian 13 trixie : les paquets concernés s’appellent simplement grub-common, grub-pc et grub-efi-amd64 sur Debian, et la documentation Debian le précise.
Ce que GRUB fait sur Debian, et avec quels paquets
GRUB est un chargeur d’amorçage : il lit un fichier de configuration, affiche un menu (quand l’affichage est activé), et charge en mémoire le noyau Linux ou un autre système. Sur Debian, la chaîne est tenue par trois paquets, qu’on distingue par le micrologiciel de la machine.
grub-common est le paquet transverse : il contient les pages de manuel (grub-mkconfig(8), grub-install(8), update-grub(8)), le script update-grub, et l’arborescence /etc/grub.d/ qui contient les fragments lus par grub-mkconfig. Ce paquet est installé sur toute machine Debian qui utilise GRUB.
grub-pc est le paquet pour le démarrage en mode BIOS hérité. Il installe l’image GRUB pour la plateforme i386-pc et le fichier /usr/sbin/grub-bios-setup. C’est ce qu’on installe sur une machine dont le micrologiciel est resté en mode BIOS/CSM.
grub-efi-amd64 (et son pendant signé grub-efi-amd64-signed) est le paquet pour le démarrage en mode UEFI. Il installe l’image GRUB pour la plateforme x86_64-efi et la pose dans la partition EFI (ESP) de la machine, généralement montée sur /boot/efi. C’est ce qu’on installe sur une machine dont le micrologiciel est en mode UEFI, ce qui est le cas par défaut depuis 2012 sur le matériel grand public.
Sur la machine de contrôle, la liste est mesurée ainsi :
dpkg -l grub-* | grep ^ii
et le retour, daté du 15 septembre 2026, porte grub-common, grub-efi-amd64-bin, grub-efi-amd64-signed, grub-gfxpayload-lists, grub-pc, grub-pc-bin. Les deux familles cohabitent parce que la machine est en mode UEFI : grub-pc est présent mais inactif, et le chargeur amorcé au démarrage est celui de grub-efi-amd64. Sur une machine Debian, la commande analogue rend grub-common, grub-pc-bin, grub-pc (BIOS) ou grub-common, grub-efi-amd64-bin, grub-efi-amd64-signed (UEFI).
Deux fichiers de référence, à lire avant toute modification :
/etc/default/grub: les variables lues par les scripts de/etc/grub.d/. C’est ici qu’on règleGRUB_TIMEOUT,GRUB_CMDLINE_LINUX_DEFAULT, l’OS par défaut, et l’activation ou non deos-prober. Sur la machine de contrôle,GRUB_TIMEOUT=0etGRUB_TIMEOUT_STYLE=hiddenrendent le menu invisible au démarrage normal./boot/grub/grub.cfg: le fichier généré, lu par GRUB au démarrage. Il ne s’édite pas à la main : on modifie/etc/default/grubou les scripts de/etc/grub.d/, puis on exécuteupdate-grub.
Quand une mise à jour déclenche update-grub toute seule
Une mise à jour Debian qui touche le noyau Linux (installation d’un linux-image-X.Y.Z-generic, suppression de l’ancien) déclenche automatiquement update-grub. Le déclencheur est un script dpkg, posé par le paquet linux-base dans /etc/kernel/postinst.d/ et /etc/kernel/postrm.d/. Sur la machine de contrôle, le fichier /etc/kernel/postinst.d/zz-update-grub est un script shell de 23 lignes ; en substance, il vérifie que update-grub est disponible, que la machine n’est pas un conteneur (systemd-detect-virt --container), que le mode dpkg est bien configure ou remove, et que /boot/grub/grub.cfg existe. Si tout est vrai, il exécute update-grub.
Le script exécuté est lui-même un fragment très court :
#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"
update-grub est documenté comme un stub for running grub-mkconfig -o /boot/grub/grub.cfg par sa propre page de manuel. La commande unique réellement exécutée est donc grub-mkconfig, avec -o /boot/grub/grub.cfg comme seule option forcée.
Trois conséquences concrètes, qu’on observe sans rien modifier :
- Le fichier
/boot/grub/grub.cfgest régénéré, mais le fichier/etc/default/grubreste tel quel : c’est l’entrée du processus, pas sa sortie. - Le hook ne tourne pas dans un conteneur (vérification par
systemd-detect-virt --container). Une machine Debian installée dans Docker ou LXC ne reconfigure pas son GRUB hôte par ce mécanisme, ce qui est conforme à l’usage. - Le hook n’inscrit pas de nouvelle entrée dans le menu si
/boot/grub/grub.cfgn’existe pas : c’est le cas d’une machine qui n’a jamais eu GRUB installé, et c’est aussi un signal pour comprendre pourquoi une mise à jour noyau n’a rien fait.
Les scripts lus par grub-mkconfig sont dans /etc/grub.d/. Sur la machine de contrôle, le dossier contient treize fichiers exécutables, numérotés pour fixer l’ordre : 00_header (entête), 10_linux (entrées de noyaux), 10_linux_zfs, 20_linux_xen, 25_bli, 30_os-prober (détection d’autres OS), 30_uefi-firmware, 35_fwupd, 40_custom, 41_custom. Le wiki Debian explique l’usage de 40_custom pour ajouter une entrée manuelle ; le fichier commence par une ligne exec tail -n +3 "$0" qui saute son propre shebang. Toute modification d’un de ces fichiers doit être suivie d’un update-grub pour prendre effet.
Comment lire le menu GRUB quand il apparaît
Le menu GRUB apparaît dans trois cas, documentés par la page wiki Debian GRUB et confirmés par la pratique : multiboot avec d’autres OS détectés par os-prober, échec de démarrage précédent (le fichier /boot/grub/grubenv conserve la trace du dernier échec), appui sur Shift pendant le démarrage en mode BIOS, ou appui sur Esc pendant le démarrage en mode UEFI quand le menu est masqué par GRUB_TIMEOUT_STYLE=hidden.
Trois gestes à connaître dans le menu :
- Changer l’entrée par défaut pour ce démarrage. Les touches flèches haut et bas déplacent la sélection ;
Entervalide. La sélection n’est pas persistante : elle ne s’inscrit pas dansgrubenvsi on ne la confirme pas. - Éditer une entrée avant de la démarrer. La touche
eouvre l’éditeur intégré de GRUB. On y voit les variableslinux(chemin du noyau),initrd(chemin de l’initramfs), et les arguments passés au noyau. Une modification dans cet éditeur n’est pas persistante non plus : elle vaut pour ce démarrage. - Changer l’entrée par défaut pour tous les démarrages suivants. La commande
grub-set-default N(oùNest le numéro d’ordre dans le sous-menu, base 0) modifie la variablesaved_entryde/boot/grub/grubenv. C’est l’usage documenté pour basculer définitivement sur un noyau antérieur après un incident, par exemple quand un nouveau noyau ne démarre pas sur ce matériel.
Pour démarrer sur un noyau antérieur, deux commandes utiles en console, sans modifier la configuration permanente :
grub-reboot N
qui programme le prochain démarrage sur l’entrée N sans toucher au défaut, et :
grub-set-default N
qui rend ce démarrage permanent. La page de manuel grub-reboot(8) précise que la modification est annulée au premier redémarrage réussi : c’est exactement le geste à faire après l’installation d’un nouveau noyau qu’on veut tester une fois avant de l’adopter.
Comment installer GRUB sur un disque (l’opération risquée)
L’installation initiale de GRUB sur le MBR (mode BIOS) ou dans la partition EFI (mode UEFI) se fait avec grub-install. C’est la seule commande qui écrit dans le chargeur d’amorçage, et c’est l’opération qu’il ne faut pas improviser : un mauvais périphérique cible peut rendre la machine incapable de démarrer sans qu’aucun message d’erreur ne le dise clairement.
La commande documentée par grub-install(8) :
sudo grub-install --target=i386-pc /dev/sdX
pour une machine BIOS, en remplaçant /dev/sdX par le disque d’amorçage et non par une partition (/dev/sda, pas /dev/sda1). La page de manuel précise que l’option --target sélectionne la plateforme (i386-pc, x86_64-efi, etc.) et que l’argument final est le périphérique d’installation, pas son contenu.
Pour une machine UEFI :
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
--efi-directory pointe sur la partition EFI montée (par défaut /boot/efi sur Debian). --bootloader-id est l’identifiant de l’entrée EFI : c’est ce qui apparaîtra dans le menu de démarrage du micrologiciel UEFI. Le wiki Debian recommande de garder une valeur stable pour ne pas casser le démarrage par NVRAM.
Trois risques concrets documentés :
- Se tromper de disque. Une installation GRUB sur un disque de données ou sur un disque secondaire n’empêche pas la commande de réussir : elle écrit silencieusement un chargeur d’amorçage sur le mauvais disque, et la machine ne démarre plus si l’autre disque tombe.
- Lancer
grub-installsur une partition EFI déjà partagée. Si une autre distribution occupe déjà la partition EFI, la commande installe ses propres fichiers mais peut écraser l’entrée de démarrage UEFI existante. La commande possède une option--no-nvram(documentée pargrub-install(8): don’t update the boot-device/Boot* NVRAM variables. This option is only available on EFI and IEEE1275 targets) qui écrit dans la partition sans toucher au NVRAM, mais cela suppose de mettre à jour le NVRAM par un autre moyen ensuite. - Échec d’écriture du secteur d’amorçage. Sur certains contrôleurs RAID matériels ou certaines machines virtuelles,
grub-installéchoue à écrire le secteur 0 sans message d’erreur explicite. Le wiki Debian recommande alors d’utiliser l’option--forceen dernier recours, après avoir vérifié que le disque cible est bien le bon.
Sur une Debian stable installée par l’installateur officiel, cette commande n’a pas besoin d’être lancée à la main : l’installateur la pose pendant l’installation, et les paquets grub-pc ou grub-efi-amd64 appellent update-grub à chaque changement de noyau. C’est aussi pour cette raison que la commande reste risquée à exécuter sans raison.
Trois opérations à ne pas improviser
La page wiki Debian GRUB, le manuel Debian et la page grub-install(8) convergent sur trois gestes qu’il faut laisser à un professionnel ou n’accomplir qu’après une sauvegarde vérifiée.
Modifier manuellement /boot/grub/grub.cfg. Ce fichier est régénéré à chaque update-grub. Une modification manuelle est écrasée au prochain déclenchement du hook (donc à la prochaine installation de noyau) sans avertissement. Le bon endroit pour une modification durable est /etc/default/grub ou un script dans /etc/grub.d/.
Effacer /boot/grub/grubenv. Ce fichier contient les variables d’état de GRUB : entrée par défaut, dernier échec, paramètres du dernier démarrage. Son absence fait tomber GRUB sur ses valeurs par défaut, et certains firmwares UEFI traitent l’absence d’entrée NVRAM comme un signal de redémarrage forcé. Le wiki Debian recommande de ne pas le supprimer, et de préférence de ne pas y écrire à la main.
Lancer dd if=/dev/zero of=/dev/sdX bs=446 count=1 ou équivalent pour nettoyer le MBR. Cette commande efface les 446 premiers octets du MBR (avant la table de partitions), ce qui supprime GRUB mais aussi toute entrée d’amorçage alternative. Sur une machine UEFI, la même logique avec un fichier EFI dans /boot/efi casse le démarrage de la même manière. Le geste correct, quand on veut vraiment retirer GRUB, est de le faire depuis le système qui démarre encore, avec une commande qui restaure un autre chargeur d’amorçage (l’installateur de l’autre distribution, par exemple).
Cas traité ailleurs
- L’installation initiale de GRUB pendant l’installateur Debian : couverte par la page Debian : installer et mettre à jour un système stable, qui décrit le déroulé complet et la vérification d’image avant l’installation.
- La mise à jour des paquets Debian eux-mêmes (et la commande
apt full-upgrade) : traitée par la page Debian : administration au quotidien, où la séquenceupdatepuisupgradeest présentée dans son contexte. - Le détail de l’UEFI sur Debian (NVRAM, Secure Boot, variables efivars) : la documentation Debian le couvre dans la section Firmware booting du guide d’installation ; ce qui touche directement GRUB est résumé ici, le reste dépasse ce périmètre.
- Le démarrage d’une machine chiffrée (LUKS, LVM) : GRUB est configuré pour charger un fichier de configuration qui demande la passphrase, mais le détail du chiffrement est traité dans la documentation Debian et dépasse le sujet de GRUB.
Repères pour aller plus loin
Pour approfondir ce qui est cité ici :
- le guide Linux et terminal rassemble les pages de l’univers Linux publiées ici ;
- Debian : administration au quotidien pour le cycle de mise à jour et la lecture des paquets ;
- Debian : installer et mettre à jour un système stable pour le moment installation, où GRUB est posé par l’installateur ;
- les premières commandes Linux pour les gestes sûrs dans un terminal avant de toucher à
/etc/default/grub; - les services et journaux systemd pour comprendre ce qui se passe au démarrage après un échec ;
- diagnostiquer une connexion quand le réseau ne répond plus, y compris après une mise à jour noyau.
- Durcissement minimal d’un poste Linux pour appliquer les gestes qui suivent la pose de GRUB : permissions, mises à jour automatiques, pare-feu.
Comprendre GRUB, c’est voir où se trouve la frontière entre ce qui se déclenche tout seul (le hook dpkg sur linux-image) et ce qui demande une décision humaine (le choix du disque cible, l’édition de /etc/default/grub, le démarrage sur un noyau antérieur). Le reste tient en peu de commandes, et ces commandes sont déjà documentées par Debian.