Raspberry Pi 2B v1.2, 3A+, 3B, 3B+ et 4 : Tout migrer sur un SSD (plus de carte SD!)

Jusqu’à peu, tout mon Yunohost et ses données (qui tourne sur Raspberry 3) était installé sur une carte SD.

J’y voyais plusieurs inconvénients angoissants :

  • Pas très fiable : Avec une partition swap et un Nextcloud qui tourne bien, la carte SD allait inexorablement vers une mort en burn-out quasi certaine à moyen terme.
    Pas cool.

  • Vitesse de lecture / écriture assez faible.

  • C’est cher et donc vite limitant si on a besoin de place.

Mais ça c’était avant que je découvre qu’il était possible de configurer les Raspberry pi **Pi 2B v1.2, 3A+, 3B, 3B+ et 4 pour qu’ils boot directement sur un disque SSD branché en USB.

Il y a plein d’infos et de tuto disponibles à propos du USB boot sur le Raspberry pi 4, mais beaucoup moins à propos des autres modèles.

Donc j’y vais de mon petit tuto parce que j’ai trouvé que ce n’était vraiment pas compliqué. Si ça peut être utile à quelqu’un alors tant mieux.

ATTENTION :

  • L’opération est irréversible
  • Sur le Raspberry Pi 3A+, elle empêche le Pi d’être en mode USB device (mode dans lequel le raspberry se comporte comme un clé USB lorsqu’on le branche à un autre ordinateur).

1 - Le matos
Un adaptateur USB 3.0 ↔ Sata (j’en ai trouvé un à 7.99€ qui marche nickel)
Un SSD (j’en ai pris un de 480 Go pour environ 65€)

2 - Avant tout, on sauvegarde
On va tout d’abord faire une image de notre carte SD.
On éteint le Raspberry pi proprement, on enlève la carte SD et sur une autre machine Linux on en fait l’image à l’aide de la commande suivante :

dd if=/dev/mmcblk0 of=/repertoire/du/backup/backup-YNH-date-du-jour.img status=progress

Quand c’est terminé, on garde précieusement l’image backup-YNH-date-du-jour.img de côté parce qu’on va l’utiliser plus tard.

3 - On configure le USB mass storage boot
On va remettre la carte SD dans la raspberry et le mettre sous tension.

Ensuite, je me suis tout simplement basé sur la doc officielle de la fondation Raspberry)

Rajouter la ligne program_usb_boot_mode=1 à la fin du fichier /boot/config.txt avec la commande.

echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt

Puis redémarrer proprement le raspberry avec un

sudo reboot

Après le reboot, lancer cette commande :

$ vcgencmd otp_dump | grep 17:

La commande doit renvoyer exactement 17:0x3020000a
Si ce n’est pas le cas, c’est que ça n’a pas marché et qu’il faut recommencer.

La doc précise que l’on peut supprimer la ligne program_usb_boot_mode du fichier config.txt, pour éviter que la carte SD ne configure un autre raspberry en USB mass storage boot (si on la met dans un autre Pi). Ils précisent qu’il ne faut pas laisser de ligne vide à la fin du fichier config.txt.

Voilà, votre Raspberry devrait maintenant pouvoir booter sur un périphérique USB.

4 - On flash l’image sur le SSD
brancher le SSD à l’aide de l’adaptateur sur l’ordinateur sur lequel se trouve l’image de notre Yunohost réalisée au début du tuto.

Là, il faut tout simplement flasher l’image sur le SSD. Chacun à sa méthode, moi j’utilise Etcher.

  • 1-On sélectionne l’image. Ici, backup-YNH-date-du-jour.img
  • 2-On sélectionne le disque SSD sur lequel on va flasher l’image
  • 3-On valide

Si besoin, se baser sur cette page.

Une fois que l’image est flashée, on peut démonter les partitions du SSD.

