Un bug dans la mise à jour de dhcpcd sur Raspberry Pi Raspbian bullseye fait perdre la connexion réseau

Episode 1: La mise à jour mensuelle

Mon Raspberry Pi fonctionne sous Raspbian 11 (nom de code bullseye) depui la fin du mois d’Août.

Le 27 Septembre, je m’adonnais à ma mise à jour système régulière avec un simple

# apt update
# apt upgrade

L’historique de cette mise à jour obtenu via apt history ressemble à

Start-Date: 2021-09-27  18:15:04
Commandline: apt upgrade
Requested-By: username (42)
Install: [...]
Upgrade: [...], dhcpcd5:armhf (1:8.1.2-1+rpt1, 1:8.1.2-1+rpt2), [...], raspberrypi-kernel:armhf (...), [...]
End-Date: 2021-09-27  18:20:53

Le paquet dhcpcd5 (le paquet fournissant le client DHCP) allait être mis à jour.

Aucune crainte particulière à avoir ici, j’ai donc fait la mise à jour 🧘🏻.

Tout s’est bien déroulé et aucune erreur n’a été remontée 👍.

Le noyau de mon Raspberry Pi ayant été mis à jour, et aucune erreur n’ayant été reportée, je n’avais aucune raison de m’inquiéter. J’ai donc passé la commande reboot pour redémarrer mon Raspberry Pi et j’ai attendu qu’il revienne.

J’ai attendu… et attendu… et attendu encore… ⏳ … et il n’est jamais revenu.


L'instant où j'ai réalisé que mon Raspberry Pi était hébergé loin de chez moi et sans accès à distance L'instant où j'ai réalisé que mon Raspberry Pi était hébergé loin de chez moi et sans accès à distance

Episode 2: C’est moi où le réseau est down ?

Après plusieurs jours d'indisponibilité, j’ai finalement pu brancher un cable HDMI et un clavier à mon Raspberry Pi.

L’erreur était assez facile à identifier:

systemd[297]: dhcpcd.service: Failed to locate executable /usr/lib/dhcpcd5/dhcpcd: No such file or directory
systemd[297]: dhcpcd.service: Failed at step EXEC spawning /usr/lib/dhcpcd5/dhcpcd: No such file or directory
systemd[1]: dhcpcd.service: Control process exited, code=exited, status=203/EXEC
systemd[1]: dhcpcd.service: Failed with result 'exit-code'.
systemd[1]: Failed to start DHCP Client Daemon.
systemd[1]: dhcpcd.service: Scheduled restart job, restart counter is at 5.
systemd[1]: Stopped DHCP Client Daemon.
systemd[1]: dhcpcd.service: Start request repeated too quickly.
systemd[1]: dhcpcd.service: Failed with result 'exit-code'.
systemd[1]: Failed to start DHCP Client Daemon.

Ok, donc mon Raspberry Pi était incapable d’obtenir une adresse IP parce que son client DHCP n’arrivant pas à démarrer. C’est une erreur que je n’avais jamais vu.


Regardons de plus prêt le service dhcpcd:

root@raspberrypi:~# systemctl cat dhcpcd
# /lib/systemd/system/dhcpcd.service
[Unit]
Description=DHCP Client Daemon
Wants=network.target
Before=network-online.target
Documentation=man:dhcpcd(8)

[Service]
Type=forking
ExecStart=/usr/sbin/dhcpcd -b
Restart=always

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/dhcpcd.service.d/wait.conf
[Service]
ExecStart=
ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w

Ok, donc il semble que le fichier de surcharge systemd /etc/systemd/system/dhcpcd.service.d/wait.conf pointe vers l’exécutable /usr/lib/dhcpcd5/dhcpcd et que ce dernier n’existe pas. Le vrai exécutable étant:

root@raspberrypi:~# type dhcpcd
dhcpcd is /usr/sbin/dhcpcd

Episode 3: This Jane, is the Internet !

Voici le patch que j’ai appliqué au fichier /etc/systemd/system/dhcpcd.service.d/wait.conf pour spécifier le bon exécutable pour dhcpcd:

--- /etc/systemd/system/dhcpcd.service.d/wait.conf.orig 2021-10-03 18:43:27.958753332 +0100
+++ /etc/systemd/system/dhcpcd.service.d/wait.conf      2021-10-03 16:02:52.096425389 +0100
@@ -1,3 +1,3 @@
 [Service]
 ExecStart=
-ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w
+ExecStart=/usr/sbin/dhcpcd -q -w

J’ai ensuite pu redémarrer le service via:

# systemctl daemon-reload
# systemctl restart dhcpcd

et voila, mon Raspberry Pi a immédiatement obtenu son adresse IP et a pu discuter avec le monde entier. Problème résolu !

Ressources externes