Démarrer la carte Raspberry Pi sous Arch Linux ARM sur une clé USB

Pour préserver la carte SD insérée dans une carte Raspberry Pi de la corruption, pour améliorer les performances ou parce que l’on manque de place sur la carte SD, il est possible de déplacer le système de fichiers vers une clé USB ou toute autre unité de stockage (disque dur, SSD, etc.). Il faut cependant qu’une carte SD soit insérée dans le Raspberry Pi pour que ce dernier démarre.

Main tournant une clef dans la serrure d'une porte de cellule de prison.

Méthode rustique pour libérer le Raspberry Pi. Source : gallica.bnf.fr.

Voici une des façons de procéder pour démarrer le Raspberry Pi sur une clé USB sous Arch Linux ARM.

Pré-requis

Les étapes décrites ici ont été testées dans la configuration suivante :

  • Raspberry Pi modèle B
  • Arch Linux ARM installé sur une carte SD de 8 Go, correctement configuré et fonctionnel
  • Clé USB de 16 Go (les données qui se trouvaient éventuellement sur la clé USB vont être irrémédiablement perdues)
  • Machine-relais autre que la carte Raspberry Pi sur laquelle s’effectue l’opération, tournant sous Linux (dans mon cas, PC de bureau sous Xubuntu, mais j’aurais tout aussi bien pu choisir ma seconde carte Raspberry Pi, en y accrochant un lecteur de carte SD)

« Copier » l’image de la carte SD sur la clé USB

Créer une image de la carte SD sur la machine-relais avec dd

On connecte la clé USB à la carte Raspberry Pi que l’on démarre.
Depuis la machine-relais, on se connecte en tant qu’utilisateur root à la carte Raspberry Pi en SSH
$ ssh root@X.X.X.X
On repère le nom des périphériques que l’on va modifier et on le note :
# lsblk -f
Pour la suite :

  • /dev/sdA fait référence au nom de la carte SD sur le Raspberry Pi
  • /dev/sdB fait référence au nom de la clé USB sur le Raspberry Pi

On arrête le système sur la carte Raspberry Pi :
# shutdown -h now
On retire la carte SD et la clé USB de la carte Raspberry Pi et on les connecte à la machine-relais, sur laquelle on ouvre un terminal.
On repère le nom des périphériques correspondant à la carte SD et à la clé USB sur la machine-relais.
$ lsblk -f
Pour la suite :

  • /dev/sdC fait référence au nom de la carte SD sur la machine-relais
  • /dev/sdD fait référence au nom de la clé USB sur la machine-relais

Depuis la machine-relais avec les droits d’administrateur (en tant que root ou via sudo), on crée une image de la carte SD que l’on place transitoirement sur la machine-relais :
# dd if=/dev/sdC of=image-carte-sd.img bs=1M

Écrire l’image de la carte SD sur la clé USB

On retire la carte SD de la machine-relais.

Depuis la machine-relais, on écrit l’image de la carte SD sur la clé USB.
# dd if=image-carte-sd.img of=/dev/sdD bs=1M

Modification de cmdline.txt dans /boot/ pour faire démarrer la carte Raspberry Pi sur la clé USB plutôt que sur la carte SD

On déconnecte la clé USB de la machine-relais.
On insère à nouveau la carte SD dans la carte Raspberry Pi et on y connecte la clé USB.
On alimente la carte Raspberry Pi pour la redémarrer.
On se connecte à la carte Raspberry Pi en SSH depuis la machine-relais.
$ ssh root@X.X.X.X
On édite le fichier cmdline.txt :
# nano /boot/cmdline.txt
Remplacer root=/dev/sdA5 par root=/dev/sdB5
On redémarre le système :
# shutdown -r now

Normalement, le système de fichiers est désormais celui de la clé USB.

Utiliser toute la capacité de stockage de la clé USB

Ma clé USB a une capacité de 16 Go, ma carte SD a une capacité de 8 Go. L’écriture de l’image n’a placé sur la clé USB que ce qui se trouvait à l’origine sur la carte SD. En redimensionnant les partitions de la clé USB, je peux profiter de toute la capacité de stockage disponible pour le système de fichiers. Pour profiter de l’intégralité de l’espace de stockage disponible sur la clé USB, il faut redimensionner les partitions de la clé USB.

On se connecte via SSH à la carte Raspberry Pi et on ouvre un terminal :
$ ssh root@X.X.X.X
On lance fdisk :
# fdisk /dev/sdB

Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

On liste les partitions :
Command (m for help): p

Disk /dev/sdB: 15.5 GB, 15504900096 bytes, 30283008 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0×00057540

Device Boot Start End Blocks Id System
/dev/sdB1 2048 186367 92160 c W95 FAT32 (LBA)
/dev/sdB2 186368 15499263 7656448 5 Extended
/dev/sdB5 188416 15499263 7655424 83 Linux

On efface les partitions 5 puis 2 :
Command (m for help): d
Partition number (1,2,5, default 5): 5
Partition 5 is deleted

Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 is deleted

Puis on recrée la partition 2 (étendue) :
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e
Partition number (2-4, default 2): 2

Elle démarre au même secteur que l’ancienne :
First sector (186368-30283007, default 186368): 186368
Et se termine au dernier secteur disponible (valeur par défaut proposée par fdisk) :
Last sector, +sectors or +size{K,M,G} (186368-30283007, default 30283007):
Using default value 30283007
Partition 2 of type Extended and of size 14.4 GiB is set

On recrée la partition 5 (logique) :
Command (m for help): n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l
Adding logical partition 5

Qui démarre au même secteur que la précédente :
First sector (188416-30283007, default 188416): 188416
Et se termine, comme la partition 2, au dernier secteur disponible :
Last sector, +sectors or +size{K,M,G} (188416-30283007, default 30283007): 30283007
Partition 5 of type Linux and of size 14.4 GiB is set

On écrit la table de partition :
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Et on redémarre :
# shutdown -r now

C’est presque terminé. Il reste à faire coïncider la taille du système de fichier avec la taille des partitions.

Après avoir ouvert un terminal sur la carte Raspberry Pi via SSH, on exécute la commande resize2fs sur la partition logique :
# resize2fs /dev/sdB5

Et voilà !

Parmi les ressources qui m’ont été utiles ;

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.