Aller au contenu
Sylvain Joffraud l4w
Retour

`apt install grub-pc` qui se fige sans tty

Je suis sur mon NAS via SSH (sans terminal interactif particulier, juste un ssh root@host "command"). Je veux installer gdisk sur Debian 12. Banal :

$ ssh root@nas "apt-get install -y gdisk"

La commande ne rend jamais la main. 32 minutes plus tard, je perds patience et regarde côté NAS :

$ ps -ef | grep -E 'apt|dpkg|grub'
root  479  bash -c apt-get install -y gdisk
root  480  apt-get install -y gdisk
root  533  /usr/bin/dpkg --status-fd 29 --configure --pending
root  534  /usr/bin/perl ... /var/lib/dpkg/info/grub-pc.postinst configure
root  548  /bin/bash /var/lib/dpkg/info/grub-pc.postinst configure

grub-pc.postinst est bloqué. Pourquoi ? Il pose une question debconf : « sur quels disques installer GRUB ? ». En mode interactif, c’est un dialogue ncurses. Sans tty, debconf bascule en mode Readline puis échoue silencieusement et attend.

Le -y d’apt accepte les changements de package, mais n’affecte pas debconf.

Solution

Avant l’install

Pré-charger les réponses debconf :

echo 'grub-pc grub-pc/install_devices multiselect /dev/sda, /dev/sdb' \
  | debconf-set-selections

DEBIAN_FRONTEND=noninteractive apt-get install -y gdisk

Si déjà bloqué

Tuer les process bloqués et reprendre proprement :

pkill -9 -f 'grub-pc.postinst'
pkill -9 -f 'dpkg --status-fd'

# Réponse debconf préchargée
echo 'grub-pc grub-pc/install_devices multiselect /dev/sda, /dev/sdb' \
  | debconf-set-selections

# Reprendre la config dpkg en mode non-interactif
DEBIAN_FRONTEND=noninteractive dpkg --configure -a

Pour les futures installations en SSH non-interactif

Dans /etc/apt/apt.conf.d/00-noninteractive + export DEBIAN_FRONTEND=noninteractive dans .bashrc.

Pourquoi grub-pc et pas un autre

grub-pc.postinst veut savoir où installer GRUB BIOS legacy à chaque update. Sur un PC desktop, l’install initial répond et debconf garde. Mais sur un fresh debootstrap ou install sur nouveau système, debconf n’a pas de valeur stockée → demande interactive → blocage sans tty.

Autres pièges similaires : tzdata, keyboard-configuration, dictionaries-common, iptables-persistent.

Lessons learned

Questions fréquentes

Pourquoi mon apt-get install se fige indéfiniment en SSH non interactif sur Debian ?
Un script postinst (souvent grub-pc) pose une question debconf, par exemple « sur quels disques installer GRUB ? ». Sans tty, debconf bascule en mode Readline puis échoue silencieusement et attend pour toujours. Le processus dpkg reste bloqué tant que personne ne répond.
Est-ce que le flag -y de apt suffit à éviter les questions interactives ?
Non. Le -y accepte uniquement les changements de paquets mais n’affecte pas debconf. Il faut combiner avec DEBIAN_FRONTEND=noninteractive pour neutraliser les dialogues, et idéalement pré-charger les réponses avec debconf-set-selections.
Comment débloquer un dpkg figé sur grub-pc.postinst sans tout réinstaller ?
Tuez les process bloqués avec pkill -9 -f ’grub-pc.postinst’ et pkill -9 -f ’dpkg --status-fd’, préchargez la réponse via debconf-set-selections, puis relancez DEBIAN_FRONTEND=noninteractive dpkg --configure -a. Pas besoin de réinstaller le paquet.
Comment installer des paquets Debian en SSH non interactif sans aucun blocage ?
Exportez DEBIAN_FRONTEND=noninteractive (dans .bashrc ou via /etc/apt/apt.conf.d/00-noninteractive) et préchargez les réponses des paquets connus à risque comme grub-pc, tzdata, keyboard-configuration ou iptables-persistent. Si apt traîne plus de 60 secondes, vérifiez côté distant avec ps : c’est probablement un postinst en attente.

Partager cet article :

Article précédent
Reconstruire un RAID1 dégradé : cloner la GPT en 3 commandes
Article suivant
Booter un RAID1 dégradé : `rootdelay` + mdadm dans l’initrd