Comment copyr la disposition de la partition d'un disque entier à l'aide d'outils standard

Je veux faire une sauvegarde de la disposition de la partition entière d'un disque dur, y compris les lecteurs logiques, de sorte que je puisse restaurer cette disposition sur un autre disque. Je ne veux pas copyr le contenu des partitions, seulement la layout. Pour les partitions primaires et étendues, c'est facile:

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 en ce qui concerne la layout des partitions logiques, je me request s'il existe parmi les outils standards une façon similaire d'save la layout? Je suppose que le principal problème est de find les compensations pour les locations des EBR, car avec cela, dd fera le rest. Gardez à l'esprit que je dois pouvoir tout remettre sur un disque (éventuellement) vierge et ainsi restaurer la même disposition. Utiliser des outils de partitionnement comme fdisk ou parted est très bien, mais je dois être en mesure d'automatiser leur utilisation (scripting) et ils ne doivent pas dépendre de packages liés à X – command line seulement.

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 avait un moyen plus simple.

Vous pouvez utiliser sfdisk pour cette tâche.

Sauvegarder:

 sfdisk -d /dev/sda > part_table 

Restaurer:

 sfdisk /dev/sda < part_table 

Pour les tables de partition GPT, cela nécessite sfdisk depuis util-linux 2.26 ou ultérieur. Il a été réécrit à partir de zéro au dessus de libfdisk .

Cela copy les UUID inchangés, plutôt que de générer de nouveaux. Donc, le nouveau disque est un clone de l'original, pas seulement un autre disque avec la même disposition. Notez que Linux /dev/disk/by-uuid/ regarde les UUID du système de files, mais pas les UUID dans la table des partitions. sfdisk générera de nouveaux UUID si vous éditez les UUID depuis le vidage (par partition et l'UUID pour la table de partition elle-même près du début du file).

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, donc ils sont GPT.

Les disques de less de 2 To peuvent utiliser les deux, donc vous devrez d'abord savoir ce que c'est.

En supposant que vous êtes sous Linux, utilisez l'une de ces commands pour savoir quelle table de partition utilise 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

utilisez sfdisk comme 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 GPD fdisk . Regardez la page de téléchargement ou lancez sudo apt-get install gdisk .

Utilisez ensuite la command sgdisk :

 # Save MBR 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 command randomise le GUID sur le disque et toutes les partitions. Ceci n'est nécessaire que si les disques doivent être utilisés dans la même machine, sinon c'est inutile.

Des bindings pyparties et python-lvm plus anciennes mais toujours intéressantes.

Mettre à jour:

Le précédent a été posté parce que ce qui précède ne fonctionne pas dans de nombreuses situations modernes par la page man de sfdisk.

sfdisk ne comprend pas la table de partition GUID (GPT) et il n'est pas conçu pour les partitions volumineuses. Dans le cas particulier, utilisez GNU plus avancé (8).

Cette command prend toutefois en charge les partitions> 2 To 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; 

L'utilitaire wipefs est inclus dans le package util-linux et est conçu pour cela. Ce n'est pas un utilitaire standard sur tout sauf les systèmes Linux, cependant.

 man wipefs 

SYNOPSIS

 wipefs [-ahnpqtV] [-o offset] device... 

LA DESCRIPTION

wipefs peut effacer les signatures de système de files, de raid ou de table de partition (strings magiques) du périphérique spécifié pour rendre les signatures invisibles pour libblkid. wipefs n'efface pas le système de files ni aucune autre donnée du périphérique. Lorsqu'il est utilisé sans aucune option, wipefs répertorie tous les filesystems visibles et les offsets de leurs signatures de base.

wipefs appelle le BLKRRPART ioctl lorsqu'il a effacé une signature de table de partition pour informer le kernel du changement.

Notez que certains filesystems et certaines tables de partitions stockent plus de strings magiques sur le périphérique. La command wipefs ne répertorie que le premier décalage où une string magique a été détectée. L'appareil n'est pas analysé pour searchr des strings de magie supplémentaires pour le même système de files. Il est possible qu'après un wipefs -o offset le même système de files ou la même table de partitions soient toujours visibles à cause d'une autre string magique sur un autre offset.

Lorsque l'option -a est utilisée, toutes les strings magiques visibles pour libblkid sont effacées.

Notez que, par défaut, wipefs n'efface pas les tables de partitions nestedes sur les disques non-complets. Pour cela, l'option --force est requirejse.

EXEMPLES

  wipefs --all --backup /dev/sdb 

Efface toutes les signatures du périphérique /dev/sdb et crée un file de sauvegarde de signatures ~/wipefs-sdb-<offset>.bak pour chaque signature.

  dd if=~/wipefs-sdb-0x00000438.bak of=/dev/sdb seek=$((0x00000438)) bs=1 conv=notrunc