20 avril 2024

Raspberry PI : Déplacement du FS sur clé USB

Le PI est un chouette jouet (Présentation du Raspberry et installation), mais il posséde quelques défauts :

  • La puissance, on est vite amené à trouver comment l’optimiser (ce sera pour le prochain article).
  • Le stockage sur carte SD : certainement son point noir !

En effet, ce genre de carte n’est pas optimum pour un OS et l’on a vite fait d’avoir des données corrompues et donc de vieux plantages bien moisis. Si en plus, comme beaucoup, vous overclockez votre Rasp cela étant facile et efficace, cela a également l’inconvénient d’accélérer ce processus à cause de la chauffe.

Bref, on en a vite marre de réécrire une image sur la SD tous les deux jours.

Plusieurs tests sur internet montrent que mettre le FS sur une clé USB ne ralentit pas le système et permet d’éviter à avoir à faire des backups réguliers de la carte SD pour les remettre tout aussi régulièrement.

 

I – Bench rapide sur SD

A titre d’exemple, sur un Rasp sur micro SD Kingston classe 10:

Test de lecture :

# hdparm -t -T /dev/mmcblk0
 Timing cached reads:   546 MB in  2.00 seconds = 272.32 MB/sec
 Timing buffered disk reads:  52 MB in  3.09 seconds =  16.85 MB/sec

Test d’écriture :

# dd if=/dev/zero of=/tmp/test.data bs=1M count=128 conv=fdatasync
 128+0 enregistrements lus
 128+0 enregistrements écrits
 134217728 octets (134 MB) copiés, 50,0217 s, 2,7 MB/s

L’option fdatasync pour forcer l’écriture direct. On constate que c’est assez faible …

 

II – Préparation de la clé USB

On branche la clé (clé dont on aura sauvegardé les données, je précise au cas ou…) dans un des ports du Rasp.

Après quelques secondes, pour voir si c’est ok :

# dmesg

On devrait la voir dans le log.

On va utiliser fdisk pour la partitionner :

# fdisk /dev/sda

la commande m vous donne l’aide, sinon à connaitre dans notre cas :

  • p : affiche les partitions présentes
  • d suivi d’un chiffre : efface la partition en question
  • n : pour en créer une nouvelle (primaire en choix et par défaut pour les tailles)
  • w : pour finalement écrire les modifications.

Il ne reste plus qu’a partitionner la clé en faisant :

# mkfs.ext4 /dev/sda1

 

II – Préparation des répertoires

L’idée de la manipulation est la suivante : on va copier le contenu de / sur la clé USB et dire au système de l’utiliser au lieu de la SD. Tout bête et tout simple à faire.

On va d’abord créer un répertoire dans /tmp/usbboot pour monter la clé.

# mkdir /tmp/usb
# mount /dev/sda1 /tmp/usb

Ensuite, création d’un répertoire particulier, /tmp/sd, qui va contenir le /. En effet, si on tente de copier / directement, cela va planter.

La, on effectue un montage particulier (bind) permettant d’accéder au répertoire / par /tmp/sd/

# mkdir /tmp/sd
# mount --bind / /tmp/sd

Et ensuite, on va à la racine, puis on lance la copie avec rsync en excluant /boot qui reste sur la SD et /tmp qui contient la destination de notre copie.

# cd /
# rsync -avh --exclude 'tmp/' --exclude 'boot/' /tmp/sd/ /tmp/usb/

L’opération prend quelques minutes.

Une fois terminée, on va recréer les répertoires manquants :

# mkdir /tmp/usb/tmp /tmp/usb/boot

III – Finalisation

On va éditer /etc/fstab pour indiquer que c’est l’usb qui stock /

# nano /tmp/usbboot/etc/fstab

C’est la ligne :

/dev/mmcblk0p2    /               ext4    defaults,noatime        0       1

Qu’on transforme en :

/dev/sda1         /               ext4    defaults,noatime        0       1

Puis pour terminer, on édite /boot/cmdline.txt :

#nano /boot/cmdline.txt

Et on remplace la partie root=/dev/mmcblk0p2 par root=/dev/sda1 :

dwc_otg.lpm_enable=0 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait

Il ne reste plus qu’a faire un :

# reboot

IV – Bench rapide sur USB

On va maintenant tester les débits sur la clé USB

# hdparm -t -T /dev/sda /dev/sda:
 Timing cached reads:   558 MB in  2.01 seconds = 278.27 MB/sec
 Timing buffered disk reads:  50 MB in  3.04 seconds =  16.45 MB/sec

Quasiment aucun changement. Ouf, on ne perd rien en lecture 😉

# dd if=/dev/zero of=/tmp/test.data bs=1M count=128 conv=fdatasync
 128+0 enregistrements lus
 128+0 enregistrements écrits
 134217728 octets (134 MB) copiés, 9,93769 s, 13,5 MB/s

La par contre, gros gain en écriture !

Bref, c’est tout bénéf pour le Pi et pour nous !

 

 

 

Laisser un commentaire

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