Inicialize o kernel diretamente do UEFI

Inicialize o kernel diretamente do UEFI

Quero inicializar o Arch Linux diretamente da UEFI.

Minha ideia é criar uma entrada de boot usando a ferramenta efibootmgr; Eu usei este comando:

efibootmgr --create --label "arch-test" --loader /vmlinuz-linux --unicode 'root=PARTUUID=f2083749-8bbc-570b-ab3b-e79d72fa08ac rw initrd=\initramfs-linux.img' --verbose

eu seguia página Arch Wiki no EFISTUBe eu criei a entrada, mas quando tento inicializar a partir dela, o sistema travou na inicialização bem no início com esta mensagem:

VFS: unable to mount root fs on unknown-block(0,0)

PS: Quero que isso funcione como ferramenta de emergência/resgate; ou seja, a atualização mais recente systemdinterrompeu o gerenciador de inicialização (systemd-boot), tornando minha máquina inutilizável; Consegui recuperar meu sistema graças a um USB externo ativo. Quero EVITAR isso no futuro!


ATUALIZAÇÕES:
1. ter ou não/barra ou barra invertida, antes initrdnão importa
2. tentei com ambos UUIDe PARTUUID, nada muda
3. meu /bootestá ligado /dev/sda1enquantoraizem /dev/sda3
4. e /booté ESP, também

    # fdisk -l /dev/sda
    [...]
    Disklabel type: gpt
    [...]

    Device         Start       End   Sectors   Size Type
    /dev/sda1       2048   2099199   2097152     1G EFI System
    /dev/sda2    2099200  18874367  16775168     8G Linux swap
    /dev/sda3   18874368 104857599  85983232    41G Linux filesystem
    [...]
    # minfo -i /dev/sda1 :: | grep 'disk type'
    disk type="FAT32   "
  1. seguindo seus comentários, tenteiConcha UEFI. Eu tinha deixado esta opção como a mais recente, pois minha máquina não possui um UEFI Shell interno (É possível?). De qualquer forma, eu tenho:

    • baixei um detiancore
    • colocado Shell.efiem/boot/EFI/Boot/
    • adicionou uma entrada com

      efibootmgr --create --label "TIANO-0" --loader /EFI/Boot/Shell.efi --verbose
      
    • reiniciado neste Shell, digitei fs0:evmlinuz-linux root=/dev/sda3

    • resultando no mesmo erro:

      VFS: unable to mount root fs on unknown-block(0,0)
      
  2. parece que initrdé obrigatório (pelo menos para Arch Linux);
    o comando vmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3faz a mágica

  3. meu sistema é um laptop Dell XPS 9343 e descobri que ele sofre de um bug: não consigo inicializar o EFISTUB, relatado no ArchWikiaqui.
    Eu acho que isso explica ofalhado (primeiro mencionado) procedimento correto!
    A página do ArchWiki também sugere uma solução alternativa, mas no momento eu tentei.


Responder1

   -l | --loader NAME
              Specify a loader (defaults to \\elilo.efi)

Um kernel com EFI-stub ainda não é umcarregador. Para inicializar a partir do BIOS, deve ser um EFI-aplicativo. Todos os carregadores de boot possuem o sufixo .EFI. Eu acho que é possível transformar um kernel em um objeto inicializável diretamente, mas normalmente é um dos gerenciadores de inicialização que é iniciado (com ou sem oferecer uma escolha).

Mas você pode usarConcha UEFI(em sistemas modernos) como carregador de boot interativo. Isso é perfeito para testes. Você o ativa como um dispositivo de inicialização no BIOS, cdpara fs0:, que é o ESP, e então você pode

fs0:> bzImage root=/dev/sda3 

Acabei de compilar um primeiro bzImage há alguns dias. Primeiro esqueci CONFIG_EFI_STUB e o shell UEFI tratou o kernel como um não binário. Uma segunda versão inicializou, sem nenhum initrd=. Além de EFI_STUB=y, apenas desliguei algumas opções e mantive os padrões.

