Bien qu'au début, le «défi» proposé puisse sembler difficile, non réalisable ou naïf comme certains l'ont commenté, ce n'est pas le cas. L'idée principale derrière l'utilisation de dd pour migrer d'un disque plus gros vers un disque plus petit est parfaitement correcte et présente des avantages pour la migration des données. Bien sûr, avoir suffisamment d'espace libre pour que les données occupées tiennent dans le disque de destination est une condition nécessaire.
L'idée est de penser à définir chaque partition individuellement et non le disque entier à la fois comme initialement proposé. Encore plus peut être accompli: la ou les partitions qui seraient tronquées peuvent également être migrées en toute sécurité avec un peu d'aide des outils de redimensionnement du système de fichiers. En effet, ce type de migration est intéressant afin de préserver les matadonnées du système de fichiers et les attributs de fichier étendus qui ne peuvent pas être facilement copiés avec des outils comme cp, rsync, pax, ... qui opèrent dans la couche système de fichiers et non bloquent la couche périphérique. L'utilisation de dd élimine le besoin de réinstaller le système d'exploitation ou d'avoir à renommer le FS afin d'éviter les problèmes avec SELinux.
Voici ce que je fais habituellement pour accomplir des tâches similaires:
1) Vous devez d'abord réduire le ou les systèmes de fichiers dans les partitions affectées qui seraient tronqués. Pour cela, utilisez l'outil resize2fs (en supposant que nous parlons d'un fs ext2 / ext3 / ext4 - d'autres FS modernes ont également des outils de redimensionnement dans le même but). Notez que bien que - pour des raisons évidentes - un système de fichiers ne puisse pas être plus grand que la partition dans laquelle il réside, il peut en toute sécurité être plus petit. L'astuce de sécurité consiste à réduire "plus que nécessaire". Par exemple: imaginez que vous avez un système de fichiers de 1 To que vous souhaitez migrer vers un lecteur de 500 Go. Dans ce cas, je suggère de réduire le fs à, disons, 450 Gig (vous devez avoir suffisamment d'espace libre pour cela, bien sûr, c'est-à-dire que l'espace actuellement occupé dans ce système de fichiers ne peut pas dépasser 450 Gig). Le gaspillage apparent de 50 Go d'espace sera corrigé après la migration des données.
2) partitionner le disque de destination avec la géométrie appropriée compte tenu de ses contraintes d'espace;
3) dd les données en utilisant le ou les périphériques de partition et non le périphérique de disque (c'est-à-dire, utiliser dd if=/dev/sda# of=/dev/sdb#
pour chaque partition au lieu d'utiliser if=/dev/sda of=/dev/sdb
). REMARQUE: sda et sdb ne sont que des exemples; REMARQUE IMPORTANTE: lorsque vous passez d'un périphérique de partition plus grand à un périphérique de partition plus petit, dd se plaindra de la tentative d'écriture de la publication à la fin du périphérique de bloc, ce n'est pas grave car les données du système de fichiers auraient été entièrement copiées avant d'atteindre ce point. Pour éviter un tel message d'erreur, vous pouvez spécifier la taille de la copie à l'aide de bs=
et les count=
paramètres pour correspondre à la taille du système de fichiers réduite, mais cela nécessitera un calcul (simple), mais s'il est mal fait, vous risquez vos données.
4) Après avoir défini les données, redimensionnez à nouveau le ou les systèmes de fichiers respectifs dans la ou les partitions de destination à l'aide de resize2fs. Cette fois, ne spécifiez pas la nouvelle taille du système de fichiers. Lorsqu'il est exécuté sans spécification de taille, resize2fs agrandit le système de fichiers afin qu'il occupe la taille maximale autorisée.Par conséquent, dans ce cas, le système de fichiers de 450 Gig se développera à nouveau pour occuper la partition entière de 500 Gig et aucun octet ne sera gaspillé. (L'approche «réduire plus que nécessaire» vous évite de spécifier accidentellement des tailles incorrectes et de risquer vos données. Notez que les unités GB vs GiB peuvent être délicates).
Remarque pour les opérations plus complexes: si vous avez un gestionnaire de démarrage que vous avez l'intention de copier, ce qui est très probablement le cas, vous pouvez dd les premiers Ko du disque en utilisant le périphérique de disque au lieu des périphériques de partition (comme dd if=/dev/sda of=/dev/sdb bs=4096 count=5
), puis reconfigurez la géométrie dans / dev / sdb (qui contiendra temporairement une géométrie non valide pour le nouveau lecteur mais un gestionnaire de démarrage intact et valide). Enfin, utilisez les périphériques de partition comme décrit ci-dessus pour effectuer une partition à la fois. J'ai fait des opérations comme celle-ci plusieurs fois. Tout récemment, j'ai réussi une migration complexe lors de la mise à niveau d'un disque dur contenant un mélange d'installations MacOSX et Linux vers un SDD plus petit dans mon MacMini6,2. Dans ce cas, j'ai dû démarrer Linux à partir d'un disque externe, défini le gestionnaire de démarrage, exécuté gdisk pour corriger le GPT dans le nouveau disque et finalement défini chaque partition contenant les systèmes de fichiers juste rétrécis. (Notez que le schéma de partition GPT conserve deux copies de la table de partition, une au début et une à la fin du disque. gdisk se plaint beaucoup car il ne peut pas trouver la deuxième copie du PT et parce que les partitions dépassent la taille du disque, mais il corrige correctement le problème de copie du PT après avoir redéfini la géométrie du disque). C'était un cas beaucoup plus complexe, mais qui mérite d'être mentionné car il illustre que ce type d'opération est également parfaitement réalisable.
Bonne chance! ... et surtout n'oubliez pas de sauvegarder toutes les données importantes avant ce type d'opération. Une erreur et vous pouvez sûrement endommager irrémédiablement vos données.
Et juste au cas où je ne soulignerais pas assez: sauvegardez vos données avant la migration! :)
dd
calcul de la taille de bloc optimale est utile