Booter sur un disque USB

 

L'idée est de protéger votre carte SD de l'usure. Or, ce qui use le plus une carte SD, c'est l'écriture de données.

Celle-ci n'est en effet pas prévue pour supporter de nombreuses écritures. Quelques photos de temps en temps depuis votre smartphone, ca va ! Mais sur un système Unix sollicite énormément un disque en écriture, bien trop pour une petite carte SD...

Alors comment faire ? Le principe est de brancher un disque sur un des ports USB et d'y installer votre système dessus. Mieux, dupliquer celui qui est déjà installé et paramétré sur la carte SD !

Il est préférable d'utiliser un disque SSD plutôt qu'un mécanique, plus gourmand électriquement, ce qui vous obligerez certainement à utiliser une alimentation externe pour le disque.

Avec la solution que je présente ici, la carte SD ne sera plus utilisée que lors du boot du système. Rien n'empêchant ensuite d'utiliser l'espace de la carte SD devenu disponible ensuite, en montant la seconde partition dans un répertoire bien sûr pas trop sollicité, pour par exemple archiver des fichiers.

NoteIl est possible de préparer le disque depuis Windows via des outils comme Partition Magic.

NoteOn pourrait penser au clonage de la carte SD vers le disque SSD via des outils comme Win32 disk imager, cependant, ce n'est pas la meilleure idée, car le disque SSD aurait dans ce cas le même PARTUUID (identifiant GPT) que celui de la carte SD, le système risque de ne plus s'y retrouver.

NoteIl faut connaître un peu le monde Unix pour se lancer dans les manipulations qui vont suivre...

NotePour les commandes qui vont suivre, il faut être administrateur, donc connectez vous en root, ou utilisez su, ou précédez les commandes qui vont suivre par sudo.

Après avoir booté,

  • Branchez votre disque dur sur un port USB.
  • Depuis un shell sous Raspberry, tapez fdisk -l (root nécessaire - sudo, su)

sudo fdisk -l

Tous les disques disponibles s'afficheront. Retrouvez le votre (via la taille par exemple. Suivant votre installation, vous le retrouverez sous sda ou sdb).

AttentionLes opérations qui vont suivre vont vous faire perdre toutes vos données sur le disque que vous indiquerez, alors vérifiez bien ce que vous indiquez comme disque !

 

Partitionner un disque

