Como copiar o layout da partição de um disco inteiro usando ferramentas padrão

82

Quero fazer um backup de todo o layout da partição de um disco rígido, incluindo unidades lógicas, para que eu possa restaurar esse layout em outro disco. Eu não quero copiar o conteúdo das partições, apenas o layout. Para as partições primária e estendida, é fácil:

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

Mas quando se trata do layout das partições lógicas, pergunto-me se existe entre as ferramentas padrão uma maneira semelhante de salvar o layout. Acho que o principal problema é encontrar as compensações para os locais dos EBRs, porque com isso ddfaremos o resto. Lembre-se de que preciso colocar tudo de volta em um disco (possivelmente) em branco e, assim, restaurar o mesmo layout. Usar ferramentas de particionamento como fdiskou partedé bom, mas preciso automatizar o uso delas (scripts) e elas não devem depender de nenhum pacote relacionado ao X - apenas linha de comando.

Meu plano de backup é fazê-lo manualmente em um pequeno script python usando o módulo struct, mas eu esperava que houvesse uma maneira mais fácil.

Lauritz V. Thaulow
fonte

Respostas:

89

Você pode usar o sfdisk para esta tarefa.

Salve :

sfdisk -d /dev/sda > part_table

Restaurar:

sfdisk /dev/sda < part_table

Para tabelas de partição GPT, isso requer sfdiskdo util-linux 2.26 ou posterior. Foi reescrito do zero em cima do libfdisk .

Isso copia os UUIDs inalterados, em vez de gerar novos. Portanto, o novo disco é um clone do original, não apenas outro disco com o mesmo layout. Observe que o Linux /dev/disk/by-uuid/analisa os UUIDs do sistema de arquivos, mas não os UUIDs na tabela de partições. sfdiskirá gerar novos UUIDs se você editar os UUIDs do despejo (por partição e o UUID da tabela de partições em si próximo ao início do arquivo).

Petr Uzel
fonte
1
Não sei ao certo, mas o único limite que me vem à mente é o limite de tamanho de 2 TB para a partição imposta pelo esquema da tabela de partições msdos. Para superar esse limite, pode-se usar a GPT, mas o AFAIK sfdisk não pode funcionar com a GPT. Não sei se existe outro limite nem se o sfdisk relatará se não conseguir lidar.
Petr Uzel
2
sfdisknão funciona com grandes volumes ou suporta GPT.
dhchdhd
1
@ Barry e quando você diz "grande", está se referindo ao limite de 2 TB que o @Petr está falando?
Lauritz V. Thaulow
5
A maneira correta é: sudo parted / dev / sda -lm> sda.parted
dhchdhd
1
Às vezes é útil, por ignorar DOS únicos problemas, para adicionar o -L ou --linux opção:sfdisk -L /dev/sda < part_table
Diego
51

Depende se o seu disco de origem usa uma tabela de partição MBR (também conhecida como "dos" ou "msdos") ou GPT (também conhecida como "GUID").

Os discos com mais de 2 TB não podem usar MBR, portanto, são GPT.

Os discos com menos de 2 TB podem usar os dois, portanto, primeiro você precisará descobrir qual é.

Supondo que você esteja no Linux, use um destes comandos para descobrir qual tabela de partição seu disco de origem usa:

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

Dado

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

Para discos MBR

use sfdiskcomo sugerido pela resposta de Petr Uzel ou esta 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

Para discos GPT

A resposta correta foi dada aqui e aqui por Kris Harper .

Você precisa do GPT fdisk . Veja a página de download ou execute sudo apt-get install gdisk.

Em seguida, use o 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

O último comando randomiza o GUID no disco e todas as partições. Isso é necessário apenas se os discos forem usados ​​na mesma máquina, caso contrário, será desnecessário.

mivk
fonte
10
Estou sempre com medo de misturar os dois parâmetros, portanto, um bom truque é usar --backup=Filepara exportar uma tabela de partição da unidade de origem e --load-backup=Filerestaurar a unidade de destino.
zidarsk8
Existe algum risco para os dados existentes nos discos e nas partições subseqüentes quando você move a tabela de partições e seleciona aleatoriamente o GUID dos discos e partições, conforme descrito acima? Obrigado!
EngBIRD
@ EngBIRD: Contanto que você não misture $ source e $ dest, não haverá risco para os dados, pois não há dados no destino. Você copia apenas o layout da partição e ainda precisa formatar e copiar os dados posteriormente.
Mivk
A razão pela qual perguntei é que, na verdade, não estou iniciando em um disco em branco, estou trocando dois discos ...
EngBIRD
5

Ligações pyparted e python-lvm mais antigas, mas ainda interessantes .

Atualizar:

O anterior foi publicado porque o acima não funciona em muitas situações modernas pela página de manual do sfdisk.

O sfdisk não entende a tabela de partição GUID (GPT) e não foi projetado para partições grandes. Em particular, use o GNU mais avançado dividido (8).

Este comando, no entanto, suporta> 2 partições de TB e LVM.

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

Saída de amostra:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;
dhchdhd
fonte
14
Como você restaura do sda.partedarquivo salvo para um novo disco?
Avery Chan
4
Essa resposta é inútil porque a pergunta era sobre copiar o layout da partição para uma nova unidade. A resposta é apenas sobre dumping. Como importar? Por favor melhore.
Itsafire
Aparentemente, neste momento, não há uma boa resposta: serverfault.com/questions/709582/…
Otheus