Não é possível inicializar corretamente depois de remover todos os arquivos e, em seguida, voltar à minha unidade de VM

4

Eu criei uma VM do Ubuntu 12.04 de 32 bits no VirtualBox com um disco .vdi. Eu então montei este disco com qemu-nbd e movi todos os arquivos para fora dele; depois de volta para ele. Quando eu inicializo a VM novamente, obtenho resultados variados:

  1. O Ubuntu me diz que houve um erro e pergunta se eu gostaria de corrigir / skip / ignore / manual fix. Se eu corrigir, ele irá reiniciar e inicializar em um tty. Se eu ignorar, ele será inicializado em um tty. Eu não tentei pular / correção manual ainda.
  2. Inicialize em uma tela roxa em branco. Congelar. Nas reinicializações subseqüentes, inicialize com um cursor de texto piscando.
  3. Inicialize na tela inicial do Ubuntu, congele. Na redefinição, veja 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 esse resultado (espero):

  1. Crie uma VM no VirtualBox usando um disco virtual de 8GB .vdi (chamado ub.vdi, para os fins do restante da pergunta)
  2. Inicialize com o ISO de instalação do Ubuntu 12.04.3 de 32 bits
  3. "Experimente o Ubuntu".
  4. Configure uma tabela de partições MSDOS e duas partições primárias, um espaço de troca de 2048MiB, o resto uma partição ext4. (Usado gparted).
  5. Instale o Ubuntu na partição ext4
  6. Encerre a VM
  7. Navegue até o diretório da 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 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 divisão em 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.

Veja também: link . Desculpas se postar novamente parece inconveniente / ingrato / não-idiomático / rude qualquer coisa; as respostas que recebi na SU, embora úteis, simplesmente careciam de experiência para realmente resolver meu problema. Por favor, note que a pergunta que fiz aqui é um pouco mais específica do que a vinculada, mas quaisquer idéias que contornem o problema são mais do que bem-vindas.

    
por mkingston 04.10.2013 / 12:31

1 resposta

1

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

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

Como uma etapa de restauração adicional, você precisa reinstalar o gerenciador de inicialização. Acho que o seguinte comando deve fazer 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.map contenha

(hd0) /dev/nbd

Observe que esse device.map não funcionará se você executar grub-install na VM. Se isso for importante, salve e restaure device.map em torno da invocação de grub-install ou invoque manualmente o comando de baixo nível que grub-install eventualmente executa.

Uma abordagem alternativa seria configurar sua VM com um minúsculo disco de inicialização que contenha apenas o carregador de inicialização, que você não se importaria de construir do zero o tempo todo (ou você poderia armazenar em cache uma cópia compilada toda vez que o carregador de inicialização fosse alterado) o que deveria acontecer raramente).

    
por 05.10.2013 / 04:22