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

18

Eu tenho uma imagem de uma partição existente gerada com dd if=/dev/sdXN of=image.bin . Agora quero usar essa imagem como base para uma máquina virtual. Eu sei converter a imagem em um formato que o VirtualBox pode 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 muito a inicialização da VM.

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

    
por Mika Fischer 19.06.2012 / 19:17

5 respostas

12

Você pode fazer isso na máquina host. A maioria das ferramentas como fdisk funcionará em arquivos e kpartx você acessa partições em um arquivo.

  1. Crie uma nova imagem esparsa vazia de 100GiB (deixe isso um pouco 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. Faça com que as partições no arquivo de imagem disponíveis sejam dispositivos individuais

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

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

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

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

    sudo losetup -D
    
por 19.06.2012 / 21:09
8

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

Uma maneira de evitar a cópia de toda a imagem seria criar uma imagem em formato .vmdk que se refere a arquivos de extensão separados para a tabela de partição 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 a partir do deslocamento 0 são lidos a partir do arquivo raw "parttable.bin", mas o setor 63 e superior vêm do despejo de partição bruto "partition-image.bin". (Obviamente, substitua 63 pelo deslocamento real da primeira partição, geralmente 2048 nos dias de hoje).

O resultado final é que, de dentro do VBox, parece que você preencheu 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 de dentro da VM e, se você acertar seus deslocamentos, verá o conteúdo da sua imagem de partição dentro da partição recém-criada.

    
por 12.02.2013 / 07:15
3

Problema interessante. Aqui está o que eu faria:

  1. Crie a VM com um disco apropriadamente grande e, em seguida, inicialize-a a partir de um CD de recuperação.
  2. Tenha acesso à sua imagem de disco existente de alguma forma (nfs, cifs, etc.).
  3. Crie as partições que você precisará no disco local da VM.
  4. Use o 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 e, em seguida, execute chroot nela e execute update-grub (tenha cuidado, você pode precisar ajustar seus arquivos de configuração antes que funcione corretamente).

Boa sorte!

    
por 19.06.2012 / 19:41
2

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

Crie a imagem de teste:

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

Eu não estou usando 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

Liberte 1 MB no início.

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

Por fim, crie a tabela de partições.

fdisk extfs

Defina o primeiro setor para 2048 (2048 setores * 512 B / setor = 1 MB), último setor o padrão (ou seja, fim da imagem).

    
por 02.05.2013 / 11:08
1

Eu pessoalmente prefiro acrescentar usando dd .

Estou assumindo setores de 512 bytes aqui. Pode haver um caso para setores de 2048 bytes, portanto, basta trocar os números e fazer as contas.

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

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

MBR

Compor a imagem

Eu pessoalmente prefiro acrescentar o primeiro MB (2048 setores) ao seu começo:

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

Finalmente, execute o fdisk para criar a tabela de partições (ou copie suas próprias), criei uma partição usando valores padrão.

Verificando

Para verificar, crie partições de loop e autodetectar:

sudo losetup -fP full.img

Execute file no 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

Compor a imagem

Eu pessoalmente prefiro acrescentar o primeiro MB (2048 setores, como o gdisk irá padronizar para este número, pois ele está alinhado em 1 MB) ao seu início para o início do MBR e 34 setores para o seu final (ou 2048 para um MB completo) para o final GPT (setor final pode ser diferente). Omitindo o fim, a GPT 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 suas próprias), criei uma partição usando valores padrão.

Verificando

Para verificar, crie partições de loop e autodetectar:

sudo losetup -fP full.img

Execute file no 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 nenhuma adivinhação, redimensionamento ou alinhamento manual.

    
por 17.07.2016 / 12:53