Compresser une image de disque

Introduction

Je veux changer l’OS sur ma machine au travail mais par bonne habitude je vais commencer par copier l’image du disque avant d’écraser les données. Par contre je trouve que 120 Go c’est lourd et je vais voir si je peux compresser ça au maximum, tout en gardant la copie au niveau du block device. C’est sûr qu’une sauvegarde du système de fichiers prendrait moins d’espace mais il y aurait une perte d’information en passant de HFS+ à ext2/3/4.

Voici mon plan :

  1. Libérer de l’espace. Supprimer les téléchargements, les fichiers temporaires, les caches, les logiciels que je n’ai pas besoin et vider la corbeille.
  2. Prendre la mesure de l’espace disque utilisé
  3. Démarrer sur une clé USB avec Ubuntu
  4. Copier l’image du disque sur un autre système
  5. Redémarrer OS X
  6. Écrire un fichier avec dd if=/dev/zero of=/zero jusqu’à ce que le disque soit plein.
  7. Supprimer /zero
  8. Démarrer encore sur une clé USB avec Ubuntu
  9. Copier les quelques documents que je veux conserver (la majorité est synchronisé en ligne).
  10. Transférer la deuxième image du disque sur un autre système
  11. Compresser le disque, en espérant que tous les octets zérotés “disparaissent”, laissant une image qui ne prend pas plus d’espace que la taille du système de fichiers qu’il contient

Afin de mesurer le gain scientifiquement, je vais faire deux copies de l'image du disque. Une fois avant d'écrire /zero et une fois après. Je vais ensuite compresser les deux images et comparer leur tailles.

Données de départ

Taille du disque : 120 034 123 264 octets (120 Go).
Espace utilisé : 45 042 335 744 octets (45 Go).
Espace utilisé après le ménage : 23 937 101 824 octets (23,9 Go).

Les deux machines sont sur un LAN 100 Mbps et ont une puissance de traitement similaire — quatre cœurs, 3,1 GHz vs 3,2 GHz.

Commandes utilisées pour le transfert

Image contrôle

Sur la machine source :
sudo dd if=/dev/sda | nc 192.168.13.20 8080

Sur la machine de destination :
nc -l -p 8080 | pv | gzip > MacMini.raw.gz

Ça a pris 2 h 50 m à 11.2 Mio/s

Zérotage des blocs inutilisés

$ sudo dd if=/dev/zero of=/zero
Password:
dd: /zero: No space left on device
186046745+0 records in
186046744+0 records out
95255932928 bytes transferred in 574.286639 secs (165868273 bytes/sec)

92 Go ont été écrits en moins de 10 minutes (c'est un SSD).

Image expérimentale, compression sur la machine destination

Sur la machine source :
sudo dd if=/dev/sda | nc 192.168.13.20 8080

Sur la machine de destination :
nc -l -p 8080 | pv | gzip > MacMiniZeroed.raw.gz

Ça a pris 2 h 50 m à 11.2 Mio/s comme le précédent

Image expérimentale, compression sur la machine source

Sur la machine source :
sudo dd if=/dev/sda | gzip | nc 192.168.13.20 8080

Sur la machine de destination :
nc -l -p 8080 | pv > MacMiniZeroed.raw.gz

Ça a pris 32 minutes à 6,25 Mio/s pour transférer 11,9 Gio.

Résultat

Voici la comparaison de la taille des images. L'image contrôle est compressée avec gzip. L'image expérimentale est du même disque de stockage compressé avec gzip contenant le même système de fichier mais les blocs inutilisés ont été écrits avec des zéros pour une compressibilité maximale.

Contrôle : 80 872 770 328 octets (80,9 Go)
Expérience : 12 764 953 094 octets (12,8 Go)

Conclusion

Vitesse de transfert

Sur un réseau 100 Mbps, lorsque la compression se fait sur la machine de destination, la vitesse de transfert était le goulot d'étranglement.

Lorsque la compression se fait sur la machine source, la vitesse de transfert n'est pas maximale mais la quantité de données à transférer est diminuée et le processus est beaucoup plus efficace.

Taille de l'image

L'image du disque de 120 Go se compresse en 80,9 Go, un ratio de 67 % par rapport au disque, mais 338 % par rapport au système de fichiers.

Après avoir écrit des zéros sur l'espace inutilisé du disque, l'image prend 12,8 Go, un ratio de 10,6 % par rapport au disque, 53,5 % par rapport au système de fichier, et 15,8 % par rapport au contrôle.

Temps d'écriture des zéros

Le disque source étant un SSD, le temps requis pour écrire des zéros sur l'espace inutilisé est petit. Pour comparer avec un disque tournant, j'ai écris un fichier de 92 Go de zéros sur le disque de la machine destination. Le temps requis a été de 26 minutes versus moins de 10 minutes sur un SSD.

Nouvelles connaissances

À l'avenir lorsque j'aurai une image ou un clone de disque à faire et à transférer par réseau, je n'hésiterai pas à écrire un fichier avec des zéros (si possible) et à compresser le flux sur la machine source.

Commentaires, questions

N'hésitez pas à m'envoyer un courriel ou à me tweeter : @SystemPk.

Alexandre de Verteuil
Alexandre de Verteuil
Senior Solutions Architect

I teach people how to see the matrix metrics.
Monkeys and sunsets make me happy.

Related