Certains constateront que la partition root crée est uidentique à l’ancienne et que l’espace disque du SSD n’est pas complètement utilisé. C’est normal, nous allons régler ça juste après.

5 - Le test
On retire la carte SD du raspberry et on y branche le SSD.
On met sous tension.
Votre Pi devrait démarrer en prenant un peu plus de temps (5 à 10 secondes de plus) parce qu’il cherche dans un premier temps s’il n’y a pas une carte SD.

Ne pas hésiter à brancher un écran pour l’occasion, histoire de voir ou de comprendre ce qu’il se passe en cas de problème.
Pour ma part la premier boot n’avait pas fonctionné, je ne sais pas trop pourquoi. J’ai enlevé l’alim, l’ai remise et PAF, ça a fonctionné parfaitement. Et pas de soucis depuis.

6 - Repartitionner la partition root
Une fois que votre machine est démarrée et que vous avez constaté que tout fonctionne, nous pouvons redimentionner la partition root pour qu’elle occupe tout l’espace non partitionné sur le SSD

  1. Faire un fdisk -l et repérer la partition root.
    Dans mon cas, il s’agissait de /dev/sda2 (si vous n’êtes pas sûr, il y a la commande findmnt qui peut vous aider)

  2. Ensuite, lancer la commande fdisk suivie de l’emplacement de votre SSD.
    Pour moi cela donne :
    fdisk /dev/sda

Vous êtes maintenant dans le programme fdisk.

  1. Saisir la commande p pour afficher la table de partitions

Cela devrait ressembler à quelque chose comme ça :

Command (m for help): p
Disk /dev/sda: 7.5 GiB, 8027897856 bytes, 15679488 sectors
Disk model: DataTraveler 410
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd02483c7
Device     Boot  Start     End Sectors  Size Id Type
/dev/sda1         8192  532480  524289  256M  c W95 FAT32 (LBA)
/dev/sda2       540672 6365183 5824512  2.8G 83 Linux

Noter la valeur start de la partition concernée (ici, cela correspond à 540672, mais chez vous cela sera sûrement autre chose. Notez le, c’est important.)

  1. Saisir d (pour delete) et taper sur entrée, puis saisir 2 pour supprimer /dev/sda2 (la deuxième partition).
Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.
  1. Saisir n (pour new), touche entrée, puis p (pour primary), touche entrée, et enfin 2 puis touche entrée (pour partition numéro 2).
Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
  1. Là, le programme vous demande le premier secteur. Il vous faut saisir le numéro que vous avez noté plus haut (dans mon cas c’est 540672) et valider avec entrée.

First sector (2048-15679487, default 2048): 540672

  1. Ensuite, on vous demande le numéro du dernier secteur.
    Saisir le numéro par défaut (dans mon cas c’est 15679487)

Last sector, +/-sectors or +/-size{K,M,G,T,P} (540672-15679487, default 15679487 ):

La partition est ensuite crée.

Created a new partition 2 of type ‘Linux’ and of size 7.2 GiB.

  1. Il est possible que le programme vous affiche le message suivant :
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o:

Si c’est le cas, saisir N (pour Non / No), puis entrée.

  1. Saisir w puis entrée pour sauvegarder et quitter le programme.
Command (m for help): w
The partition table has been altered.
Syncing disks.
  1. Rebooter la machine.
    (ce n’est pas encore terminé)

  2. Après le reboot, lancer la commande

sudo resize2fs /dev/sda2

  1. Vérifier que votre partition est correctement dimentionnée avec la commande
    df -h

C’est terminé.
Vous pouvez vérifier encore une fois que tout fonctionne et faire une sauvegarde (vous pouvez même éteindre la machine, débrancher le SSD pour en faire une image, on ne sait jamais…)

-En espérant que cela vous soit utile-

9 Likes

Top ce tuto !! Merci beaucoup @charly !!

