Como inicializar carregar o kernel usando o carregador EFI stub (efistub)?

11

Eu tenho o Ubuntu 14.04 em execução no modo UEFI como único sistema operacional, sem inicialização dupla aqui. A versão do kernel é 3.13.0-24-genérica. Existe uma partição EFI. Neste caso, a partição EFI não está no padrão /dev/sda1 , mas em /dev/sda3 , porque eu fiz realmente converte o modo BIOS para o modo EFI . Eu usei o pacote grub-efi-amd64 , embora na verdade carregue o menu de inicialização GRUB do menu de inicialização do firmware UEFI (cargas de inicialização UEFI \EFI\ubuntu\grubx64.efi ).

Eu quero pular essa etapa de carregamento do menu de inicialização dupla e inicializar mais rápido, diretamente da UEFI para o kernel. O Os kernels do Ubuntu desde o 12.10 têm o "Kernel EFI stub loader" recurso.

Eu sei que preciso copiar o kernel do Ubuntu para a partição EFI (possivelmente renomear) e criar uma entrada no menu de inicialização UEFI (por exemplo, usando efibootmgr ). Quais comandos exatos do terminal são necessários para fazer isso?

    
por Pro Backup 13.08.2014 / 16:58

2 respostas

14

Os comandos abaixo são mais genéricos que o kernel versão 3.13.0-35.

1. Monte a partição efi e copie os arquivos do kernel lá

  

$ mount /dev/sda3 /boot/efi

     

$ mkdir -pv /boot/efi/EFI/ubuntu/

$ cp -uv /boot/vmlinuz-* /boot/initrd.img-* /boot/efi/EFI/ubuntu/
'/boot/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic'
'/boot/initrd.img-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/initrd.img-3.13.0-35-generic'

2. Altere o nome do arquivo do kernel

Reduza o nome do arquivo do kernel removendo -generic porque parece haver um limite de caminho de comprimento de 39 caracteres e renomear arquivo (s) de kernel para terminar em .efi , isso garante compatibilidade com a maioria dos sistemas

$ for f in /boot/efi/EFI/ubuntu/vmlinuz-*-generic; do mv -uv -- "$f" "${f//-generic/}.efi"; done
'/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic.efi''

A abreviação do nome do arquivo de kernel do nome acima não é suficiente para um mainline kernel do dpkg installed, porque por exemplo /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi sem -generic ainda tem 40 caracteres.

3. Adicionar nova entrada ao menu de inicialização EFI

Substitua 3.13.0-35 neste exemplo pela sua versão específica do kernel

  

$ kv=3.13.0-35;efibootmgr -c -p 3 -L $kv -l \EFI\ubuntu\vmlinuz-$kv.efi -u root=/dev/sda1 initrd=\EFI\ubuntu\initrd.img-$kv-generic ro rootfstype=ext4 debug ignore_loglevel libata.force=dump_id crashkernel=384M-:128M

Esta nova entrada no menu de inicialização se tornará sua nova opção de inicialização padrão.

Talvez você não precise dos parâmetros de depuração adicionais debug , ignore_loglevel , libata.force=dump_id e crashkernel=384M-:128M . Initrd deve estar presente, caso contrário, a inicialização trava em " Comutada para clocksource tsc. " porque o dispositivo raiz sda1 não pode ser aberto.

    
por Pro Backup 13.08.2014 / 23:53
5

De acordo com o wiki Debian , isso pode ser feito em algumas etapas simples que sobreviverão a uma atualização do kernel .

Nota: isso pressupõe que você tenha uma partição EFI montada em /boot/efi .

  1. Crie /etc/kernel/postinst.d/zz-update-efistub com o seguinte conteúdo:

    #!/bin/sh
    cp /vmlinuz /initrd.img /boot/efi/EFI/ubuntu/
    

    Este é um gancho que será executado na atualização do kernel para copiar a imagem mais recente do kernel e initrd para o local apropriado. Em seguida, torne-o executável e execute-o:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Adicione a entrada de inicialização:

    sudo efibootmgr -c -d /dev/sdb -p 1 -L "Ubuntu (efistub)" -l /EFI/ubuntu/vmlinuz -u "root=/dev/sdb2 rw initrd=/EFI/ubuntu/initrd.img quiet splash"
    

    Não se esqueça de alterar os argumentos -d e -p dependendo de onde a partição do sistema EFI estiver. No meu caso, é / dev / sdb1, mas é provável que seja diferente para você. Você provavelmente também precisará alterar o valor de root= no cmdline do kernel para sua partição raiz.

    (Você pode alterar o rótulo para o que quiser alterando o parâmetro -L .)

    A entrada de inicialização que você acabou de adicionar se tornará a entrada padrão. E ele não será interrompido após uma atualização do kernel, já que o gancho garantirá que vmlinuz e initrd.img estejam sempre atualizados.

por Léo Lam 04.03.2016 / 19:49