ClonageDans 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.

InfoPuisque 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.

Cloner une machine locale

InfoNotez 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 pour dd
  • --fast spécifie un algorithme de compression moins compact et plus rapide pour gzip

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

Clonage réseau

ImportantLes 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.

 

Catégories : Serveur

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.

Laisser un commentaire

Avatar placeholder

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