ddrescue + Raspberry Pi Imager - Le combo pour cloner vos cartes SD sans vous arracher les cheveux
Vous avez un parc de Raspberry Pi à déployer et vous en avez marre de refaire la config à chaque fois ? Ou pire, votre carte SD commence à faire des siennes et vous voulez la sauver avant qu'elle rende l'âme ? Hé bien j'ai le combo parfait pour vous les amis !
Je vais vous parler en réalité de deux outils complémentaires que vous connaissez déjà je pense : ddrescue pour le clonage/sauvetage de cartes SD, et Raspberry Pi Imager pour créer des images préconfigurées. Ensemble, ils forment une chaîne de production quasi "industrielle" pour vos projets Pi. Ça va vous faire gagner un temps précieux mais aussi vous sécuriser car on sait à quel point les cartes SD c'est capricieux parfois sur les Rpi (surtout quand y'a des coupures de jus ^^).
Commençons donc par ddrescue qui est l'outil libre parfait pour cloner des disques, mais avec un truc en plus que dd n'a pas : la gestion des erreurs et la reprise. Son secret, c'est le mapfile, un fichier journal qui garde trace de tout ce qui a été copié, du coup, si votre clone plante en plein milieu (câble qui se débranche, coupure de courant, carte SD qui fait la gueule), vous relancez la même commande et ça reprend exactement où ça s'était arrêté. Sans ce fichier, par contre, c'est retour à la case départ... snif.
⚠️ Attention : la destination va être écrasée. Donc vérifiez 3 fois vos /dev/... avant d'appuyer sur Entrée. Et oui, l'option --force porte bien son nom puisqu'elle autorise l'écriture sur un disque brut, donc si vous vous trompez de cible, c'est le drame.
La commande de base, c'est ça :
sudo ddrescue --force /dev/sdX /dev/sdY rescue.map
Vous remplacez /dev/sdX par votre carte source et /dev/sdY par la destination et le fichier rescue.map, c'est votre filet de sécurité, donc gardez-le précieusement à côté de vos images.
Après si vous préférez cloner vers un fichier image plutôt que directement vers une autre carte, c'est quasi pareil :
sudo ddrescue /dev/sdX raspios.img rescue.map
Et pour les cartes un peu fatiguées avec des secteurs défectueux, y'a une astuce en deux passes. D'abord une passe rapide qui saute les erreurs (le but c'est de récupérer le max sans s'acharner tout de suite) :
sudo ddrescue -n /dev/sdX raspios.img rescue.map
Puis une deuxième passe qui insiste sur les zones problématiques :
sudo ddrescue -r3 /dev/sdX raspios.img rescue.map
Le -r3 dit à ddrescue de réessayer 3 fois sur chaque secteur récalcitrant par contre, évitez de mettre --no-split par défaut. Ça peut sembler logique ("ne coupe pas"), mais sur un support vraiment abîmé, laisser ddrescue découper et isoler les zones foireuses est souvent plus efficace.
Maintenant faut vérifier que tout s'est bien passé… alors oui, on peut faire des contrôles, mais il faut être clair, si vous comparez juste un bout, vous validez juste un bout. Par exemple cette commande compare seulement 1 Go, et pas toute la carte :
sudo cmp -n 1G /dev/sdX /dev/sdY
Donc si vous voulez comparer TOUT (et que ça ne vous dérange pas d'attendre ^^), vous pouvez comparer l'image et la carte clonée en faisant un hash sur la totalité. Par exemple, pour vérifier que l'image écrite sur la carte correspond bien à l'image d'origine :
sha256sum raspios.img
sudo ddrescue /dev/sdY - | sha256sum
Si les deux hashes sont identiques, là, on parle (beaucoup plus) sérieusement. Et si vous ne voulez pas streamer le disque, vous pouvez aussi faire un hash du périphérique directement (mais ça lit tout le disque, donc c'est long).
Vous l'aurez compris, ddrescue nous sert à cloner ou à sauver une carte existante, mais pour déployer proprement une image, on va maintenant utiliser le fameux Raspberry Pi Imager. Car oui, l'outil officiel de la fondation a une fonction que beaucoup de gens ne connaissent pas qui est la personnalisation avancée. Comme ça, avant de flasher votre carte, vous pouvez préconfigurer plein de trucs.
Par exemple, le hostname du Pi, genre pi-cuisine ou pi-garage, l'utilisateur et son mot de passe, le Wi-Fi avec SSID et mot de passe, le SSH activé avec mot de passe ou clé publique, le fuseau horaire et la config clavier. Et précision importante, Imager prépare tout ça pour que ce soit appliqué au premier boot (c'est injecté pour l'initialisation), ce qui revient au même pour vous, mais ça explique pourquoi c'est si pratique en mode headless.
Du coup, vous flashez la carte, vous la mettez dans le Pi, vous branchez l'alimentation, et souvent c'est accessible en SSH très vite :
ssh [email protected]
C'est le mode headless parfait puisque ça vous évite d'avoir à brancher un écran + clavier + souris sur votre Rpi. Notez que l'extension en .local de mon exemple ci-dessus dépendra du mDNS (Bonjour / Avahi)... Sur certains réseaux (ou certains PC), ça pourra ne pas résoudre donc dans ce cas-là, vous passez par l'IP ou votre DNS/DHCP habituel.
Et maintenant, roulements de tambours, voici le workflow magique pour déployer un parc de Pi. Cela consiste tout simplement à configurer un Pi de référence avec tout ce qu'il vous faut dedans (paquets, services, configs...). Ensuite vous l'éteignez proprement, vous clonez sa carte avec ddrescue, et vous dupliquez cette image à volonté.
MAIS (et là c'est le point qui évite des sueurs froides), cloner une carte Linux telle quelle, ça clone aussi des identifiants qui devraient être uniques, typiquement :
- le machine-id
- les clés SSH hôte (host keys)
Donc si vous déployez 10 Pi clonés à l'identique, vous vous retrouvez avec 10 machines qui se présentent pareil, et côté SSH vous pouvez avoir des alertes cheloues (et côté admin, c'est pas propre).
La solution la plus simple c'est donc de préparer votre image "master" pour que chaque nouveau Pi régénère ça au premier démarrage. Sur votre Pi de référence (avant de cloner), vous pouvez faire :
sudo rm -f /etc/machine-id
sudo truncate -s 0 /etc/machine-id
sudo rm -f /etc/ssh/ssh_host_*
Comme ça, au prochain boot, le système régénère un machine-id propre, et OpenSSH régénère ses clés hôte. (Si jamais ça ne se régénère pas automatiquement sur votre variante d'OS, un redémarrage + réinstallation/relance SSH règle généralement le truc.)
Après ça, à chaque nouveau Pi, vous flashez l'image.
Maintenant si vous n'avez pas de parc à déployer, mais que vous voulez simplement personnaliser le hostname, le Wi-Fi, le user, etc., le plus simple ça reste donc de passer par Raspberry Pi Imager au moment du flash avec ses options avancées car si vous écrivez l'image avec dd/ddrescue directement sur la carte, Imager ne pourra évidemment pas appliquer ses paramètres.
Et SURTOUT, avant de lancer quoi que ce soit, pensez à identifier vos disques pour pas faire de bêtises (c'est une commande Linux, btw) :
lsblk -o NAME,SIZE,MODEL,MOUNTPOINT
Ah et désactivez aussi l'automontage sur votre machine, sinon vous allez avoir des soucis avec la destination qui se retrouvera occupée par l'OS.
Bref, avec ddrescue et Raspberry Pi Imager, vous avez maintenant de quoi cloner vos cartes SD beaucoup plus sereinement (et pas juste "les yeux fermés").
Enjoy !
