Matériel, Hardware

Raspberry Pi 4 : Régler le problème de boot sur USB 3 (I/O Error)

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

raspberry-logo



Introduction



J'ai bien galéré à trouver une solution à ce problème, alors je vous partage une solution (il y en a peut être d'autres).
J'ai passé énormément de temps à trouver un correctif fonctionnel. J'en profite aussi pour partager des éléments techniques sur le sujet.


Sur un Raspberry Pi, utiliser un système d'exploitation installé sur une carte microSD est peu performant.
Même avec une carte microSD performante (au moins une V30 qui est censée écrire au minimum à 30Mo/s) le système peut être lent. Aussi une carte microSD n'est pas faite pour encaisser des écritures intensives, et sera sujette aux pannes.

Malgré quelques optimisations côté système d'exploitation, le système de fichiers va recevoir beaucoup de lectures/écritures,

Il peut dont être judicieux d'installer le système sur un SSD connecté sur un des ports USB 3.0. Ce sera plus performant qu'une carte microSD.

Le démarrage sur USB est activé par défaut sur le Raspberry Pi 4 B. Il faut juste s'assurer de ne pas avoir de carte microSD branchée. L'ordre est paramétrable avec l'utilitaire raspi-config sur RaspberryPi OS.

Problématique



Bien que le Raspberry Pi ait un système d'exploitation dédié (Raspberry Pi OS), il est possible d'installer n'importe quelle distribution Linux dessus. Alma Linux, Fedora Linux, Ubuntu, Manjaro. Que ce soit pour un usage serveur ou bureautique.

Cependant, certaines distributions refuseront de démarrer correctement, provoquant ce genre de message :

raspberry-usb3-boot-erreur


ou ceci sur un autre système :

raspberry-usb3-boot-erreur2



Cela fait penser à un disque défectueux mais il est bel et bien fonctionnel

Notre adaptateur USB ne se comporte pas comme prévu ce qui empêche de démarrer sur le disque branché à celui-ci.

Heureusement, il existe une solution.

Le paramètre usb-storage.quirks : La solution



usb-storage.quirks est un paramètre utilisé dans le noyau Linux pour gérer des comportements spécifiques de certains périphériques de stockage USB qui ne se comportent pas comme prévu. Les "quirks" (ou "particularités" en français) sont des ajustements ou des exceptions qui permettent au noyau de traiter correctement ces périphériques.

On va devoir pour cela ajouter cette option pour démarrer notre noyau Linux.

La syntaxe pour définir des quirks est la suivante :
Code BASH :
usb-storage.quirks=ID_VENDOR:ID_PRODUCT:QUIRK


Avec les informations suivantes :
ID_VENDOR : L'identifiant du fournisseur du périphérique.
ID_PRODUCT : L'identifiant du produit.
QUIRK : Le type de spécificité à appliquer

Le quirk u est souvent utilisé pour forcer le noyau à traiter le périphérique comme un périphérique de stockage USB qui peut avoir des comportements erratiques*.

* un ami aime bien ce mot, j'en profite pour le caser ici

Configurer le système



Pour bénéficier pleinement de la vitesse de notre disque externe sur Raspberry Pi, il est nécessaire de le connecter sur le port USB3. Heureusement, seul le port USB3 est concerné par ce souci de détection, tout fonctionne correctement sur le port USB2 !

On pourra donc reconfigurer notre système en le démarrant sur le port USB2.

On va devoir repérer les valeurs ID_VENDOR et ID_PRODUCT de notre adaptateur USB.
On utilisera la commande :
Code BASH :
lsusb


Ce qui donne chez moi :
Code TEXT :
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 003: ID 046d:c077 Logitech, Inc. Mouse
Bus 001 Device 004: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS578 SATA 6Gb/s
Bus 001 Device 005: ID 413c:2105 Dell Computer Corp. Model L100 Keyboard
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


On repère son adaptateur :
Code TEXT :
ID 152d:0578 JMicron Technology Corp.


On note :
ID_VENDOR : 152d
ID_PRODUCT : 0578

Avec ces éléments, on va donc ajouter le paramètre suivant au boot du noyau :
Code TEXT :
usb-storage.quirks=152d:0578:u


On pourra le faire en modifiant le fichier /etc/default/grub et en ajoutant ce paramètre à la ligne GRUB_CMDLINE_LINUX comme dans cet exemple sur mon système Fedora :
Code BASH :
GRUB_CMDLINE_LINUX="rhgb quiet console=tty0 usb-storage.quirks=152d:0578:u"


Une fois fait, on régénère la config du grub en root :
Code BASH :
grub2-mkconfig -o /boot/grub2/grub.cfg


ou sans le "2" après grub sur certaines distributions :
Code BASH :
grub-mkconfig -o /boot/grub/grub.cfg



Sous Fedora Linux, ou Alma Linux, on pourra utiliser directement grubby qui modifiera le fichier /etc/default/grub et regénèrera le grub.cfg :
Code BASH :
grubby --update-kernel ALL --args usb-storage.quirks=152d:0578:u



Arrêter le système, brancher le disque USB sur le port USB3, et démarrer !