Je vais moi même pas tarder à le faire en suivant cette petite explication ! (sur un 3B+ et un 4)
Actuellement mon 3B+ tourne avec DD à plateau (qui stock nextcloud et les datas), donc à voir si c’est pas plus lent. Pense tu que on peut booter sur un SSD et utiliser le HDD en stockage. Je vois pas pourquoi ça poserai un problème, mais on ne sait jamais.

Sinon tu devrais peut-être envisager de mettre ce tuto dans la doc d’installation de Yuno, ça serait plus facile à retrouver pour les nouveaux :wink:

@LaBaude Sur le 3B+ il n’y a rien à faire, le boot sur usb est géré nativement.

Do you mean that on a Rpi 3B+ and 4 you can’t do this, or that it’s easier do to it?

Wow, this is awesome! A cheap and small powerful home server right there! Thanks for sharing :partying_face: I hope that a setup like this becomes easy one day through a one button setup in the Yunohost GUI or an entry in the installation documentation or something… :smiley:

On a Rpi 3B+, it’s more easier, you have nothing to do. You install Yunohost on the SSD or HDD, you plug it on the usb port and the RPI boot on it when you turn it on.
It’s also coming soon on rpi4, it’s currently in beta.

1 Like

Salut,
Désolé de ne te répondre qu’aussi tard : Il pourrait y avoir un problème d’alimentation électrique si ton HHD plateau n’a pas sa propre alim (c’est même certain en fait, si le HDD n’a pas sa propre alim électrique, ça ne fonctionnera pas.)
A +

Bonjour

Pour celles et ceux qui ont déporté leur serveur, n’oubliez pas d’insérer un fichier texte vide nommé ssh dans la partition boot

Ainsi vous pourrez vous logger à distance via ssh

Hello @charly,

Est-on réellement obligé de faire l’étape 3 (configuration du USB mass storage boot) sur un RPI 4 ?
Parce que si on utilise la dernière version du firmware et qu’on configure le boot sur USB à priori on peut boot sur le SSD directement sans faire cette étape (comme expliqué ici : https://www.domo-blog.fr/comment-configurer-boot-usb-raspberry-pi-4-officiel/ )

Cependant, je suis actuellement en train de faire la manip et cela ne fonctionne qu’a moitié. Je boot bien sur le SSD mais j’ai des problèmes au démarrage :

Et j’arrive pas trop à comprendre d’où ça vient. Est ce que c’est justement parce que j’ai sauté l’étape 3 ?

Merci !

Salut,
As tu jeté un oeil à la documentation officielle ?

Tiens nous au jus

Voilà ce que dit la doc :

The bootloader in Raspberry Pi Pi 400 and newer Raspberry Pi 4B boards support USB boot by default, although the BOOT_ORDER bootloader configuration may need to be modified. On earlier Raspberry Pi 4B boards, or to select alternate boot modes, the bootloader must be updated.

Donc j’en conclu que en dehors de changer le boot order y’a rien à faire. Et effectivement ça boot correctement, c’est le processus de démarrage de yuno qui plante.

Du coup je suis pas plus avancé que ça

Bonjour,

As tu essayé de démarrer avec un autre OS que Debian ?
Ou Debian sans Yunohost ?

Nope, c’est vrai que ce serait une bonne idée. Mais je trouve ça étonnant que ça ne fonctionne pas.

Bon je n’ai toujours pas eu le temps de tenter Debian sans Yunohost par contre j’ai tenté d’installer Yuno directement depuis le SSD et ça fonctionne pas non plus. Enfin yuno s’installe mais y’a plein d’erreurs. Et quand on arrive à la post install elle ne fonctionne pas. (Et on est pas connecter à au réseau donc il faut être en direct dessus).
Je tenterai Debian et je vous dis !

Sympa l’idée … quelqu’un a déjà testé sur Rpi 2 ?? ça marche ?
Sur les Rpi 1 si je me souvient bien, il y avait un souci de lenteur je crois si on voulait utiliser les ports USB et le port ethernet en même temps … ce n’est plus le cas sur Rpi 2?