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.efi
processo 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 initramfs
para 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:
$cmdline
sã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 $SPLASH
deve haver uma imagem que você deseja exibir como tela inicial na inicialização.
$EFISTUB
é o genérico linuxx64.efi.stub
que 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:
-c
significa create (para criar uma nova entrada de inicialização)-d
serve para apontar para o disco onde está o ESP.-p
aponta para o número da partição desse disco.-L
serve para fornecer um rótulo adequado para a entrada de inicialização.-l
aponta 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 UEFI
shell. Você pode tentar muitas coisas nesse shell, incluindo inicializar um kernel efistub
com 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.