Construindo o EFISTUB

Construindo o EFISTUB

por alguns dias, pesquisei em todos os lugares do Google para ver se alguém já teve os mesmos problemas que eu. aqui está meu kernel Linux no meu Lenovo Z50-70 (talvez seja importante)

 $ uname -a
Linux Z50-Debian 4.7.0-1-amd64 #1 SMP Debian 4.7.8-1 (2016-10-19) x86_64 GNU/Linux

 $ lvdisplay  |grep -i path
  LV Path                /dev/Debian/Home
  LV Path                /dev/Debian/Root
  LV Path                /dev/Debian/Swap

# gdisk /dev/sda -l |grep 0
GPT fdisk (gdisk) version 1.0.1
Disk identifier (GUID): 4A75B640-D8A2-03A2-906D-9D9228B6E800
Partitions will be aligned on 2048-sector boundaries
Total free space is 3707 sectors (1.8 MiB)
   1            2048         3653631   1.7 GiB     2700  Basic data partition
   2         3653632         4601855   463.0 MiB   EF00  EFI system partition
   3         4601856         6752255   1.0 GiB     EF00  Basic data partition
   4         6752256         7014399   128.0 MiB   0C01  Microsoft reserved ...
   5         7014400       907063665   429.2 GiB   0700  Basic data partition
   6       907065344       908787711   841.0 MiB   2700  
   7       908787712       910155775   668.0 MiB   EF00  
   8       910155776       953745407   20.8 GiB    8E00  Linux
   9       953745408       976773119   11.0 GiB    2700  Basic data partition

Eu segui dois guias para usar o efi-stub (o kernel UEFI self-bootlaoder)

wiki oficial do debian no efistub e guia bitbinary sobre debian e efistub

mas nenhum deles funcionou.

Problema 1: Meu firmware não encontra o EFI/Debian/vmlinuz.efi(mas encontrou o aplicativo rEFInd efi, bem como o grub quando instalei o Debian pela primeira vez)

questão 2: ao iniciar o vmlinuz.efiprocesso rEFInd, ele interrompe o processo de inicialização com um prompt do initramfs e erros informando que não foi possível montar/encontrar o root.

também

cat /proc/cmdline 

não ecoa my /proc/cmdline, mas um genérico sem qualquer opção especificada para montagem root

questão 3: como no guia que usei efibootmgr, mas a cada reinicialização minha nova entrada é excluída.

Sou bastante novo no mundo (U)EFI, mas realmente gostaria de poder fazer isso funcionar. Como estou sem ideias por enquanto, se você souber de alguma coisa que possa me ajudar, por favor, grite!

Obrigado.

Responder1

Esta pergunta é antiga, mas como não tem resposta e recentemente inicializei meu sistema archlinux com a configuração mencionada, deixe-me escrever como fiz isso. Minha especificação:

OS : arch Linux (mainline kernel, Linux-zen kernel, linux-clear kernel).
System : HP laptop with UEFI 2.

Além disso, eu também estava tentando configurar uma inicialização segura com minhas próprias chaves (o que complicou ainda mais a configuração). Mas não vou tocar nessa parte aqui.

A primeira coisa que você precisa fazer é configurar o seu initramfspara ter o arquivo hooks. Essa é a essência de todo o problema que você está enfrentando (provavelmente, e eu também). Só tenho experiência em como o Arch Linux constrói seu ramdisk/initramfs. Você pode ter que converter o processo para Debian (ou qualquer outra distribuição que você esteja usando).

Comecei com três ganchos disponíveis no processo de construção do initramfs makinitcpio:

base hook ( this is the main and necessary hook )
udev hook ( it does the detection of the devices  of the system including the hard disk and root filesystem ).
LVM hook ( since you have LVM, this hooks would include the device mapper and set up the LVM volumes ).

Construindo o EFISTUB

Use a ferramenta objcopy do pacote binutils.

objcopy \
    --add-section .osrel="/etc/os-release"                          --change-section-vma .osrel=0x20000    \
    --add-section .cmdline=<(echo -n "${cmdline}")                  --change-section-vma .cmdline=0x30000  \
    --add-section .splash="${SPLASH}"                               --change-section-vma .splash=0x40000   \
    --add-section .linux="${linux}"                                 --change-section-vma .linux=0x2000000  \
    --add-section .initrd=<(cat "${INITRD_PREPEND[@]}" "${initrd}") --change-section-vma .initrd=0x3000000 \
    "${EFISTUB}" "${output}"
  wait $!

O comando acima basicamente pega seu kernel, iniramfs e os parâmetros do kernel e os converte em um único EFISTUB que você pode inicializar diretamente a partir do firmware (UEFI).

Aqui: $cmdlinesão basicamente os parâmetros do seu kernel e devem, pelo menos, conter o caminho raiz, por exemplo, no seu caso, root=/dev/Debian/root $SPLASHdeve haver uma imagem que você deseja exibir como tela inicial na inicialização.

$EFISTUBé o genérico linuxx64.efi.stubque vem com systemd. Em Arch Linux, geralmente é colocado no /use/lib/systemd/efi/diretório.

$outputé o local onde você deseja gerar o arquivo (que obviamente deve estar no ```ESP (partição do sistema EFI) para que o firmware possa detectá-lo).

Então, com a ajuda de efibootmgr, você pode fazer uma entrada de inicialização do recém-criado EFISTUB:

# efibootmgr -c -d /dev/sda -p 2 -L "Debian EFISTUB" -l /efi/EFI/debian/linux-efi.efi 

No exemplo acima:

  • -csignifica create (para criar uma nova entrada de inicialização)
  • -dserve para apontar para o disco onde está o ESP.
  • -paponta para o número da partição desse disco.
  • -Lserve para fornecer um rótulo adequado para a entrada de inicialização.
  • -laponta para o carregador (basicamente o efistub). Presumi que ele esteja colocado no diretório EFI/debian no ESP e que esteja montado em/efi.

Dicas: enquanto trabalhava na inicialização efistub, achei muito útil ter o UEFIshell. Você pode tentar muitas coisas nesse shell, incluindo inicializar um kernel efistubcom parâmetros de kernel personalizados, etc.

O guia acima aqui é inicializar o EFISTUB SEM A AJUDA DE QUALQUER BOOT LOADER. Se você estiver inicializando vários sistemas operacionais (kernels), poderá adicionar um carregador de inicialização para gerenciar os diferentes arquivos efistubs.

Responder2

Eu acho que você pode fazer isso para encontrar o disco de instalação do Debian e conectá-lo ao PC. Em seguida, inicialize a partir do disco e passe pelo menu de solução de problemas e recuperação de arquivos vmlinuz e outros arquivos de inicialização.

informação relacionada