Clone manual / recriar disco virtual

7

Estou tentando clonar uma imagem de disco virtual de maneira bastante manual. A visão geral da minha metodologia até agora é a seguinte:

  1. Crie uma máquina virtual no VirtualBox com HD de 120 GB (o tamanho do hipervisor e do HD não importa, incluído principalmente para integridade e consistência com o resto da minha pergunta, por exemplo, tamanhos de partições)
  2. Instale o Ubuntu 12.04.3 na máquina virtual
  3. Fechar a máquina virtual
  4. Monte o disco rígido virtual associado à máquina virtual
  5. Extrai arquivos e dados do sistema operacional para armazenar em um diretório
  6. Salvar metadados do disco rígido virtual
  7. Crie um novo disco virtual e restaure partições e informações de inicialização de (6)
  8. Restaurar dados de (5) para a partição correta

O problema

Minha VM duplicada não inicializa. O Grub parece copiar, e aparece para reconhecer minha partição raiz (com o Ubuntu instalado). Eu posso dar um boot pelo Grub uma vez e pegar uma tela roxa, como se o Ubuntu estivesse prestes a carregar. Então isso pára. Depois disso, eu posso inicializar no Grub, selecione meu sistema operacional, então eu recebo um cursor de linha de comando piscando. Nenhuma entrada é possível. Eu suspeito que há algo que estou perdendo no processo de clonagem (veja abaixo para mais detalhes). Nota: estou usando o grub2, não o legado.

Por que você está fazendo isso?

Como parte de um requisito contratual, preciso armazenar o disco virtual no controle de versão. Ter um enorme binário binário (disco virtual) no controle de versão é uma dor, principalmente para clone (git) / checkout (svn), mas também para diffs. Considerei a compactação para vários arquivos, mas preciso manipular o sistema operacional / dados extraídos em (5) acima. Observe que meu repositório VCS ainda precisa de todas as informações necessárias para construir uma VM completa.

Detalhes

Instruções detalhadas para reproduzir o que descrevi:

  1. Crie uma VM e inicialize o Live CD do Ubuntu
  2. Escolha "Experimente o Ubuntu"
  3. Abra um terminal
  4. Crie uma partição msdos: sudo parted / dev / sda mklabel msdos
  5. Crie um arquivo de troca de 2 GB: sudo parted / dev / sda mkpart primário linux-swap 2048s 4198399s
  6. Use o restante da unidade para a partição raiz: sudo parted / dev / sda mkpart primário ext4 4198400s 100%
  7. Reinicie a máquina, escolha "Instalar o Ubuntu"
  8. Escolha a opção de particionamento avançado
  9. Clique duas vezes na partição swap, escolha usá-la como swap
  10. Clique duas vezes na partição raiz, escolha formatá-la e use-a para raiz (/) ponto de montagem

Agora, faça o seguinte para clonar o disco:

# Set up some parameters
ORIG_DEV="/dev/nbd0"
ORIG_MNT=$(mktemp -d)
ORIG_IMG="orig.vdi" 
CLONE_DEV="/dev/nbd1"
CLONE_MNT=$(mktemp -d)
CLONE_IMG="clone.vdi"
qemu-img info $ORIG_IMG # save the "virtual size" output (in bytes) in the
                        # VIRT_SIZE variable in the next command
VIRT_SIZE="128849018880"

# Create the clone disk
qemu-img create -f vdi $CLONE_IMG $VIRT_SIZE

# Use qemu to make both disks accessible
modprobe nbd
qemu-nbd -c $ORIG_DEV $ORIG_IMG
qemu-nbd -c $CLONE_DEV $CLONE_IMG

# Set up the clone disk partition table and partitions
parted $CLONE_DEV mklabel msdos
parted $CLONE_DEV mkpart primary linux-swap 2048s 4198399s
parted $CLONE_DEV mkpart primary ext4 4198400s 100%

# Format the clone disk partitions and clone the UUIDs
mkswap $CLONE_DEVp1 -U $(blkid $ORIG_DEVp1 -s UUID -o value)
mkfs.ext4 $CLONE_DEVp2 -U $(blkid $ORIG_DEVp2 -s UUID -o value)

