Erro de sintaxe no grub.cfg no update-grub (Grub 2) (memtest86 +)

1

Quando executo o update-grub ou tento reinstalá-lo, recebo um "erro de sintaxe".

A saída é um pouco assim:

error: syntax error.
error: Incorrect command.
error: syntax error.
error: line no: 262
Syntax errors are detected in generated GRUB config file.
Ensure that there are no errors in /etc/default/grub
and /etc/grub.d/* files or please file a bug report with
/boot/grub/grub.cfg.new file attached.

Por que isso está acontecendo? O que posso fazer?

Antecedentes

Após uma atualização do Manjaro, meu sistema não inicializou mais. Ele disse "arquivo /boot/vmlinuz-316-x86_64 não encontrado". E então "você precisa carregar o kernel primeiro".

Eu iniciei a partir de um pendrive (o manjaro live / installer disk) e segui as instruções do link (Sistemas UEFI) com chroot e update-grub. Na verdade, notei pela primeira vez o problema de "erro de sintaxe" na etapa em que tentei reinstalar o grub, depois que descobri que "as variáveis EFI não são suportadas neste sistema".

Eu imagino (mas não sei ao certo) que isso pode estar acontecendo por um tempo despercebido. Qualquer atualização para o grub.cfg falhou, mas o antigo grub.cfg ainda era "bom o suficiente". Mas com a atualização, o arquivo vmlinuz foi renomeado, e o grub.cfg se referiu a um antigo arquivo vmlinuz, que não existe mais. É por isso que a inicialização falhou.

(Eu já sei a resposta enquanto escrevo isso. Pode não ser uma explicação completa, mas foi o suficiente para eu consertar isso. Eu só quero compartilhar o resultado, para salvar os outros o problema)

    
por donquixote 12.06.2015 / 06:29

2 respostas

2

Para mim, foi uma resposta muito específica, mas quero explicar de maneira mais geral como solucionar isso.

Na verdade, muitas das informações já estão na mensagem de erro, mas para mim não era óbvio a princípio.

Resumindo:

  • Siga o número da linha, em /boot/grub/grub.cfg.new. Tente entender por que você encontrou um erro de sintaxe.
  • Siga o comentário neste arquivo, que aponta para / etc / default / grub ou um arquivo específico em / etc / grub /*.
  • No caso de um script de proxy, siga a dica para um arquivo em /etc/grub.d/proxifiedScripts/ .

Etapas de solução de problemas, em detalhes

O /boot/grub/grub.cfg é criado automaticamente em "update-grub", com base em vários arquivos: /etc/default/grub e quaisquer arquivos em /etc/grub.d/* .

/boot/grub/grub.cfg.new
No entanto, no caso de um erro de sintaxe (ou qualquer erro, suponho), o /boot/grub/grub.cfg original NÃO é sobrescrito, mas o novo arquivo é criado em /boot/grub/grub.cfg.new .

A mensagem de erro contém um número de linha, no meu caso 262, que se refere a esse arquivo /boot/grub/grub.cfg.new . No meu caso, isso foi 262. Olhando para o arquivo, eu encontrei isto:

### BEGIN /etc/grub.d/60_memtest86+_proxy ###
if [ "${grub_platform}" == "pc" ]; then
fi
### END /etc/grub.d/60_memtest86+_proxy ###

Eu aprendi que en vazio if / then / fi block no shell script não é permitido, então esse foi o erro de sintaxe. Muito estúpido imo design de linguagem, mas é assim que é.

Também encontrei uma correção, que é adicionar uma instrução sem sentido no bloco. Um cólon foi sugerido, mas pode haver outras soluções.

### BEGIN /etc/grub.d/60_memtest86+_proxy ###
if [ "${grub_platform}" == "pc" ]; then
    :
fi
### END /etc/grub.d/60_memtest86+_proxy ###

Melhor ainda seria remover completamente esse bloco sem sentido.

Agora, não queremos realmente editar esse arquivo manualmente, porque as alterações seriam apagadas no próximo grub de atualização (se for bem-sucedido, que é o objetivo).

/etc/grub.d / *
O snippet contém uma sugestão de onde procurar em seguida: /etc/grub.d/60_memtest86+_proxy . Este arquivo diz:

#!/bin/sh
#THIS IS A GRUB PROXY SCRIPT
'/etc/grub.d/proxifiedScripts/memtest86+' | /etc/grub.d/bin/grubcfg_proxy "+*
+#text
-'Memory Tester (memtest86+)'~30b99791e52c3f0cb32601c5b8f57cc7~
"

/etc/grub.d/proxifiedScripts / *
A parte relevante de /etc/grub.d/proxifiedScripts/memtest86+ é esta:

    [..]
    cat << EOF
if [ "\${grub_platform}" == "pc" ]; then
    menuentry "Memory Tester (memtest86+)" ${CLASS} {
        search --fs-uuid --no-floppy --set=root ${_GRUB_MEMTEST_HINTS_STRING} ${_GRUB_MEMTEST_FS_UUID}
        linux16 ${_GRUB_MEMTEST_REL_PATH} ${GRUB_CMDLINE_MEMTEST86}
    }
fi
EOF
[..]

O arquivo em si é um script de shell, mas tem as instruções "cat". Estes imprimem os fragmentos do script de shell que devem finalmente entrar em /boot/grub/grub.cfg . Com algumas modificações, talvez.

No /boot/grub/grub.cfg.new , observamos que o material "menuentry ..." está realmente ausente e, em vez disso, obtemos um bloco then..fi vazio. Por que o "menuentry ..." desaparece, eu não sei. Talvez o grub pense que não é necessário. Infelizmente, a remoção quebra o script.

Solução alternativa

O truque / solução alternativa era adicionar dois pontos neste arquivo, assim:

if [ "\${grub_platform}" == "pc" ]; then
    :
    menuentry "Memory Tester (memtest86+)" ${CLASS} {
        search --fs-uuid --no-floppy --set=root ${_GRUB_MEMTEST_HINTS_STRING} ${_GRUB_MEMTEST_FS_UUID}
        linux16 ${_GRUB_MEMTEST_REL_PATH} ${GRUB_CMDLINE_MEMTEST86}
    }

Ao executar update-grub, isso gera um grub.cfg com a solução descrita acima.

Histórico / Mais investigação

A pasta /etc/grub.d/ no meu sistema na verdade continha dois arquivos para memtest86 + _proxy: 60_memtest86+_proxy e 62_memtest86+_proxy . Eu suponho que um deles é uma sobra de algum tipo. Mas os dois têm o mesmo registro de data e hora atualizado, então eu realmente não sei qual deles seria seguro excluir. Um diff mostra isso:

--- /etc/grub.d/60_memtest86+_proxy 2015-01-08 15:54:02.228927526 +0100
+++ /etc/grub.d/62_memtest86+_proxy 2015-01-08 15:54:02.228927526 +0100
@@ -1,6 +1,6 @@
 #!/bin/sh
 #THIS IS A GRUB PROXY SCRIPT
-'/etc/grub.d/proxifiedScripts/memtest86+' | /etc/grub.d/bin/grubcfg_proxy "+*
-+#text
--'Memory Tester (memtest86+)'~30b99791e52c3f0cb32601c5b8f57cc7~
+'/etc/grub.d/proxifiedScripts/memtest86+' | /etc/grub.d/bin/grubcfg_proxy "+'Memory Tester (memtest86+)'~30b99791e52c3f0cb32601c5b8f57cc7~
+-*
+-#text
 "
\ No newline at end of file

Portanto, ambos os arquivos referem-se ao mesmo script com proxy, mas o resultado é canalizado através do binário grubcfg_proxy, com parâmetros diferentes. Esses diferentes parâmetros podem ser responsáveis pela remoção do material "menuentry ..." no caso do 60_memtest86+_proxy .

Conclusão

Outros podem ter problemas completamente diferentes. Mas a resolução de problemas, pelo menos os primeiros passos, deve ser bastante semelhante.

    
por 12.06.2015 / 06:29
0

Grandes etapas de solução de problemas de @donquixote (+1 upvote).

Para minha situação, o erro foi porque eu não tinha definido a partição dev / Ubuntu para o Ubuntu, quando eu reordenei minhas opções de menu para uma configuração de inicialização dupla do Windows / Ubuntu.

O que me ajudou foi mover uma opção de menu para cima e para baixo na lista no menu grub-customizer e observar o número da linha do erro de sintaxe alterado, assim, seria de se saber que a opção precisava de mais atenção. / p>     

por 01.09.2018 / 17:39

Tags