Mas é verdade que a maioria das distros possui kernels que fazemnãopossuem os drivers básicos de dispositivos de bloco - eles precisam da initrd=IMAGEopção.


Eu uso o Uefi Shell como meu gerenciador de boot. Isso não é muito elegante, mas muito simples e flexível. E como opção de emergência acho que é perfeito, porque o Uefi Shell está embutido, enquanto um gerenciador de boot em uma partição pode ser deletado.


Isto é deDocumentação/efi-stub.txt

> Passing kernel parameters from the EFI shell
> --------------------------------------------
> 
> Arguments to the kernel can be passed after bzImage.efi, e.g.::
> 
>     fs0:> bzImage.efi console=ttyS0 root=/dev/sda4

Eu tenho o mesmo prompt do Uefi Shell fs0:>, mas descobri que todas as distros usuais têm kernels EFI_STUB, e o nome não importa. O mais comum é "vmlinuz" (= carregador em torno de um vmlinux compactado).

Se você deixar de lado as opções ".efi" e "console=", resta:

fs0:> bzImage root=/dev/sda4

Qual é o mesmo comando de inicialização mínimo, exceto que eu tenho sda3: Uefi Shell inicia o bzImage pelo stub, o kernel é descompactado e iniciado e os módulos integrados reconhecem o disco SATA. Se o root=dispositivo não for válido, você entra em VFS: unable to mountpânico.


Não consegui iniciar um bzImage (ou vmlinuz, ou ...) diretamente do BIOS, como um grub64.EFI.


UEFI - Aplicativos (wikipedia):

Além de carregar um sistema operacional, o UEFI pode executar aplicativos UEFI, que residem como arquivos na partição do sistema EFI. Eles podem ser executados a partir do shell de comando UEFI,pelo gerenciador de inicialização do firmware, ou por outros aplicativos UEFI. Os aplicativos UEFI podem ser desenvolvidos e instalados independentemente do fabricante do sistema.

Um tipo de aplicativo UEFI é um carregador de sistema operacional como GRUB, rEFInd, Gummiboot e Windows Boot Manager; que carrega um arquivo do sistema operacional na memória e o executa. Além disso, um carregador de sistema operacional pode fornecer uma interface de usuário para permitir a seleção de outro aplicativo UEFI para execução. Utilitários como o shell UEFI também são aplicativos UEFI.

Isso confirma minha opinião de que o UEFI Shell está entre o carregador de inicialização do firmware e o kernel.


O Gentoo tem exemplos semelhantes; eles insistem em nomear o kernel com o sufixo .EFI.

Se por algum motivo um initramfs for necessário, ele poderá ser incorporado ao kernel ou usado como um arquivo separado.

...

Algumas implementações de UEFI, no entantoparecem não suportar a passagem de parâmetrosda NVRAM para o kernel stub EFI.

Responder2

Parece que algumas máquinas mais antigas com firmware UEFI mais antigo não passam argumentos de linha de comando para binários EFI (como um kernel Linux habilitado para EFISTUB). Isso torna impossível passar parâmetros importantes como root=e initrd=para o kernel durante a inicialização.

Usei exatamente o mesmo procedimento para inicializar o kernel diretamente do UEFI (especificamente, aquele descrito emhttps://wiki.debian.org/EFIStub, mas na verdade eu estava fazendo isso no Ubuntu) em duas máquinas diferentes. Na minha placa-mãe ASrock de três anos, funcionou perfeitamente. No meu laptop Dell de onze anos, ele simplesmente ignora os argumentos da linha de comando do kernel.

Portanto, se o seu firmware não suportar argumentos de linha de comando, você poderá estar sem sorte. Vou continuar tentando e postarei um acompanhamento se descobrir uma solução alternativa.

informação relacionada