Não consigo inicializar corretamente depois de mover todos os arquivos e colocá-los novamente na minha unidade VM

Não consigo inicializar corretamente depois de mover todos os arquivos e colocá-los novamente na minha unidade VM

Eu criei uma VM Ubuntu 12.04 de 32 bits no VirtualBox com um disco .vdi. Em seguida, monto este disco com qemu-nbd e movo todos os arquivos dele; depois volte para ele. Quando inicializo a VM novamente, obtenho resultados variados:

  1. O Ubuntu me diz que houve um erro e pergunta se eu gostaria de corrigir/pular/ignorar/correção manual. Se eu corrigir, ele será reiniciado e inicializado em um tty. Se eu ignorar, ele inicializará em um tty. Ainda não tentei pular/correção manual.
  2. Inicialize em uma tela roxa em branco. Congelar. Nas redefinições subsequentes, inicialize com um cursor de texto piscando.
  3. Inicialize na tela inicial do Ubuntu e congele. Na reinicialização, consulte o número 1 nesta lista.

Minha pergunta é: Por que isso acontece? Existe algum endereço de hardware de disco no Grub referenciando/boot/? Existe uma maneira de remover e substituir arquivos no VHD sem ter esse problema?

Como reproduzir este resultado (espero):

  1. Crie uma VM no VirtualBox usando um disco virtual .vdi de 8 GB (chamado ub.vdi, para o restante da questão)
  2. Inicialize com o ISO de instalação do Ubuntu 12.04.3 de 32 bits
  3. "Experimente Ubuntu".
  4. Configure uma tabela de partição MSDOS e duas partições primárias, um espaço de troca de 2.048 MiB e o restante uma partição ext4. (Usado gparted).
  5. Instale o Ubuntu na partição ext4
  6. Desligue a VM
  7. Navegue até o diretório da sua VM e execute o seguinte script:

#!bin/bash
# load the nbd module
sudo modprobe nbd
# make a folder for our virtual disk files
mkdir os_files
# load the virtual disk as a device (nbd0)
sudo qemu-nbd -c /dev/nbd0 ub.vdi
sleep 1
# create a directory and mount the os partition to it
MNT_DIR=$(mktemp -d)
sudo mount /dev/nbd0p2 $MNT_DIR
# move the os files off, then back onto the virtual disk
find $MNT_DIR -maxdepth 1 -mindepth 1 | xargs -I{} sudo mv {} os_files/
find os_files/ -maxdepth 1 -mindepth 1 | xargs -I{} sudo mv {} $MNT_DIR
# clean up
sudo umount $MNT_DIR
sudo qemu-nbd -d /dev/nbd0
rm os_files/ $MNT_DIR -r
unset MNT_DIR

Por que você está fazendo isso?

Como parte de uma exigência contratual, preciso armazenar o disco virtual no controle de versão. Ter um enorme blob binário (disco virtual) no controle de versão é uma dor, principalmente para clone(git)/checkout(svn), mas também para diffs. Considerei dividir em vários arquivos, mas preciso ser capaz de 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.

Veja também:https://superuser.com/questions/641971/manual-clone-recreate-virtual-disk. Desculpas se postar novamente parecer desagradável/ingrato/não idiomático/rude seja o que for; as respostas que recebi na SU, embora úteis, simplesmente não tinham o conhecimento necessário para realmente resolver meu problema. Observe que a pergunta que fiz aqui é um pouco mais específica do que a do link, mas quaisquer ideias que contornem totalmente o problema são mais que bem-vindas.

Responder1

O bootloader precisa encontrar algum arquivo em um local específico. O Ubuntu usa o Grub como seu gerenciador de inicialização padrão, e o Grub contém um driver de sistema de arquivos que usa para carregar o kernel do Linux, mas o Grub precisa encontrar seu driver de sistema de arquivos. Além disso, o

Se você tentar recriar a VM do zero criando um disco vazio e particionando-o, será ainda pior: o disco não conterá um gerenciador de inicialização.

Como etapa adicional de restauração, você precisa reinstalar o bootloader. Acho que o seguinte comando deve resolver isso (você pode precisar de algumas outras opções para garantir que o Grub inclua os drivers de dispositivo necessários):

/usr/sbin/grub-install --root-directory="$MNT_DIR" /dev/nbd

e certifique-se de que /boot/grub/device.mapcontém

(hd0) /dev/nbd

Observe que isso device.mapnão funcionará se você executar grub-installna VM. Se isso for importante, salve e restaure device.mapa grub-installinvocação ou invoque manualmente o comando de baixo nível que grub-installeventualmente será executado.

Uma abordagem alternativa seria configurar sua VM com um pequeno disco de inicialização que contém apenas o gerenciador de inicialização, que você não se importará de construir do zero o tempo todo (ou você pode armazenar em cache uma cópia construída toda vez que o carregador de inicialização mudar, o que deve acontecer raramente).

informação relacionada