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


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 eu gostaria de inicializar diretamente vmlinuz-linux em vez de passar 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


4


origem




Respostas:


Eu 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.


1



Referindo-se a um arquivo funciona, mas você tem que ter cuidado para remover e recriar a entrada entre as tentativas - pelo menos na minha placa-mãe, usando apenas o arquivo acrescenta entradas, não substitui as existentes. Eu adicionei um responda para tentar documentar o processo completo. - Bob


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 tem bcfg disponível, primeiro você precisa obter uma cópia de um shell EFI 2.x. O firmware da placa-mãe provavelmente tem 1.x. o Wiki do arco tem mais detalhes, mas para a maioria Sistemas modernos de 64 bits você vai querer pegar o Shell.efi a partir de Aqui e renomeá-lo shellx64.efi e coloque-o diretamente na raiz da sua partição de sistema EFI. Se a sua placa-mãe fornecer Launch EFI Shell from filesystem device, use-o. Caso contrário, você pode usar o shell interno para iniciar o shell atualizado. Veja o wiki para mais informações.

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

    Depois de encontrar o caminho do bootloader (e o correto fs dispositivo), adicione-o (como na pergunta original):

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

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

  3. Depois de ter adicionado 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 você é melhor bcfg boot rmprimeiro a opção de inicialização e leia-a conforme a 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ê devo salve-o 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
    

    Mais uma vez, 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 readd a entrada antes que você possa alterar as opções.

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


1





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"

0



Isso me dá o erro bcfg: Invalid argument - 'initrd initrd=\initramfs-linux.img root=/dev/sda2' - Erik van Velzen
O mesmo para mim, placa-mãe Gigabyte X370 K7, para referência. - ttbek


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 isso 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 aos parâmetros de passagem, há um interruptor -@ que escapou da 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 isso, não consegui que ele continuasse após a digitação do texto; pressionando enter ou ^D parecia não ter efeito, enquanto ^C terminou 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 ovmf.
  • cópia de /usr/share/edk2-ovmf/OVMF_VARS.fd para o diretório atual - o qemu irá gravar as mudanças no efi config neste arquivo.
  • Crie um diretório para o qemu usar como Virtual VFAT (vvfat). Eu vou me referir a isso como hda de agora em diante.
  • Copie um kernel que tenha o stub EFI em hda.
  • Se esse kernel não tem um initrd embutido com um shell e efibootmgr, localize ou construa um initrd que tenha, 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.)
  • iniciar o 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
    
    • Uma vez iniciado, não modifique o hda dir de fora da VM - veja o aviso Aqui.
    • Note o -boot menu=on parte. Se necessário, você pode pressionar ESC enquanto está inicializando, e você entrará na configuração do uefi. A partir daí, você pode inicializar entradas específicas ou criar / excluir / editar.
  • Você vai cair em um Shell EFI se ele não encontrar um arquivo para inicializar.

    • De lá, você poderia usar bcfg para ver / editar entradas.
    • Ou você pode inicializar seu kernel linux:

      fs0:
      bzImage.efi initrd=\absolute\path\to\initrd arg arg arg
      
    • ... no ponto em que o kernel deve carregar e inicializar com o initrd e args fornecidos. Note que um caminho absoluto é obrigatório ao usar o initrd - veja efi-stub.txt
    • Agora, você pode bisbilhotar nos arquivos efi sob /sys/firmware/, Tente efibootmgr, etc ... tudo sem arriscar seu hardware real. Apreciar!

0