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.