Como adicionar parâmetros de inicialização ao kernel com o bcfg do shell EFI?

4

efibootmgr está criando entradas inválidas no menu de inicialização EFI. Por exemplo, efibootmgr -c -d /dev/sdX -p Y -l /EFI/refind/refind_x64.efi -L "rEFInd Boot Manager" adiciona caracteres japoneses não inicializáveis no menu de inicialização.

Por outro lado, bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd" funciona muito bem.

Agora, gostaria de inicializar diretamente no vmlinuz-linux em vez de passar pelo refind . Alguém tem uma idéia sobre como passar parâmetros para o kernel? Sem os parâmetros, é: bcfg boot add 3 fs0:\vmlinuz-linux "linux" , mas qual opção eu preciso usar para adicionar initrd=\initramfs-linux.img root=/dev/sda2 ?

Obrigado

    
por ChiseledAbs 04.02.2016 / 10:45

4 respostas

1

Estou encontrando a mesma situação. Acredito que a solução envolverá o uso do parâmetro -opt em linha com o add ou como um comando adicional. Até agora, eu não tive sucesso colocando todos os parâmetros em uma string entre aspas. Minha próxima tentativa será criar um arquivo usando edit e passando o nome do arquivo usando -opt.

Se você tiver sucesso, atualize este tópico.

Então, no shell do uefi, usei edit para criar um arquivo de opt na mídia no mesmo local que o kernel. Nele eu coloquei as opções do kernel em uma única linha. Em seguida, usei o comando bcfg boot -opt 0 FS0: \ filename Você pode precisar usar um número FS diferente, -opt number e filename para corresponder à sua configuração.

    
por 18.02.2016 / 14:20
1

Eu tive problemas semelhantes em uma placa-mãe em particular (Supermicro), e embora a sugestão de Steve de usar um arquivo de texto funcione, há um pouco mais de nuance. Eu tentei documentar o processo abaixo:

  1. Se você não tiver bcfg disponível, primeiro precisará obter uma cópia de um shell EFI 2.x. O firmware da placa-mãe provavelmente tem 1.x. O Wiki do Arch tem mais detalhes, mas para mais sistemas modernos de 64 bits você vai querer pegar o Shell.efi do aqui e renomeá-lo como shellx64.efi e coloque-o diretamente na raiz da sua partição de sistema EFI. Se sua placa-mãe fornecer Launch EFI Shell from filesystem device , use-a. Caso contrário, você pode usar o shell interno para iniciar o shell atualizado. Consulte o wiki para obter mais informações.

  2. Quando estiver no shell 2.x, você deve certificar-se de que sua opção de boot exista. Você pode listar opções com bcfg boot dump -b (o -b ativa o pager, como more ). Se não existir, você precisará adicionar um, de preferência ao topo da lista. Você pode navegar pelos sistemas de arquivos com map -b , procurar entradas iniciando com fs como fs0: e, em seguida, usar ls como ls fs0:\ , ls fs0:\EFI\ , etc para explorar os diretórios.

    Uma vez que você encontrar o caminho do bootloader (e o correto fs device), adicione-o (como na pergunta original):

    bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd"
    

    Isso o adiciona como a quarta entrada de inicialização (contando a partir de 0, 1, 2, 3)

  3. Depois de adicionar a opção de inicialização (verifique com bcfg boot dump -b ), você precisa adicionar os dados opcionais (parâmetros de inicialização). Como Steve mencionou brevemente, a maneira mais robusta de fazer isso é salvar esses parâmetros em um arquivo e depois importá-los com bcfg -opt . No entanto, pelo que eu posso dizer, isso acrescenta as opções, então é melhor você sair bcfg boot rm da opção de inicialização e lê-la como na etapa 2. Depois de ter uma entrada limpa, você pode adicionar os dados opcionais. Por exemplo:

    edit fs0:\EFI\refind\options.txt
    

    Isto irá abrir um editor de arquivos. Digite suas opções (em uma única linha) e pressione F2 para salvar. Pressione F3 para sair. Você também pode editar este arquivo dentro de um sistema operacional, mas você deve salvá-lo como UTF-16 (LE, little-endian). O editor do Shell da EFI faz isso automaticamente.

    O próximo passo é importar as opções:

    bcfg boot -opt 3 fs0:\EFI\refind\options.txt
    

    Novamente, o 3 especifica a entrada de inicialização. Isso deve corresponder ao que você adicionou como. Não execute este comando várias vezes - você deve rm e re add da entrada antes de poder alterar as opções.

  4. Verifique as opções de inicialização e os dados opcionais com bcfg boot dump -v -b .

