Dans certaines situations, il peut être utile de cloner tout le contenu d’un disque dur « à la louche » dans le but de constituer un instantané d’un système vers lequel on pourra revenir le cas échéant. Il existe une série d’outils tout faits pour cette tâche comme Ghost For Linux, Ghost For Unix ou Clonezilla. Or, on peut se retrouver confronté à des situations où ces outils ne sont pas disponibles. Dans ce cas, on peut très bien s’en sortir manuellement en combinant les bons vieux outils Unix dd
, gzip
et ssh
.
Puisque nous faisons abstraction des systèmes de fichiers utilisés sous le capot, cette méthode est complètement agnostique en termes d’OS. Vous pouvez l’utiliser pour cloner n’importe quel Linux, BSD ou Windows.
Réduire la taille de l’image
Étant donné que nous comptons transférer le contenu d’un disque dur bloc par bloc, on imagine bien que les images résultantes sont assez volumineuses. L’astuce pour réduire la taille des images consiste à écrire des zéros sur la partie non utilisée du système.
Sur un système Linux installé, on pourra utiliser la commande suivante :
# dd status=progress if=/dev/zero of=/0bits bs=20M ; rm -f /0bits
- L’option
bs
signfie blocksize et désigne la taille des blocs écrits sur le disque.
Sur un système Windows, c’est l’utilitaire nullfile.exe
qui permet de réduire l’image du disque.
nullfile-1.02.exe
(32-bits)nullfile-1.01_64bit.exe
(64-bits)
Cloner une machine locale
Notez que par « machine locale », j’entends une machine à laquelle j’ai accès physiquement et sur laquelle je peux booter un système Linux live comme Slax ou la console de secours Rocky Linux.
Dans l’exemple ci-dessous, je lance un système Linux live sur mon serveur, et j’envoie le tout vers le compte microlinux
de mon serveur de sauvegardes local nestor.microlinux.lan
:
# dd if=/dev/sdb status=progress | gzip --fast - | \ ssh microlinux@nestor dd of=rocky-8-server-image.gz
Quelques remarques sur les options utilisées :
status=progress
affiche la progression pourdd
--fast
spécifie un algorithme de compression moins compact et plus rapide pourgzip
Restaurer un système local
Pour restaurer cette machine depuis le serveur de sauvegardes, il me suffit de faire l’opération en sens inverse. Concrètement, voici la commande utilisée :
# ssh microlinux@nestor dd if=rocky-8-server-image.gz | \ gunzip --fast - | dd of=/dev/sdb status=progress
Cloner une machine publique
J’administre une série de serveurs dédiés chez Scaleway. Ce fournisseur offre l’accès à une console de secours sous forme d’une session Linux live que l’on peut démarrer par le biais de l’interface de gestion des serveurs.
Dans l’exemple, j’ai démarré une session de secours et je l’utilise pour sauvegarder une installation de Rocky Linux que j’envoie vers mon serveur de sauvegardes public :
$ sudo -s # dd if=/dev/sda status=progress | gzip --fast - | \ ssh microlinux@backup.microlinux.fr dd of=rocky-8-server-image.gz
Restaurer une machine publique
Pour restaurer cette machine publique, je procéderai de manière similaire. Une fois que j’ai chargé la console de secours, je récupère l’image compressée depuis mon serveur de sauvegardes public :
$ sudo -s # ssh microlinux@backup.microlinux.fr dd if=rocky-8-server-image.gz | \ gunzip --fast - | dd of=/dev/sda status=progress
Les opérations de réduction de la taille de l’image, de clonage et de restauration peuvent être assez chronophages. Comptez une bonne demi-journée pour compacter un disque SATA de 1 To et une journée entière pour le cloner.
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.
2 commentaires
LupusMichaelis · 8 janvier 2023 à 0 h 54 min
Tiens c’est pratique ça !
Un petit détail : en shell, il est inutile d’ajouter un backslash pour échapper la fin de ligne si le dernier caractère de la ligne est un opérateur (pipe, or, and, etc)
kikinovak · 8 janvier 2023 à 7 h 42 min
Merci pour le tuyau, je ne savais pas !