Converter imagem de uma partição em imagem de um disco com tabela de partição

20

Eu tenho uma imagem de uma partição existente gerada com dd if=/dev/sdXN of=image.bin. Agora eu quero usar esta imagem como base para uma máquina virtual. Eu sei como converter a imagem em um formato que o VirtualBox possa usar.

O problema é que a imagem "disco" é realmente apenas a imagem de uma partição e, portanto, não contém um MBR ou uma tabela de partição. Isso dificulta a inicialização da VM.

Existe uma maneira simples, dada a imagem de uma partição, de criar uma imagem de disco adequada, incluindo uma tabela de partição?

Mika Fischer
fonte

Respostas:

13

Você pode fazer isso na máquina host. A maioria das ferramentas fdiskfunciona em arquivos e kpartxdá acesso a partições em um arquivo.

  1. Crie uma nova imagem esparsa vazia de 100GiB (torne-a ligeiramente maior que o tamanho da imagem da partição)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Particione o arquivo de imagem com fdisk

    fdisk myvm.img
    
  3. Disponibilizar as partições no arquivo de imagem são dispositivos individuais

    sudo kpartx -a myvm.img
    
  4. Copie a imagem da partição para a partição

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Estenda o sistema de arquivos para preencher toda a partição

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Feche as partições

    sudo kpartx -d myvm.img
    
  7. Desmonte o dispositivo de loopback

    sudo losetup -D
    
mgorven
fonte
Isso não faria com que a partição criada na imagem "não correspondesse" ao comprimento da partição da imagem? E existe uma maneira de resolver isso? E, um gerente de sistema de arquivos "suficientemente inteligente" seria capaz de dizer que não está usando o tamanho inteiro da partição e se expandir para se ajustar?
killermist
@killermist Resposta atualizada.
mgorven
Esta é uma boa resposta. Você conhece alguma maneira de evitar copiar tudo no processo?
Mika Fischer
@MikaFischer Infelizmente, não, porque a tabela de partição precisa existir antes da partição, e eu não conheço nenhum mecanismo para acrescentar dados a um arquivo.
mgorven
Eu acho que a resposta de Harun é melhor porque é fácil de fazer e pode ser roteirizada.
philcolbourn
9

Tenho certeza de que o problema original foi resolvido há muito tempo, mas para qualquer pessoa com um problema semelhante:

Uma maneira de evitar copiar a imagem inteira seria criar uma imagem no formato .vmdk que se refira a arquivos de extensão separados para a tabela de partições e para o conteúdo da partição.

Eu tenho esse trecho em um arquivo .vmdk de um teste que fiz há algum tempo:

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

Isso significa que os 63 setores que começam no deslocamento 0 são lidos no arquivo bruto "parttable.bin", mas o setor 63 e superior vem do despejo de partição bruto "partition-image.bin". (Obviamente, substitua 63 pelo deslocamento real da primeira partição, geralmente 2048 atualmente).

O resultado final é que, de dentro do VBox, parece que você colocou a tabela de partições na frente da imagem da partição, sem ter que fazer a longa operação de cópia.

Particione a unidade na VM e, se você acertar as compensações, deverá ver o conteúdo da imagem da partição dentro da partição recém-criada.

Harun
fonte
2
Eu acho que o '63' na segunda linha precisa ser 0 se partition-image.bin for uma imagem de partição. Acabei de fazer algo parecido com isso e precisava definir esse deslocamento no arquivo de imagem da partição para zero. philatwarrimoo.blogspot.com.au/2014/01/...
philcolbourn
Gênio. Eu apenas tive que fazer isso para usar uma partição do Windows para uma VM em um host Linux, e esta é a única coisa que funcionou, utilizando os passos de @philcolbourn: superuser.com/a/804396/93066
bmaupin
O que deve estar no restante do arquivo vmdk?
gozzilli
1
@gozzilli O restante do arquivo contém vários detalhes, como números de versão do arquivo, tipo de adaptador de disco, uuids e geometria do disco. Não sei como escrever esses bits. Eu recomendaria apenas usar uma ferramenta para criar um vmdk apontando para a imagem do disco e modificar apenas as linhas que descrevem onde obter o cabeçalho extra da partição.
Harun
3

Problema interessante. Aqui está o que eu faria:

  1. Crie a VM com um disco adequadamente grande e inicie-o a partir de um CD de recuperação.
  2. Obtenha acesso à sua imagem de disco existente de alguma forma (nfs, cifs, etc.).
  3. Crie as partições necessárias no disco local da VM.
  4. Use dd para gravar a imagem da partição na partição no disco vm.

Depois disso, você precisará atualizar seu gerenciador de inicialização. Supondo que você esteja usando o GRUB, monte a partição recém-gravada, faça chroot nela e execute update-grub(tenha cuidado, porém, talvez seja necessário ajustar seus arquivos de configuração antes que ela funcione corretamente).

Boa sorte!

bahamat
fonte
2

Você pode redimensionar o sistema de arquivos no local, com GParted.

Crie a imagem de teste:

dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs

Não estou usando o resize2fs, porque ele redimensiona o arquivo, em vez de deixar espaço livre.

sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0

1 MB grátis no início.

sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0

Por fim, crie a tabela de partição.

fdisk extfs

Defina o primeiro setor como 2048 (2048 setores * 512 B / setor = 1MB), o último setor o padrão (isto é, final da imagem).

ignis
fonte
1

Eu pessoalmente prefiro acrescentar usando dd.

Estou assumindo setores de 512 bytes aqui. Pode haver um caso para setores de 2048 bytes, portanto, troque os números e faça as contas.

Em cada caso, estou usando um arquivo de teste de 512 MB, por exemplo:

dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img

MBR

Compondo a imagem

Pessoalmente, prefiro acrescentar o primeiro MB (2048 setores) ao seu início:

dd if=testfs.img skip=2048 bs=512 of=full.img

Finalmente, execute o fdisk para criar a tabela de partições (ou copie por conta própria), criei 1 partição usando valores padrão.

Verificando

Para verificar, crie partições de loop e detecção automática:

sudo losetup -fP full.img

E execute fileno dispositivo de loopback particionado resultante:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

Compondo a imagem

Pessoalmente, prefiro anexar o primeiro MB (2048 setores, já que o gdisk assumirá o padrão deste número, pois está alinhado com 1 MB) ao início do MBR inicial e 34 setores ao final (ou 2048 para um MB completo) no final. GPT (setor final pode ser diferente). Omitir a GPT final pode perder seus dados:

dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

Finalmente, execute o gdisk para criar a tabela de partições (ou copie por conta própria), criei 1 partição usando valores padrão.

Verificando

Para verificar, crie partições de loop e detecção automática:

sudo losetup -fP full.img

E execute fileno dispositivo de loopback particionado resultante:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files) Este método garante não adivinhar, redimensionar ou alinhar manualmente.

Dan Dart
fonte
Como você encontra o setor final da imagem em gpt
Anwar
Quando eu corro isso sudo file -s /dev/loop11p1eu tenho /dev/loop11p1: data. Que anteriormente era um sistema de arquivos ext4. E o full.img resultante é menor. Acho que você inverteu a solução.
Anwar
Eu acho que você quer dizer seek=2048neste comando dd if = testfs.img pular = 2048 bs = 512 of = full.img
Anwar