por 05.06.2017 / 10:51
0

O primeiro comando que você digitou está correto. Você adiciona opções com outro comando. Para o seu caso específico, é:

Shell> bcfg boot -opt 3 "initrd=\initramfs-linux.img root=/dev/sda2"
    
por 25.04.2016 / 00:48
0

Minha documentação para efibootmgr mostra que -p é para especificar o número da partição, mas na sua pergunta parece que você está usando Y para o valor. Se não fosse um erro de digitação, isso poderia explicar por que você recebe caracteres estranhos no menu e teve problemas para inicializar.

Quanto à passagem de parâmetros, há um interruptor -@ que escapou à minha atenção nas primeiras vezes que li os documentos. Se você fornecer um nome de arquivo, ele lerá uma linha de parâmetros desse arquivo.

Os documentos também dizem que você pode usar - como o nome do arquivo, mas quando tentei fazer isso, não consegui fazer isso depois de inserir o texto; pressionar enter ou ^D pareceu não ter efeito, enquanto ^C finalizou o programa sem fazer alterações.

Se você deseja experimentar em uma VM antes de mexer em seu hardware, o seguinte pode ser útil - embora seja necessário ajustar os caminhos OVMF para sua distribuição:

  • Instale o qemu e o pacote de firmware do ovmf.
  • Copie /usr/share/edk2-ovmf/OVMF_VARS.fd para o diretório atual - o qemu gravará as alterações do efi config nesse arquivo.
  • Crie um diretório para o qemu usar como Virtual VFAT ( vvfat ). Vou me referir a ele como hda a partir de agora.
  • Copie um kernel que tenha o stub EFI em hda .
  • Se o kernel não tiver um initrd incorporado com um shell e efibootmgr , localize ou crie um initrd que seja, e coloque-o em hda . (Um initrd genérico pode funcionar, já que esses geralmente permitem que você entre em um modo de emergência se não conseguir encontrar o volume raiz.)
  • start qemu; Eu uso o seguinte comando:

    qemu-system-x86_64 -drive if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/edk2-ovmf/OVMF_CODE.fd -drive if=pflash,format=raw,unit=1,readonly=off,file=OVMF_VARS.fd -enable-kvm -cpu host -m 1024 -usb -device usb-tablet -netdev user,id=mynet -device virtio-net-pci,netdev=mynet -hda fat:rw:hda -boot menu=on
    
    • Após a inicialização, não modifique o hda dir de fora da VM - veja o aviso aqui
    • Observe a parte -boot menu=on . Se necessário, você pode pressionar ESC enquanto estiver inicializando e você entrará na configuração do uefi. A partir daí, você pode inicializar entradas específicas ou criar / excluir / editar.
  • Você entrará em um EFI Shell se não encontrar um arquivo para ser inicializado.

    • A partir daí, você pode usar bcfg para exibir / editar entradas.
    • Ou você pode inicializar o seu kernel do linux:

      fs0:
      bzImage.efi initrd=\absolute\path\to\initrd arg arg arg
      
    • ... ponto em que o kernel deve carregar e inicializar com o initrd e args fornecidos. Observe que um caminho absoluto é obrigatório ao usar o initrd - consulte efi-stub.txt
    • Agora, você pode bisbilhotar os arquivos efi sob /sys/firmware/ , experimentar efibootmgr , etc ... tudo sem arriscar seu hardware real. Aproveite!
por 31.03.2018 / 02:04

Tags