Raspberry Pi 4 : Régler le problème de boot sur USB 3 (I/O Error)
Table des matières
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.
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 :
ou ceci sur un autre système :
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.
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 :
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
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 :
Ce qui donne chez moi :
On repère son adaptateur :
On note :
ID_VENDOR : 152d
ID_PRODUCT : 0578
Avec ces éléments, on va donc ajouter le paramètre suivant au boot du noyau :
Certaines distributions pour Raspberry Pi lisent les options du noyau dans le fichier /boot/cmdline.txt
Vérifier si ce fichier existe :
S'il existe l'éditer :
Sur mon système Manjaro, il contient ceci :
On ajoute simplement le paramètre à la fin :
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 :
Une fois fait, on régénère la config du grub en root :
ou sans le "2" après grub sur certaines distributions :
Arrêter le système, brancher le disque USB sur le port USB3, et démarrer !
Pour information, voici les tests de démarrage avec :
- Manjaro Linux
- SSD PNY CS900 (120G)
- Adaptateur SATA / USB3 JMicron
- Carte microSD SanDisk Extreme Pro V30 (128Go)
En USB 3.0 :
Startup finished in 3.730s (kernel)
En USB 2.0 :
Startup finished in 5.021s (kernel)
Avec la carte SD :
Startup finished in 5.484s (kernel)
Cependant, à l'utilisation du système, on constate clairement que sur SSD, la réactivité est bien meilleure !
Introduction
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 :
ou ceci sur un autre système :
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
identifier l'adaptateur USB
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
Cas 1 : cmdline.txt
Certaines distributions pour Raspberry Pi lisent les options du noyau dans le fichier /boot/cmdline.txt
Vérifier si ce fichier existe :
Code BASH :
file /boot/cmdline.txt
S'il existe l'éditer :
Code BASH :
sudo nano /boot/cmdline.txt
Sur mon système Manjaro, il contient ceci :
Code :
root=PARTUUID=005ce91d-02 rw rootwait console=serial0,115200 console=tty3 selinux=0 quiet splash plymouth.ignore-serial-consoles smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 usbhid.mousepoll=8 audit=0
On ajoute simplement le paramètre à la fin :
Code :
root=PARTUUID=005ce91d-02 rw rootwait console=serial0,115200 console=tty3 selinux=0 quiet splash plymouth.ignore-serial-consoles smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 usbhid.mousepoll=8 audit=0 usb-storage.quirks=152d:0578:u
Cas 2 : GRUB
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
Arrêter le système, brancher le disque USB sur le port USB3, et démarrer !
Tests de performance
Pour information, voici les tests de démarrage avec :
- Manjaro Linux
- SSD PNY CS900 (120G)
- Adaptateur SATA / USB3 JMicron
- Carte microSD SanDisk Extreme Pro V30 (128Go)
En USB 3.0 :
Startup finished in 3.730s (kernel)
En USB 2.0 :
Startup finished in 5.021s (kernel)
Avec la carte SD :
Startup finished in 5.484s (kernel)
Cependant, à l'utilisation du système, on constate clairement que sur SSD, la réactivité est bien meilleure !