Gerando menusentry para imagens ISO dinamicamente em grub.cfg

1

Estou fazendo um pendrive híbrido EFI + híbrido de várias inicializações, em que as imagens do Linux serão armazenadas como arquivos .iso. Eu gostaria de evitar adicionar manualmente os sistemas no grub.cfg ou re-executar alguma coisa toda vez que eu adicionasse uma imagem, então estou tentando fazer um loop pelos arquivos na unidade USB, para cada um gerando uma entrada de menu que (esperançosamente) carregaria. O seguinte é um equivalente do que eu estou tentando fazer com o meu grub.cfg:

for iso in "/boot/iso/*.iso"
do
  menuentry "$iso" --class os {
    loopback loop $iso
    linux (loop)/casper/vmlinuz
    initrd (loop)/casper/initrd.lz
  }
done

No entanto, o shell do GRUB não parece fazer expansão de nome de arquivo (globbing), no qual isso depende. Eu também tentei capturar a saída de algo como ls (hd0,gpt3)/boot/iso , mas aparentemente não há suporte nem planos para adicioná-lo.

Talvez eu esteja completamente fora da minha mente tentando gerar menusenries em um loop for, mas espero que haja algum módulo que torne isso viável. Também notei que, embora for iso in a.iso b.iso gerasse vários menuentry blocos como esperado, a variável $iso em seus corpos não é substituída.

A minha pergunta é, como faço para criar um menuentry por arquivo .iso?

    
por Norrius 05.01.2018 / 19:38

1 resposta

2

Como resultado, o shell do GRUB suporta a expansão de curingas, mas somente se você carregar primeiro o módulo regexp do GRUB. Também é importante prestar atenção às aspas.

É ainda possível passar variáveis para menuentry , especificando-as como argumentos (tratando menuentry como uma função). Eles são convertidos em uma chamada setparams , configurando-os como $1, $2, $3 e assim por diante. O seguinte inicializa com sucesso uma imagem do Linux Mint sem codificar o nome do arquivo da imagem:

insmod regexp

for iso in /boot/iso/*.iso
do
  menuentry $iso $iso {
    echo "Booting from $2"
    loopback loop $2
    linux (loop)/casper/vmlinuz file=/cdrom/preseed/linuxmint.seed boot=casper iso-scan/filename=$2
    initrd (loop)/casper/initrd.lz
  }
done

Eu também descobri o projeto multibootusb , que <<> exatamente o que eu estava tentando alcançar, tornando meus esforços obsoletos.

    
por 06.01.2018 / 00:29