inicializando qemu / kvm diretamente de um sistema de arquivos

8

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

Basicamente, eu tenho um volume lógico LVM (embora possa 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 eu gostaria de inicializar isso.

Fiquei com a impressão de que o pacote grub-firmware-qemu no Debian / Ubuntu foi planejado para isso, mas não consegui fazê-lo funcionar. AFAICT, a imagem grub.bin contém um memdisk codificado com um arquivo grub.cfg com algumas opções de menu (como procurar um multiboot.img ou procurar um grub.cfg), mas tudo o que recebo ao executar kvm -bios grub.biné uma "licença incompatível " mensagem de erro. E não tenho muita certeza de como gerar um diferente grub.bincom um grub.cfg diferente (um que faria apenas configfile (hd0)/boot/grub/grub.cfg).

Claro, eu poderia criar uma imagem de disquete ou cdrom ou disco com uma configuração mínima de grub que faça exatamente isso, mas tenho a sensação de que deve haver uma maneira mais limpa / canônica de fazer isso, e minha pesquisa trouxe muito pouco de volta. longe.

Suponho que alguém possa usar a -kernelopção do qemu também, mas, novamente, não sei como gerar um grub.imgpara isso. (usar 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/*.modexibe a mesma mensagem de erro "licença incompatível" novamente).

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

Portanto, resumindo, como devo criar um grub.bin (para ser usado com kvm -bios) ou um grub.img (para ser usado com kvm -kernel) para que o kvm inicialize uma imagem do grub capaz de analisar o / boot / grub /grub.cfg no disco virtual?

Stéphane Chazelas
fonte

Respostas:

6

Por acaso, parece um bug no pacote de grub.

A -kernel grub.imgabordagem funciona se eu incluir apenas os módulos grub necessários grub-mkimage.

O -bios grub.binfunciona com o pacote grub mais recente da experimental(2,00-7). No entanto, o grub.binque vem com ele não é muito útil.

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

A -bios grub.binabordagem parece a mais limpa para mim, mas vou usar a -kernelabordagem ou disquete até que o pacote debian seja corrigido.

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

Caso alguém queira seguir esse caminho, agora estou usando (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 -nographicpassou para kvm. Isso é para inicializar as VMs Linux sem gráficos (apenas uma interface serial, verifique se o grub da VM está configurado para usar serial (ou pelo menos não está configurado para usar gráficos), que o console do kernel vá para ttyS0 e que você execute um getty lá). Ele pode ser facilmente adaptado para funcionar também com os consoles VGA.

Stéphane Chazelas
fonte
2

Após muita navegação na web, não encontrei nenhuma solução e criei um invólucro para o pygrub ser usado com libvirt / kvm.

Talvez essa solução seja útil para você, até tarde, então eu gostaria de compartilhá-la. É um script de libvirt hook. 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 .

Juan Javier Baca
fonte