Comment copier la structure de partition d'un disque entier à l'aide d'outils standard

82

Je souhaite effectuer une sauvegarde de l'ensemble de la structure de partition d'un disque dur, y compris les lecteurs logiques, afin de pouvoir restaurer cette structure sur un autre disque. Je ne pas veux copier le contenu des partitions, seule la mise en page. Pour les partitions principales et étendues, c'est simple:

dd if=/dev/sda of=partitiontable.bin bs=1 skip=446 count=64 # backup
dd if=partitiontable.bin of=/dev/sda bs=1 seek=446 count=64 # restore

Mais s’agissant de la disposition des partitions logiques, je me demande s’il existe une méthode similaire de sauvegarde de la disposition parmi les outils standard. Je suppose que le principal problème est de trouver les décalages par rapport aux emplacements des EBR, car cela ddfera le reste. Gardez à l'esprit que je dois pouvoir tout remettre sur un disque (éventuellement) vierge et ainsi restaurer la même présentation. Utiliser des outils de partitionnement comme fdiskou partedc'est bien, mais je dois être capable d'automatiser leur utilisation (script) et ils ne devraient pas dépendre de packages liés à X - en ligne de commande uniquement.

Mon plan de sauvegarde le fait manuellement dans un petit script python en utilisant le module struct, mais j'espérais plutôt qu'il y aurait un moyen plus facile.

Lauritz V. Thaulow
la source

Réponses:

90

Vous pouvez utiliser sfdisk pour cette tâche.

Sauver:

sfdisk -d /dev/sda > part_table

Restaurer:

sfdisk /dev/sda < part_table

Pour les tables de partition GPT, cela nécessite à sfdiskpartir de util-linux 2.26 ou version ultérieure. Il a été ré-écrit à partir de zéro sur libfdisk .

Cela copie les UUID inchangés, plutôt que d'en générer de nouveaux. Ainsi, le nouveau disque est un clone de l'original, pas simplement un autre disque avec la même disposition. Notez que Linux /dev/disk/by-uuid/examine les UUID du système de fichiers, mais pas les UUID de la table des partitions. sfdiskgénèrera de nouveaux UUID si vous supprimez les UUID du dump (par partition et l'UUID de la table de partition elle-même au début du fichier).

Petr Uzel
la source
1
Je n'en suis pas certain, mais la seule limite qui me vienne à l'esprit est la limite de taille de 2 To pour la partition imposée par le schéma de table de partition msdos. Pour dépasser cette limite, on peut utiliser GPT à la place, mais AFAIK sfdisk ne peut pas fonctionner avec GPT. Je ne sais pas s'il existe une autre limite ni si sfdisk signalera s'il ne peut pas s'en sortir.
Petr Uzel
2
sfdiskne fonctionne pas avec de gros volumes ou supporte GPT.
dhchdhd
1
@Barry et quand vous dites «gros», vous parlez de la limite de 2 To dont parle @Petr?
Lauritz V. Thaulow
5
La bonne façon est la suivante: sudo parted / dev / sda -lm> sda.parted
dhchdhd
1
Parfois, il est utile, pour ignorer les problèmes DOS uniquement, d’ajouter l’ option -L ou --linux :sfdisk -L /dev/sda < part_table
Diego
51

Cela dépend si votre disque source utilise un MBR (aka "dos" ou "msdos") ou une table de partition GPT (aka "GUID").

Les disques de plus de 2 To ne peuvent pas utiliser MBR, ils sont donc GPT.

Les disques de moins de 2 To peuvent utiliser les deux, vous devez donc d'abord savoir qui c'est.

En supposant que vous soyez sur Linux, utilisez l'une de ces commandes pour déterminer la table de partition utilisée par votre disque source:

disk=/dev/sda

# Always available, but old versions may not recognize gpt
fdisk -l $disk | grep type

# `apt-get install gdisk` or equivalent on non-Debian systems
gdisk -l $disk | grep -A4 'scan'

# `apt-get install parted`
parted $disk print | grep Table

Donné

source=/dev/sda
dest=/dev/sdb

Pour les disques MBR

utiliser sfdiskcomme suggéré par la réponse de Petr Uzel, ou cette variante:

# Save MBR disks
sfdisk -d $source > /partitions-backup-$(basename $source).sfdisk
sfdisk -d $dest   > /partitions-backup-$(basename $dest).sfdisk

# Copy $source layout to $dest
sfdisk -d $source | sfdisk $dest

Pour les disques GPT

La bonne réponse a été donnée ici et ici par Kris Harper .

Vous avez besoin de fdisk GPT . Regardez la page de téléchargement ou exécutez sudo apt-get install gdisk.

Ensuite, utilisez la commande sgdisk :

# Save GPT disks
sgdisk --backup=/partitions-backup-$(basename $source).sgdisk $source
sgdisk --backup=/partitions-backup-$(basename $dest).sgdisk $dest

# Copy $source layout to $dest and regenerate GUIDs
sgdisk --replicate=$dest $source
sgdisk -G $dest

La dernière commande randomise le GUID sur le disque et toutes les partitions. Cela n'est nécessaire que si les disques doivent être utilisés sur le même ordinateur, sinon c'est inutile.

mivk
la source
10
J'ai toujours peur de mélanger les deux paramètres. Un bon truc est donc --backup=Filed'exporter une table de partition à partir du disque source et --load-backup=Filede le restaurer sur le disque de destination.
zidarsk8
Existe-t-il un risque pour les données existantes sur les disques et les partitions suivantes lorsque vous déplacez la table de partition, puis randomisez le GUID des disques et des partitions comme décrit ci-dessus? Merci!
EngBIRD
@EngBIRD: Tant que vous ne mélangez pas $ source et $ dest, il ne peut y avoir de risque pour les données, car il n'y a pas de données sur la destination. Vous ne faites que copier la structure de la partition et vous devez toujours formater et copier les données ultérieurement.
mardi
La raison pour laquelle j'ai posé cette question est en fait que je ne pars pas d'un disque vierge,
j'échange
5

Liaisons pyparted et python-lvm plus anciennes mais toujours intéressantes .

Mise à jour:

La précédente a été publiée parce que ce qui précède ne fonctionne pas dans de nombreuses situations modernes, selon la page de manuel sfdisk.

sfdisk ne comprend pas la table GPT (GUID Partition Table) et n'est pas conçu pour les partitions volumineuses. Dans des cas particuliers, utilisez une version plus avancée de GNU parted (8).

Cette commande prend toutefois en charge> 2 To de partitions et LVM.

# parted -ms /dev/sda print > sda.parted

Exemple de sortie:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;
dhchdhd
la source
14
Comment restaurer du sda.partedfichier enregistré sur un nouveau disque?
Avery Chan
4
Cette réponse est inutile car la question portait sur la copie de la structure de partition sur un nouveau lecteur. La réponse concerne simplement le dumping. Comment importer? S'il vous plaît améliorer.
Itsafire
Apparemment, pour le moment, il n’ya pas de bonne réponse: serverfault.com/questions/709582/…
Otheus