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 systemd
interrompeu 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 initrd
não importa
2. tentei com ambos UUID
e PARTUUID
, nada muda
3. meu /boot
está ligado /dev/sda1
enquantoraizem /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 "
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.efi
em/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)
parece que
initrd
é obrigatório (pelo menos para Arch Linux);
o comandovmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3
faz a mágicameu 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, cd
para 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=IMAGE
opçã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 mount
pâ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.