# Mount both disks and copy root from the original to the clone
mount $CLONE_DEVp2 $CLONE_MNT
mount $ORIG_DEVp2 $ORIG_MNT
find $ORIG_MNT -maxdepth 1 -mindepth 1 | xargs -I{} cp -ar {} $CLONE_MNT
umount $ORIG_MNT
umount $CLONE_MNT

# Copy the boot sector and partition table from the original
dd if=$ORIG_DEV of=$CLONE_DEV bs=$((2048*512)) count=1

# Disconnect the disks
qemu-nbd -d $CLONE_DEV
qemu-nbd -d $ORIG_DEV

O que mais você tentou?

  1. grub-install --root-directory = / caminho / para / clone / device / boot / / dev / clone_device. Isso instalou o Grub no dispositivo correto, mas com os detalhes do dispositivo do meu host. A VM não inicializaria.
  2. execute o chroot no disco clone e, em seguida, instale o grub. Encontrei problemas porque devo usar hosts de 64 bits para clonar convidados de 32 bits. Isto parece uma avenida esperançosa para investigar, mas estou preso a como conseguir isso.
  3. Monte o disco virtual, mova todos os arquivos da partição de dados usando mv , zere os dados e as partições de troca ( dd if=/dev/zero of=/dev/nbd0p2 ) e comprima o disco virtual (usando VBoxManage modifyhd clone.vdi --compress ). O disco começou a se expandir em meu sistema de arquivos host, já que isso estava preenchendo-o com espaço vazio (hah!). Parei dd quando percebi que isso estava acontecendo e, em seguida, compactei a imagem do disco. Ainda estava com mais de 3GB. (Eu não tentei usar o gzip / bzip, vou começar a tentar isso esta noite. Também vou tentar deixar o dd limpar até a conclusão, mas eu prefiro uma solução menos demorada, mesmo que isso funcione) .
  4. e2image. Veja minha outra pergunta: e2image restaure os metadados do sistema de arquivos . Eu não resolvi isso. Observe que as etapas que forneço na seção Detalhes , incluindo criação de partição, formatação e cópia do setor de inicialização, mas anterior copio a partição raiz, produz uma imagem de tamanho muito semelhante arquivo para aquele criado por e2image.
  5. Inicializando em outra VM para fazer o chroot nesta para executar o grub-install. Eu realmente não fiz isso, mas incluí-lo aqui no caso de alguém sugerir isso. Para meus usuários, preciso que a recombinação da máquina virtual seja roteirizável; que impede um processo de configuração envolvido.
  6. Instale o extlinux em vez do Grub. Embora malsucedido, este exercício indica que (eu acho!) O bootloader está carregando com sucesso o disco da minha partição, mas fica preso neste ponto.

Se você chegou até aqui, obrigado! Quaisquer sugestões para avenidas de investigação, no entanto não detalhadas, serão muito apreciadas. Agradecemos antecipadamente.

    
por mkingston 06.09.2013 / 19:20

4 respostas

4

Eu tenho uma proposta alternativa que omite a necessidade de extrair e recriar o conteúdo do seu disco virtual.

Se você estiver usando o git, você pode trabalhar diretamente no disco virtual montado e ter seu diretório .git em outro lugar. A única coisa é que você provavelmente precisa ter o seu .gitignore (se houver) no diretório raiz da partição raiz no seu disco virtual.

EDITAR:
Para clonagem, você pode usar o mecanismo normal do VirtualBox após a instalação inicial. Sempre que você precisar restaurar uma versão específica, crie outro clone a partir do original, monte-o e faça um checkout git.
Desde que a versão do grub não seja diferente, é tudo o que você precisa fazer. Se a versão do grub for diferente, você precisará inicializar a VM a partir do seu 12.04.3.iso e fazer uma instalação do grub.

Dessa forma, o fluxo de trabalho alternativo é (adicionado à nova etapa 4, etapa modificada 5) :

  1. Crie uma máquina virtual no VirtualBox com HD de 120 GB
  2. Instale o Ubuntu 12.04.3 na máquina virtual
  3. Fechar a máquina virtual
  4. Clonar máquina virtual, ponha de lado o original
  5. Monte o disco rígido virtual do oringinal ou primeiro clone (por exemplo, em / media / virtual)
  6. cd / media / virtual
  7. git --git-dir = / algum lugar / outro / virtual.git --work-tree =. init
  8. git --git-dir = / algum lugar / outro / virtual.git --work-tree =. adicionar.
  9. git --git-dir = / algum lugar / outro / virtual.git --work-tree =. commit -m "Importação inicial"
  10. ... quaisquer outras tarefas do git ...

