Come copiare il layout della partizione di un intero disco usando strumenti standard


82

Voglio fare un backup dell'intero layout di partizione di un disco rigido, comprese le unità logiche, in modo da poter ripristinare quel layout su un altro disco. Io non voglio copiare il contenuto delle partizioni, solo il layout. Per le partizioni primarie ed estese, è 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

Ma quando si tratta del layout delle partizioni logiche, mi chiedo se tra gli strumenti standard esiste un modo simile per salvare il layout? Immagino che il problema principale sia trovare gli offset delle posizioni degli EBR, perché con quello, ddfarà il resto. Tieni presente che devo essere in grado di rimettere tutto su un (possibilmente) disco vuoto e quindi ripristinare lo stesso layout. Usare strumenti di partizionamento come fdisko partedva bene, ma devo essere in grado di automatizzare il loro uso (scripting) e non dovrebbero dipendere da alcun pacchetto relativo a X - solo dalla riga di comando.

Il mio piano di backup lo sta facendo manualmente in un piccolo script Python usando il modulo struct, ma speravo piuttosto che ci fosse un modo più semplice.

Risposte:


89

È possibile utilizzare sfdisk per questa attività.

Salva:

sfdisk -d /dev/sda > part_table

Ristabilire:

sfdisk /dev/sda < part_table

Per le tabelle delle partizioni GPT, ciò richiede sfdiskda util-linux 2.26 o successivo. È stato riscritto da zero sopra libfdisk .

Questo copia gli UUID invariati, piuttosto che generarne di nuovi. Quindi il nuovo disco è un clone dell'originale, non solo un altro disco con lo stesso layout. Nota che Linux /dev/disk/by-uuid/guarda agli UUID del filesystem, non agli UUID nella tabella delle partizioni. sfdiskgenererà nuovi UUID se modifichi gli UUID dal dump (per partizione e l'UUID per la stessa tabella delle partizioni vicino all'inizio del file).


1
Non lo so per certo, ma l'unico limite che mi viene in mente è il limite di dimensioni di 2 TB per la partizione imposta dallo schema della tabella delle partizioni msdos. Per superare questo limite, è possibile utilizzare GPT, ma AFAIK sfdisk non può funzionare con GPT. Non so se ci sono altri limiti né se sfdisk segnalerà se non è in grado di farcela.
Petr Uzel,

2
sfdisknon funziona con grandi volumi o non supporta GPT.
dhchdhd,

1
@ Barry e quando dici "grande", ti riferisci al limite di 2 TB di cui parla @Petr?
Lauritz V. Thaulow,

5
Il modo corretto è: sudo parted / dev / sda -lm> sda.parted
dhchdhd

1
A volte è utile, per ignorare solo i problemi DOS, aggiungere l' opzione -L o --linux :sfdisk -L /dev/sda < part_table
Diego

51

Dipende se il disco di origine utilizza una tabella delle partizioni MBR (aka "dos" o "msdos") o GPT (aka "GUID").

I dischi oltre 2 TB non possono utilizzare MBR, quindi sono GPT.

I dischi di dimensioni inferiori a 2 TB possono utilizzare entrambi, quindi dovrai prima scoprire quale sia.

Supponendo di essere su Linux, utilizzare uno di questi comandi per scoprire quale tabella delle partizioni viene utilizzata dal disco di origine:

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

Dato

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

Per dischi MBR

usare sfdiskcome suggerito dalla risposta di Petr Uzel o questa 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

Per i dischi GPT

La risposta corretta è stata data qui e qui da Kris Harper .

È necessario fdisk GPT . Guarda la pagina di download o esegui sudo apt-get install gdisk.

Quindi utilizzare il comando 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

L'ultimo comando randomizza il GUID sul disco e tutte le partizioni. Ciò è necessario solo se i dischi devono essere utilizzati nella stessa macchina, altrimenti non è necessario.


10
Ho sempre paura di mescolare i due parametri, quindi un buon trucco è utilizzare --backup=Fileper esportare una tabella delle partizioni dall'unità di origine e --load-backup=Fileripristinare sull'unità di destinazione.
zidarsk8,

Esistono rischi per i dati esistenti sui dischi e sulle partizioni successive quando si sposta la tabella delle partizioni e quindi si randomizza il GUID dei dischi e delle partizioni come descritto sopra? Grazie!
EngBIRD,

@EngBIRD: Finché non si confondono $ source e $ dest, non ci possono essere rischi per i dati, poiché non ci sono dati sulla destinazione. Copi solo il layout della partizione e devi comunque formattare e copiare i dati in seguito.
lunedì

Il motivo per cui ho chiesto è in realtà che non sto partendo da un disco vuoto, sto scambiando due dischi in giro ...
EngBIRD

5

Associazioni pyparted e python-lvm più vecchie ma comunque interessanti .

Aggiornare:

Il precedente è stato pubblicato perché quanto sopra non funziona in molte situazioni moderne per la pagina man sfdisk.

sfdisk non comprende la tabella delle partizioni GUID (GPT) e non è progettata per partizioni di grandi dimensioni. In caso particolare utilizzare GNU più avanzato parted (8).

Questo comando tuttavia supporta partizioni> 2 TB e LVM.

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

Uscita campione:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;

14
Come si ripristina dal sda.partedfile salvato su un nuovo disco?
Avery Chan,

4
Questa risposta è inutile perché la domanda riguardava la copia del layout della partizione su una nuova unità. La risposta riguarda solo il dumping. Come importare? Per favore, migliora.
itsafire

Apparentemente in questo momento, non esiste una buona risposta: serverfault.com/questions/709582/…
Otheus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.