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/sda status=progress | gzip --fast - | \ ssh microlinux@nestor dd of=rocky-8.4-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.4-server-image.gz | \ gunzip --fast - | dd of=/dev/sda 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 CentOS 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=centos-7.9-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=centos-7.9-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 sont 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.
10 commentaires
charles · 24 décembre 2020 à 11 h 48 min
merci 🙂
Olivier · 24 décembre 2020 à 14 h 16 min
Bonjour,
Est-il possible de cloner/faire une image (depuis un ordi de mon réseau local) de la carte sd d’un raspberry pi qui est sur mon réseau local ? Je pense que non puisque le Pi est en marche ?
kikinovak · 24 décembre 2020 à 17 h 17 min
Je pense comme vous : non, ce n’est pas possible.
Olivier · 24 décembre 2020 à 18 h 31 min
Merci, c’est bien ce que je pensais 🙂
christophe · 25 décembre 2020 à 11 h 22 min
J’utilise ceci pour cloner la carte sd d’un raspberry distant vers un disque local :
ssh pi@192.168.1.20 « sudo dd if=/dev/mmcblk0 | gzip -c » | gzip -cd | sudo dd of=/dev/sdb status=progress
kikinovak · 25 décembre 2020 à 17 h 44 min
Du coup je suis content de m’être trompé.
p4pr8n · 29 décembre 2020 à 11 h 48 min
Hello,
Nous utilisons cette technique pour effectuer le backup de nos disques VM.
Si la machine source a de la ressource cpu, je conseille vivement l’usage de pigz (implémentation
parallèle de gzip) à la place de gzip. Le gain de temps est impressionnant.
kikinovak · 31 décembre 2020 à 15 h 51 min
Je vais tester ça. Merci pour le tuyau et bonnes fêtes !
Wouldsmina · 2 janvier 2021 à 15 h 23 min
Bonjour,
dd pour sauvegarder des vm, c’est un peu lourd, non ? J’utilise rsync en ayant préalablement monté en bind le disque (mount -o bind /dev/sda2 /mnt/).
Cela permet de copier que les fichiers modifiés, donc très rapidement. Pour l’historisation, j’ai opté pour zfs, qui permet de faire des snapshots et de naviguer facilement dans l’historique.
Enfin, pour la restauration il suffit de faire le rsync dans le sens inverse et si nécessaire faire une reinstall de grub.
kikinovak · 2 janvier 2021 à 16 h 39 min
Là il s’agit d’une opération de clonage. Pour la sauvegarde, j’utilise Rsnapshot qui est incrémental et très rapide, car basé sur rsync.