Aller au contenu
5 minutes

Debian en emergency mode avec root verrouillé, s’en sortir par init=/bin/bash

Un fsck échoue sur /var, la VM Debian part en emergency mode, et le compte root verrouillé bloque le shell de secours. Passage par init=/bin/bash, fsck, puis reboot forcé.

Debian en emergency mode avec root verrouillé, s'en sortir par init=/bin/bash

Une VM Debian refuse de démarrer, part en emergency mode, et le shell de secours vous claque la porte au nez parce que root est verrouillé. Le passage par init=/bin/bash dans GRUB contourne le blocage et permet de réparer le système de fichiers proprement.

Le symptôme

Observé sur une VM Debian 12 sous AHV, LVM, avec /var sur un LV séparé. À la console :

root00: clean
usr00: clean
[FAILED] systemd-fsck@dev-mapper-...lv_var00

Le fsck de /var échoue, puis une cascade de [DEPEND] emporte var.mount, local-fs.target et les services, et la VM finit en emergency mode. C’est le comportement documenté : d’après systemd.special(7), emergency.target est utilisé quand la vérification d’un système de fichiers requis échoue et que le démarrage ne peut pas continuer.

Puis vient le message qui bloque :

Cannot open access to console, the root account is locked.

Root est verrouillé : aucun mot de passe défini (! ou * dans /etc/shadow, ce que sulogin(8) appelle un compte verrouillé), choix courant sur un parc administré par clés SSH. Le shell d’urgence exige le mot de passe root : il est inaccessible. Ce message est celui cité dans l’issue systemd #11596, toujours ouverte, qui discute justement du cas d’un root verrouillé en rescue et emergency.

La réparation

Redémarrer la VM, appuyer sur e dans le menu GRUB, puis sur la ligne qui commence par linux : retirer quiet et ajouter init=/bin/bash en fin de ligne. Démarrer avec Ctrl+X.

La doc du noyau définit init= simplement : lancer le binaire indiqué à la place de /sbin/init. Pas de systemd, donc pas de sulogin : on obtient un shell root sans mot de passe, / en lecture seule, /var non monté. C’est exactement l’état qu’il faut pour un fsck.

fsck -fy /dev/mapper/<vg>-<lv_var>

Une rafale de messages « orphaned inodes » est normale. Relancer la commande jusqu’à obtenir « clean ». Si le superbloc principal est hors d’usage, passer par un superbloc de secours (32768 est le premier pour un ext4 en blocs de 4 Kio, cas de cette VM) :

fsck -b 32768 -y /dev/mapper/<vg>-<lv_var>

Pour sortir, pas de reboot classique : il n’y a pas d’init pour orchestrer l’arrêt.

/usr/sbin/reboot -f

Après le boot

Chercher la cause, sinon la panne reviendra. Deux pistes à vérifier : un LV saturé, ou un arrêt brutal (redémarrage HA par exemple).

df -h /var /var/log

Le préventif, et la fausse bonne idée

Le vrai correctif est de définir un mot de passe root utilisable à la console, pour que le mode emergency serve à quelque chose.

La tentation inverse existe : forcer l’ouverture du shell sans mot de passe. La variable SYSTEMD_SULOGIN_FORCE évoquée dans l’issue #11596 fait cela. La page sulogin(8) est claire sur l’option équivalente --force : avec un root verrouillé, plus aucun mot de passe n’est demandé, et l’option ne doit être utilisée que si la console est physiquement protégée. Appliqué à une VM, cela revient à donner un shell root sans mot de passe à quiconque accède à sa console : à éviter.

Ce qu’il faut retenir

  • Un fsck requis en échec mène à emergency.target ; avec root verrouillé, le shell d’urgence est inaccessible.
  • init=/bin/bash dans GRUB donne un shell root, / en lecture seule, /var démonté : l’état idéal pour fsck -fy.
  • Superbloc HS : fsck -b 32768 -y. Sortie : /usr/sbin/reboot -f.
  • Snapshot AHV avant, recherche de cause après (df -h /var /var/log, arrêt brutal).
  • Préventif : un mot de passe root console, pas SYSTEMD_SULOGIN_FORCE.

In English

A fsck fails on /var, the Debian VM drops into emergency mode, and the locked root account blocks the rescue shell. Booting with init=/bin/bash gives a root shell without a password, with / read-only and /var unmounted, so fsck can run. With no init available, the way out is a forced /usr/sbin/reboot -f.

Sources & vérification

Testé sur : Debian 12 sur AHV (LVM, /var sur un LV séparé)

Comment les billets sont vérifiés et corrigés