módulo de loopback para grub com inicialização segura

módulo de loopback para grub com inicialização segura

Estou construindo um stick USB de inicialização múltipla com derivados do Ubuntu. Segui vários tutoriais encontrados online: essencialmente, você coloca o isos em um pendrive e depois inicializa-os usando o grub, que está instalado no pendrive.

Porém, estou com o seguinte problema: meu stick também deve funcionar com o Secure Boot ativado. No entanto, preciso do módulo loopback grub para inicializar o isos e, quando inicializo com inicialização segura ativada, a inicialização segura proíbe o grub de carregar o módulo de loopback. Então, não consigo inicializar

Alguém conseguiu inicializar um iso do grub com inicialização segura ativada?

Obrigado

Valério

Responder1

Estou tentando contornar isso no momento.

Parece que o grub do Ubuntu foi explicitamente corrigido para evitar o carregamento de módulos durante a inicialização segura. A mensagem de erro é um pouco inútil: ela faz referência confusa ao nome do arquivo, quando o erro ocorre independentemente de qual módulo está sendo carregado:

apt-get source grub-common
   ...
grep -C 10 "Secure Boot forbids" -r .
   ...
#ifdef GRUB_MACHINE_EFI
  if (grub_efi_secure_boot ())
    {
      grub_error (GRUB_ERR_ACCESS_DENIED,
                  "Secure Boot forbids loading module from %s", filename);
      return 0;
    }
#endif
...

O patch que adiciona isso é ./debian/patches/no_insmod_on_sb.patch

Sua melhor aposta é provavelmente reconstruir o grub com suporte a loopback de codificação ou permitir o carregamento de módulos, ou talvez você possa simplesmente desabilitar a inicialização segura ao inicializar a partir de USB (já que isso tende a ser uma atividade bastante rara).

As implicações de segurança de permitir que o grub carregue módulos são bastante complicadas, então evitarei comentar sobre elas porque alguém me dirá instantaneamente que estou errado e teremos que discutir.

Responder2

Parece que as versões atuais da imagem grub assinada (pelo menos aquela que testei, que vem com o Ubuntu 20.04) contêm o loopbackmódulo, portanto não há necessidade de carregá-lo/inserí-lo. Na verdade, isso não é possível, como já foi observado na resposta acima. Estou postando a configuração que usei para criar uma unidade externa que pode inicializar um ambiente de instalação/live do Ubuntu e uma instalação do Windows 10.

Acabei usando várias partições - uma EFI de 512 MB, NTFS de 20 GB para os arquivos descompactados do Windows e uma grande partição FAT32 para todo o resto, incluindo o ISO do Ubuntu. O NTFS é necessário porque o Windows agora inclui arquivos de instalação maiores que 4 GB. Não acho que a imagem grub assinada inclua o módulo exfat no momento, então NTFS é a única opção aqui. Como observação lateral, os arquivos descompactados do Windows devem residir na raiz da partição; tê-los em um subdiretório não funcionou para mim.

Abaixo está a configuração que usei para instalar o grub na partição EFI:

sudo grub-install \
--boot-directory=[EFI mount point]/boot \
--efi-directory=[EFI mount point] \
--uefi-secure-boot \
--removable \
--target=x86_64-efi \
--no-bootsector \
/dev/sdaX

E aqui está o grub.cfgarquivo (acho que as linhas acima da primeira entrada do menu são redundantes, mas essa é a configuração real que usei):

search --no-floppy --set=root --fs-uuid [UUID of EFI partition]
set prefix=($root)'/boot/grub'
configfile $root/EFI/BOOT/grub.cfg

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry 'Ubuntu 20.04.1' --class ubuntu --class gnu-linux --class gnu --class os {        
    set isodir='/images/ubuntu'
    set isoname='ubuntu-20.04.1-desktop-amd64.iso'
    set isofile=$isodir/$isoname
    
    search --no-floppy --set=isodev --fs-uuid [UUID of FAT32 partition]

    loopback loop0 ($isodev)/$isofile
    linux (loop0)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
    initrd (loop0)/casper/initrd
}

menuentry 'Windows 20H2' {
    set efi_path=/efi/boot/bootx64.efi
    
    search --no-floppy --set=windev --fs-uuid [UUID of NTFS partition]
    chainloader ($windev)/$efi_path
}

menuentry 'UEFI Firmware Settings' {
    fwsetup
}

E isso é tudo, espero que alguém ache útil.

informação relacionada