como fazer com que o GRUB encontre módulos em multi-inicialização do Linux LiveUSB?

1

plano de fundo

(pule para o cabeçalho = problem se você for especialista em LiveUSBs, ISOs, GRUB2, etc)

Estou configurando um Linux LiveUSB multiboot / multiISO como detalhado aqui , que eu pretende usar em múltiplos hosts (ou seja, qualquer PC arbitrário eu decido que eu preciso inicializar). O processo parece direto:

  1. Configure o seu host de desenvolvimento : ou seja, a caixa ' Vai usar para criar seu LiveUSB, não que você vai inicializar com o LiveUSB.
  2. Obter / criar uma unidade USB que
    1. é suficientemente grande para todos os ISOs que você deseja inicializar
    2. é inicializável
    3. tem GRUB2 instalado
  3. Coloque as ISOs desejadas, em um local facilmente especificado.
  4. Edite o /boot/grub/grub.cfg :
    1. Definir variáveis globais @ top (por exemplo, acima de menuentry s), esp root
    2. Crie um ou mais menuentry s para cada ISO.

O principal problema é, para cada ISO, criar um ou mais menuentry s que o inicializem apropriadamente. Isso parece simples:

  1. Monte o ISO :
    1. Inspecione a estrutura da ISO. Obtenha seus caminhos para seu grub.cfg , initrd* , vmlinuz (ou qualquer que seja a configuração do GRUB, a imagem inicial do RAMdisk e a imagem do kernel)
    2. Copie do grub.cfg do ISO para seu menuentry (s)
  2. Faça cada menuentry
    1. define o caminho de boothime para o ISO
    2. crie um dispositivo loopback usando o ISO
    3. use um caminho para o dispositivo de loopback em vez do caminho fornecido na grub.cfg da ISO, por exemplo,
      1. initrd /casper/initrd.lz - > %código%
      2. initrd (loop)/casper/initrd.lz - > %código%
  3. Teste seu LiveUSB:
    1. Ainda montado em seu host de desenvolvimento: linux /live/vmlinuz para saúde mental: -)
    2. linux (loop)/live/vmlinuz do seu host de desenvolvimento
    3. para cada host de teste:
      1. anexar ao host de teste desativado
      2. boot!

problema

Muitos ISOs têm grub-script-check s que querem configurar o vídeo antes de fazer a inicialização "real". Todos eles fazem isso de forma ligeiramente diferente, então eu coloco o código de vídeo de cada ISO dentro de seu umount (s). No entanto, o ISO grub.cfg s com o qual trabalhei até agora parece ser mais ou menos assim:

if loadfont /path/to/font/file ; then
  set gfxmode=auto
  insmod efi_gop
  insmod efi_uga
  insmod gfxterm
  terminal_output gfxterm
fi
# usually followed by more menu and background tweaking

A boa notícia é que eu posso determinar o caminho de boothime para o arquivo de fontes - ou seja, posso fazer menuentry happy. A má notícia é que, uma vez dentro do bloco grub.cfg ,

  • apenas 1 dos módulos é carregado.
  • Eu tenho o mesmo problema com os ISOs que usam o Casper (por exemplo, o Mint baseado no Ubuntu, o LMDE1) ou o Debian Live (por exemplo, Clonezilla, LMDE2).

Como faço para o GRUB encontrar all os módulos?

código de exemplo

Observe que o in-ISO loadfont do Clonezilla só encaminha para seu if :

# This file is for compatibility to Ubuntu Linux's uEFI secure boot. 
# The real config file for grub is /EFI/boot/grub.cfg.
configfile /EFI/boot/grub.cfg

O /boot/grub/grub.cfg do meu LiveUSB (fora de todos os ISOs) contém código como

# isofile_abspath==path to the ISO from the root of my LiveUSB.
set isofile_abspath='/ISOs/clonezilla-live-2.4.2-10-amd64.iso'
set root=(hd0,1)
loopback loop ($root)$isofile_abspath
...
set clonezilla_prefix='(loop)/EFI/boot'
...
set loadfont_fp="$clonezilla_prefix/unicode.pf2"
echo -e "About to 'loadfont $loadfont_fp' ..."
if loadfont "$loadfont_fp" ; then
  set gfxmode=auto
  echo -e 'about to 'insmod efi_gop' ...'
  insmod efi_gop
  echo -e 'about to 'insmod efi_uga' ...'
  insmod efi_uga
  echo -e 'about to 'insmod gfxterm' ...'
  insmod gfxterm
  echo -e 'about to 'terminal_output gfxterm' ...'
  terminal_output gfxterm
fi
echo -e 'Done loadfont.'

Resultados no boottime:

About to 'loadfont (loop)/EFI/boot/unicode.pf2' ...
about to 'insmod efi_gop' ...
error: file not found.
about to 'insmod efi_uga' ...
error: file not found.
about to 'insmod gfxterm' ...
about to 'terminal_output gfxterm' ...
error: no suitable mode found
Done loadfont.
    
por TomRoche 14.06.2015 / 01:43

0 respostas