Pour faire simple, partitionner un disque permet de découper un disque physique en plusieurs disques virtuelles. Ainsi, chacun de ses nouveaux disques seront indépendant des autres. Le type de partition va permettre de spécialiser un disque pour tel ou tel système d'exploitation. Vous pouvez avoir des disques de type Linux (préférer ext4), d'autres lisibles sous Windows, ou encore des disques de swapping (permet d'étendre la mémoire vive sur le disque lorsqu'il n'y a plus de place en mémoire sous Unix).

Tout d'abord, il faut préparer (partitionner) le disque. Utilisez cfdisk qui en mode texte reste plus simple à utiliser que fdisk.

Ex.: sudo cfdisk /dev/sda

Vous pourrez créer, supprimer des partitions, mais n'oubliez pas de sauver (write) avant de quitter le programme, sinon, rien ne sera fait sur le disque !

NoteLes partitions seront automatiquement nommées sous Linux sous la forme /dev/sda (si vous aviez un disque sous /dev/sda, sdb pour /dev/sdb, ...) suivi d'un nombre, exemple sda1, sda2, ...

 

Formater un disque

Une fois les partitions créées, il faut les formater. Le formatage consiste simplement à créer le système de fichiers correspondant au type de partition choisi.

  • Pour un disque Linux, il faut utiliser mkfs -t type /dev/nom_partition

Ex.: mkfs -t ext4 /dev/sda1

  • Pour un disque de swap, il faut utiliser mkswap /dev/nom_partition, mais faut-il vraiement avoir cela sur Raspberry. A noter que le swap par défaut est un fichier sous /var, et non un disque (cf. dphys-swapfile setup pour connaître sa localisation et sa taille)

Ex. : mkswap /dev/sda2

  • Pour un disque Windows (FAT32), il faut utiliser mkfs.vfat -F 32 /dev/nom_partition et éventuellement -n nom_du_disque_que_vous_voulez_donner

(Si la commande n'est pas trouvée, il faudra l'installer: apt-get install dosfstools)

Ex.: mkfs.vfat -F 32 /dev/sda3 -n mondisque

Dans votre cas, utilisez un disque Linux ext4 !

Vous taperez donc la ligne suivante:

sudo mke2fs -t ext4 -L rootfs /dev/sda1

Note: -L permettant de donner un nom au volume (Label)

Recopier votre système sur le disque USB

Votre système est déjà installé sur carte SD, voire, des applications tournent déjà dessus, le paramétrage est terminé, vous y avez aussi tous vos fichiers. Bref, vous ne voulez certainement pas tout refaire !

Il y a deux solutions pour dupliquer le contenu de la carte SD sur le disque USB.

  • Synchronisation de disque
  • Copie binaire (ne pas privilégier, peut ne pas fonctionner)

 

Synchronisation de disque

Cette solution est habituellement fortement intéressante lorsque vous migrez un serveur unix vers un autre, mais en prenant votre temps...Or dans le temps, des fichiers peuvent avoir évolué.

La commande permet de synchroniser des fichiers entre deux serveurs (ici, ce sera deux disques sur un même serveur, votre Pi). Les fichiers n'ayant pas changé ne seront pas maj, les nouveaux ou modifiés seront copiés sur le disque.

la commande se nomme rsync. Mais avant, il faut monter votre disque SSD pour pouvoir l'utiliser:

Les montages sont généralement fait sous /mnt. Si vous n'avez encore rien monté sur ce répertoire, vous pouvez monter le disque sur directement dessus en tapant mount -t type /dev/mapartition /mnt.

Si vous avez déjà fait des montages sous /mnt dans des sous répertoires, créer un nouveau sous répertoire dans /mnt ... mais à priori, vous connaissez !

Vous utiliserez la commande mount pour monter votre partition sur un répertoire.

sudo mount /dev/sda1 /mnt

Le disque ssd est maintenant accessible depuis le répertoire /mnt

tapez

sudo rsync -avx / /mnt

 

Copie binaire

Cette solution peut ne pas fonctionner...même après réparation.

Normalement, votre système Linux est installé sur la seconde partition de votre carte SD sous /dev/mmcblk0p2. il suffit d'utiliser la commande dd pour recopier le contenu de cette partition vers votre disque.

dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=512

NoteLa copie est "silencieuse", entendez que rien ne s'affichera durant l'opération. Attendez sagement que la commande se termine sans vous poser de questions...(ce sera long ...)

Après avoir recopié votre carte SD sur le disque, il faut redimensionner la partition (Et oui, il y a de forte chance pour que la partition sur carte SD soit d'une taille inférieure à la capacité de votre partition sur le disque USB):

Mais avant cela, une réparation est nécessaire:

e2fsck -f /dev/sda1

Puis on retaille ...

resize2fs /dev/partition

Ex.: resize2fs /dev/sda1

 

 

La copie est maintenant terminée ...

Vous pouvez ensuite utiliser la commande df pour vérifier que vous avez récupéré votre espace disque.

 

Reparamétrer le système

Il reste à indiquer au système que le disque à utiliser se trouve sur usb...

Dans notre cas, le boot se faisant toujours sur la carte SD, il faudra indiqué sur la carte SD où trouver le système...

Le boot se fait sur la première partition de la carte SD. Cette partition est montée sous /boot lorsque le système est démarré. il faut donc se positionner sur /boot:

cd /boot

Le fichier qui indique où trouver le système se nomme cmdline.txt. Donc il faudra modifier le contenu de ce fichier !

(faîtes un double de ce fichier avant... cp cmdline.txt cmdline.txt.bak)

Information PI4

NoteA partir du Pi4, une étape supplémentaire est à faire. Il faut retrouver votre disque dur sur le port usb...

La commande permettant de retrouver l'id est lsusb. Recuperez l’ID product par exemple 152d:0562...

Votre disque étant déjà monté, tapez

lsusb

Vous voilà avec une liste impressionnante d'id. Impossible de retrouver votre disque dedans...

Tapez ensuite umount /dev/sda1, et débranchez votre disque.

Retapez lsusb. Un id a disparu, c'est celui de votre disque !

Rebranchez votre dique et tapez de nouveau sudo mount /dev/sda1 /mnt s'il ne se monte pas automatiquement

 

nano /boot/cmdline.txt

Information PI4

NoteA partir du Pi4, il faut ajouter au début de la ligne:

usb-storage.quirks=152d:0562:u (suivi d'un espace !)

Dois-je dire que vous remplacerez 152d:0562 par le votre ?

Ce qui va nous intéresser dans ce fichier qui ne contient qu'une ligne, c'est la partie où est indiqué root=PARTUUID=

Et remplacer le n° qui suit (qui doit correspondre au PARTUUID de la carte SD) par celui de affecté à votre disque dur. Pour connaitre la valeur PARTUUID de votre nouvelle partition système, utilisez la commande blkid et recopiez la valeur indiquée entre les guillemets (sans prendre ces guillemets) pour votre partition (ex sous /dev/sda1).

Exemple bidon:

root=PARTUUID=3b6fc-4fe7-2cb-a4568

Ne modifiez rien d'autre sur cette ligne et sauvez le fichier.

NoteSur certains systèmes, vous pouvez trouver root=/dev/mmcblk0p2. Remplacez dans ce cas par root=/dev/sda1 (si sda1 est votre nouvelle parrtition système, sinon adaptez...).

Cependant, un système Unix (linux ici, et plus exactement Raspberry Pi OS anciennement Raspbian) utilise un autre fichier pour définir pour chaque partition un montage sur un répertoire. Ce fichier se nomme /etc/fstab.

AttentionLe fichier à modifier sera sous /etc/fstab de votre disque USB (il est en effet inutile sur la carte SD, car ne sera en principe plus utilisé suite à la modification du fichier cmdline.txt précédemment).

Il faudra donc si ce n'est pas encore fait, monter votre disque pour pouvoir y accéder:

Ex. mount -t ext4 /dev/sda1 /mnt

Maintenant, le contenu du disque doit être accessible...

Ici, un ls -la /mnt devrait afficher le contenu du disque, à l'identique de ce que vous avez sur votre carte SD.

Il est donc maintenant possible de modifier le contenu du fichier fstab en utilisant nano par exemple.

sudo nano /mnt/etc/fstab

Enfin modifiez la référence PARTUUID de /dev/mmcblk0p2 par celle de votre nouvelle partition et éventuellement des autres partitions présentes dans ce fichier si nécessaire.

Il ne reste plus qu'à rebooter votre machine...

Lorsque votre pi est redémarré, vous pouvez vérifier que tout est ok en utilisant simplement la commande mount sans paramètre.

Il liste l'ensemble des disques montés. Vous devriez trouver une ligne avec:

/dev/sda1 on / [...]

Ce qui indique que votre disque est bien monté à la racine (/) et est donc maintenant utilisé !

Note: Il est même possible de trouver votre partition 2 de la carte SD monté automatiquement sous /media/pi/rootfs. Mais seul l'utilisateur root pourra y accéder.

 

Remarque

Il existe une autre solution qui consiste à ne plus booter sur la carte SD mais sur le disque USB, voire via le réseau. Cela implique de flasher le raspberry. Sauf que l'opération ne peut se faire qu'une seule fois. Risqué et n'en voyant pas trop l'utilité, je ne l'expliquerai pas.