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

73

Eu quero fazer um backup de toda a partição layout de um disco rígido, incluindo unidades lógicas, para que eu possa restaurar esse layout para outro disco. Eu faço não quer 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, gostaria de saber se existe entre as ferramentas padrão uma maneira semelhante de salvar o layout? Eu acho que o principal problema é encontrar os deslocamentos para os locais dos EBRs, porque com isso, dd fará 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 fdisk ou parted é bom, mas devo ser capaz de automatizar seu uso (scripting) e elas não devem depender de nenhum pacote relacionado ao X - somente linha de comando.

Meu plano de backup está fazendo isso manualmente em um pequeno script python usando o módulo struct, mas eu esperava que houvesse uma maneira mais fácil.

    
por Lauritz V. Thaulow 11.05.2011 / 09:57

3 respostas

72

Você pode usar o sfdisk para esta tarefa.

Salvar:

sfdisk -d /dev/sda > part_table

Restaurar:

sfdisk /dev/sda < part_table

Para tabelas de partição GPT, isso requer sfdisk do util-linux 2.26 ou posterior. O 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 /dev/disk/by-uuid/ do Linux examina os UUIDs do sistema de arquivos, não os UUIDs na tabela de partições. sfdisk gerará novos UUIDs se você editar os UUIDs do dump (por partição e o UUID da própria tabela de partição perto do início do arquivo).

    
por 11.05.2011 / 10:23
47

Depende se o seu disco de origem usar um MBR (também conhecido como "dos" ou "dos" msdos ") ou uma tabela de partições GPT (também conhecida como" GUID ").

Discos com mais de 2 TB não podem usar o MBR, então eles são GPT.

Discos com menos de 2 TB podem usar ambos, então você terá que descobrir primeiro qual é.

Supondo que você esteja no Linux, use um desses 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 sfdisk como sugerido pela resposta de Petr Uzel ou essa 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 fdisk da GPT . Veja a página de download ou execute sudo apt-get install gdisk .

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

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

    
por 05.01.2013 / 20:05
4

Mais antigos, mas ainda interessantes, listados e ligações python-lvm .

Atualização:

O anterior foi postado porque o acima não funciona em muitas situações modernas de acordo com a página man do sfdisk.

sfdisk doesn't understand GUID Partition Table (GPT) and it is not designed for large partitions. In particular case use more advanced GNU parted(8).

No entanto, este comando suporta partições > 2 TB e LVM.

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

Exemplo de saída:

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