inicializando o qemu / kvm diretamente de um sistema de arquivos

8

Tendo usado o Xen e seu pygrub por um tempo, agora estou tentando fazer algo semelhante com o KVM / qemu.

Basicamente, eu tenho um volume lógico LVM (embora bem poderia ser um arquivo) que contém o sistema de arquivos raiz de uma distribuição Linux (sem particionamento, apenas FS diretamente no disco) que também contém um / boot / grub / grub .cfg, e gostaria de poder inicializar isso.

Eu estava com a impressão de que o pacote grub-firmware-qemu no Debian / Ubuntu era para isso, mas eu não consegui fazer isso funcionar. AFAICT, a imagem grub.bin contém um memdisk codificado permanentemente com um arquivo grub.cfg com algumas opções de menu (como procurar por um multiboot.img ou procurar por um grub.cfg), mas tudo que consigo ao executar kvm -bios grub.bin é um Mensagem de erro "licença incompatível". E não estou muito certo de como gerar um grub.bin diferente com um grub.cfg diferente (um que só faria configfile (hd0)/boot/grub/grub.cfg ).

Claro, eu poderia criar um disquete ou cdrom ou imagem de disco com uma configuração mínima do grub que faz exatamente isso, mas tenho a sensação de que deveria haver uma maneira mais limpa / canônica de fazê-lo e minha pesquisa trouxe de volta muito pouco até agora.

Suponho que também seja possível usar a opção -kernel do qemu, mas, novamente, não sei como gerar grub.img para isso. (usando um grub.img gerado com grub-mkimage -O i386-pc -o grub.img -c =(echo 'configfile (hd0)/boot/grub/grub.cfg') /usr/lib/grub/i386-pc/*.mod traz a mesma mensagem de erro "incompatible license" novamente).

Isso está no debian com a versão 1.99-23 dos pacotes do grub e 1.1.2 + dfsg-2 do kvm / qemu.

Então, em resumo, como eu deveria criar um grub.bin (para ser usado com kvm -bios ) ou um grub.img (para ser usado com kvm -kernel ) para que o kvm inicializasse uma imagem do grub que é capaz de analisar o /boot/grub/grub.cfg no disco virtual?

    
por Stéphane Chazelas 29.10.2012 / 23:42

2 respostas

6

Por acaso, parece um bug no pacote do debian de grub .

A abordagem -kernel grub.img funciona se eu incluir apenas os módulos grub de que preciso em grub-mkimage .

O -bios grub.bin funciona com o novo pacote grub de experimental (2.00-7). No entanto, o grub.bin que vem com ele não é muito útil.

Ele vem com um memdisk que vem com o grub.cfg . Teria sido melhor usar esse memdisk para manter os módulos e o grub.cfg ser especificado com a opção -c de grub-mkimage . Por exemplo, uma das entradas do menu procura /boot/grub/grub.cfg e se encontra no memdisk como resultado. Além disso, o pacote debian não inclui os módulos do grem do qemu, portanto você não pode construir um grub.bin diferente (embora possa editar o arquivo binário para alterar o grub.cfg), a menos que você o faça a partir do pacote fonte. / p>

A abordagem -bios grub.bin parece a abordagem mais limpa para mim, mas usarei a abordagem -kernel ou floppy até que o pacote debian seja corrigido.

EDIT : bem, o módulo ata.mod grub para ler unidades IDE emuladas é muito mais lento do que usar biosdisk.mod em combinação com seabios (o BIOS padrão quando não está usando -bios grub.bin ). Além disso, parece que o firmware do grub não suporta discos virtio-blk nem virtio-scsi, portanto kvm -bios grub.bin não será uma opção para mim.

Caso alguém queira seguir esse caminho, estou usando agora (sintaxe zsh):

grub-mkimage -O i386-pc -c =(print -l serial 'terminal_input serial' \
  'terminal_output serial' 'set prefix=(hd0)/boot/grub' '. grub.cfg') -o grub.img \
  at_keyboard configfile biosdisk ext2 linux test serial halt minicmd terminal cat

E -kernel grub.img -nographic passou para o kvm. Isso é para inicializar VMs Linux sem gráficos (apenas uma interface serial, então certifique-se de que o grub da VM esteja configurado para usar serial (ou pelo menos não configurado para usar gráficos), que o console do kernel vá para ttyS0 e que você rode um getty lá). Ele pode ser facilmente adaptado para trabalhar também em consoles VGA.

    
por 30.10.2012 / 11:42
2

Depois de muita navegação na Web, não encontrei nenhuma solução e fiz um wrapper para o pygrub ser usado com o libvirt / kvm.

Talvez essa solução seja útil para você, mesmo que seja tarde, então gostaria de compartilhá-la. É um script de gancho libvirt. O script analisa a configuração do domínio no evento prepare / begin, permite que o pygrub encontre o kernel através dos discos disponíveis e copie as imagens para a pasta desejada no host.

Dê uma olhada em github.com/baquilla/pygrub-kvm-wrapper .

    
por 23.06.2016 / 22:48