Se você não quiser adicionar sempre - git-dir = / algum lugar / outra / virtual.git --work-tree =. , há uma pergunta no Stackoverflow que explica como para se livrar dele: Posso armazenar a pasta .git fora os arquivos que eu quero rastrear?

Não é exatamente o que você pediu, mas a descrição do seu problema me dá a impressão de que você está mais interessado em realizar seu trabalho do que na forma exata de fazê-lo.

    
por 12.09.2013 / 22:36
3

Talvez você já tenha tentado isso, talvez você não tenha feito isso. Mas você já tentou reinstalar o Grub2 de um Live CD dentro da "VM duplicada"? Tudo o que li parecia que você estava instalando o Grub2 da máquina host.

  • Quando chegar ao ponto em que você tem uma VM duplicada que não inicializa
  • Monte um CD ao vivo, como o disco de instalação do Ubuntu, na VM
  • Inicialize a VM e pressione F12 para inicializar a partir do Live CD
  • Reinstale o grub na linha de comando (dentro da VM)

Se você quiser automatizar o processo, você pode usar VBoxManage para montar um Ubuntu Live CD personalizado que execute um script para reinstalar o Grub2 na inicialização.

VBoxManage storageattach "io" --storagectl "IDE Controller" \
--port 1 --device 0 --type dvddrive --medium debian-6.0.2.1-i386-CD-1.iso

Exemplo de origem

Espero que não muito desatualizado, há um guia em help.ubuntu.com para personalizar o Live CD , e um Stack Exchange pergunta / resposta em askubuntu.com envolvendo a inclusão de um script de inicialização em um Live CD personalizado

    
por 09.09.2013 / 02:20
3

Parece que você não teve muita ideia sobre o ponto de montagem do Ubuntu? Você considerou separar a VM em várias partições?

no link abaixo:

link

uma instalação básica é apenas 4G, + 1G para SWAP, + 2G para / tmp, então você pode criar uma partição separada para / usr, / var, / home, / opt

faça 1G para cada um deles no começo, você pode crescer dinamicamente com caixa virtual quando necessário

referência:

link

Depois, você pode determinar seu escopo do SVC, apenas arquivos ou logs de usuários ou o sistema operacional? para o qual você pode ter muito menos dor na versão.

na maioria dos casos, você pode simplesmente tornar o /, / usr e / opt read-only e unchangeble após a configuração e, assim, reduzir a dor de cabeça da versão geral.

mas uma coisa é lembrar, como seu contrato diz que você precisa armazenar seu disco virtual, eu acho que armazenar dados extraídos do disco virtual não corresponde ao seu contrato. Mas armazenar várias correspondências de disco virtual. É por isso que eu sugiro que você crie o ponto de montagem e, em seguida, faça parte deles somente para leitura (portanto, há apenas uma versão deles).

apenas uma observação adicional, lembre-se de verificar se você pode desativar a data de acesso a arquivos do ponto de montagem? (alguma configuração de segurança muito alta não permite que isso seja desativado, perícia computacional)

Como a data de acesso é realmente gravada no disco se a data de acesso estiver ativada. Portanto, um disco virtual / ponto de montagem que é acessado no dia 2 é, na verdade, uma versão diferente com o disco virtual / ponto de montagem no dia 1, mesmo que nada esteja escrito.

referência (sem tempo de acesso):

link

    
por 13.09.2013 / 17:01
0

Mais um pensamento sobre isso, vou realmente olhar para /etc/fstab . Como suas partições são definidas lá? Se eles forem definidos pelo UUID , talvez haja uma chance de que essas informações não sejam replicadas com o processo de clonagem. Você pode querer torná-los definidos por nomes de dispositivos, como /dev/sda0 , por exemplo.

Um outro ponto, por que não executar o git de dentro da própria máquina virtual? Eu posso pensar em ter um diretório no host tendo seu repositório. A máquina virtual pode então montar esse diretório e executar git na própria máquina virtual.

    
por 15.09.2013 / 08:04