Cloner toute la partition ou le disque dur dans un fichier fragmenté


35

J'aime cloner une partition entière ou un disque dur entier sur un disque externe plus grand, mais créer un fichier fragmenté. J'utilise souvent ddpour le clonage, mais cela ne prend pas en charge les fichiers fragmentés. Pour contourner le problème, j'ai utilisé quelque chose comme:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Cependant, ceci est un peu trop délicat à mon goût et ne me permet pas de reprendre le processus si avorté. Il est amusant qu’il existe un outil NTFS pour this ( ntfsclone), mais il n’existe aucun outil de ce type pour les systèmes de fichiers natifs de Linux (EXT2-4).

Existe-t-il un meilleur outil pour cela, par exemple une ddvariante avec un support fragmenté? Je ne recherche pas de logiciel propriétaire pour les sauvegardes sur disque, mais souhaite simplement créer une copie clonée clairsemée que je peux monter en tant que périphérique de boucle si nécessaire.


7
+1 pour une utilisation créative de cp, il ne m'est jamais venu à l'esprit que vous pouviez copier une image disque de manière éparse. Je les ai toujours juste compressées si j'avais besoin de gagner de la place. Maintenant, pourquoi est-ce dans une question pas une réponse?
Caleb

Réponses:


21

Vous voulez dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
Génial! Le manuel dit "Si le processus de copie est interrompu par l'utilisateur, il est possible de continuer à n'importe quelle position plus tard." et "une écriture de fichier spArse (défaut = non)". Exactement ce que je veux! Merci!
Martin Scharrer

3
En recherchant en dd_rescueligne, j'ai découvert qu'il existe également un outil différent appelé ddrescue(sans le trait de soulignement) qui a été développé indépendamment de, dd_rescuemais semble en principe faire la même chose. Je viens de mentionner cela ici en tant que général FYI.
Martin Scharrer

Oui, dd_rescueet ddrescuene sont pas la même chose. Théoriquement, ils font le même travail, mais en général, j'ai eu plus de chance avec les plus vieux / originaux dd_rescue.
Steven Pritchard

1
Au cas où quelqu'un se le demanderait, vous pouvez arrêter la copie à tout moment avec Ctrl-C. Il vous montrera votre position actuelle et vous pouvez utiliser cette valeur pour redémarrer en ajoutant -sla position à la commande d'origine. (Cela ressemblerait à cela dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard

1
@Steven Pritchard: Pas besoin de se rappeler la position. Spécifiez un troisième nom de fichier, qui sera le fichier journal, et au redémarrage, il le lira et reprendra là où il s'est arrêté.
Tanith Rosenbaum

20

Juste pour être complet, l’appel à ddrescue . Le drapeau --sparseou -Spermet à la destination d'être écrite de manière peu précise:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Ou avec option longue:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Ou si vous préférez les MiB :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Pour que le sauvetage puisse être interrompu et repris, vous pouvez également utiliser un fichier journal:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Notez que GNU ddrescueet dd_rescuesont des programmes différents. Mais GNU ddrescuesemble être plus répandu. Par exemple, il est déjà fourni avec GRML .


Avez-vous besoin d'un traitement spécial de l'image lors de la restauration, pouvez-vous fournir la commande utilisée pour restaurer un ddrescue?
user12439

En théorie , le support de stockage que vous utilisez pour le sauvetage est censé être plus fiable, de sorte que vous pouvez généralement il suffit d' utiliser dd pour écrire sur le disque de remplacement: dd if=sda1.raw of=/dev/sdb1. Toutefois, pour utiliser ddrescue lors de la restauration, il vous suffit de remplacer la source / destination utilisée pour la récupération par la nouvelle source / destination, de préférence avec un nouveau fichier journal. Si possible (et souvent pas), vous pouvez bien sûr utiliser ddrescue pour copier des données directement du disque source incorrect vers un disque de remplacement.
ZaTricky

3

Un correctif a été proposé en 2007 pour fournir une prise en charge des fichiers fragmentés dans GNU dd, mais il semble ne pas l'avoir fait dans coreutils (du moins pas à partir de la 8.4). Je doute que dd ait trop changé depuis, le correctif pourrait s’appliquer à la version actuelle sans trop de travail.

Je suis également très impressionné par l’utilisation créative de cpvotre question, et cela m’a amené à l’utiliser pour réaliser la reprise (reprise ici de ~ 80M dans la source):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Edit: grattez ça. Le second ddserait bien sûr de chercher la mauvaise position dans le fichier de sortie, car sa longueur n'est pas la même que celle de l'entrée.


1
Comme dans le cas de la réponse de bhinesley, il serait préférable de consigner les progrès de dd pour une reprise précise. Si vous utilisiez cette approche à la fois pour la première exécution et pour la reprise, et que vous journalisiez les deux dd parallèles indépendamment, vous pourriez savoir à quelle distance chercher dans la sortie. Si j'ai le temps, je vais essayer de régler ça.
Eli Heady

2
Merci pour le lien vers le correctif. Je commençais à penser à programmer quelque chose de ce genre par moi-même :-) Les fichiers clairsemés ne peuvent pas être extraits afin que votre code ne fonctionne pas.
Martin Scharrer

Oui, je viens de découvrir cela moi-même. Oh bien, c’était amusant de trouver de nouvelles utilisations folles cp- merci!
Eli Heady

1
dd commit at 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: ajout du support pour l'option conv = sparse" ("(iwrite): conversion de l'écriture d'un bloc NUL en recherche si demandé. ")
osgx

1

Il suffit d'ajouter mes 2 centimes. Une autre façon de créer un fichier fragmenté à partir d'un disque brut est d' utiliser qemu-img en utilisant quelque chose comme:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Vous pouvez également l'utiliser sur une seule partition. En outre, vous avez la possibilité de convertir le disque / la partition brute vers tout autre format pris en charge par qemu-img (QCOW2, VHD [x], vmdk, etc.).


1

Une autre option est rsync . Par exemple:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Explication:

  • -S/ --sparsepour sauter des blocs épars en écriture
  • -P/ --partial --progresspour afficher les progrès et conserver les fichiers partiellement transférés
  • --copy-devices copier le contenu de l'appareil

Vous pouvez effectuer un ajout --appendpour reprendre une copie interrompue (ou --append-verifypour confirmer la somme de contrôle sur les correspondances de données nouvelles et anciennes).

Edit : Je viens de me rendre compte que copy-devices.diff est à l’étude et peut ne pas être présent sur de nombreux systèmes (bien qu’il soit inclus dans Fedora , Ubuntu , Debian et autres)


0

Remarque: cela ne fonctionne pas pour les raisons décrites dans les commentaires, je le laisse ici pour référence.

Surveillez les statistiques de dd en utilisant kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Reprendre en utilisant sauter / chercher:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Sans $ i_bytes, il serait plus difficile de reprendre. Il est probablement plus facile de consigner les statistiques dd dans un fichier en cas de panne de la machine.


Le second cpécrasera simplement le fichier existant, n'est-ce pas? Je connais le skipet d'autres options de dd. La question est la cppartie.
Martin Scharrer

Hm, oui, vous avez raison.
Bhinesley


0

Pourquoi pas simplement:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.