Синтаксическая ошибка в grub.cfg в update-grub (Grub 2) (memtest86 +)

Необходимо выполнить команду в ее собственном экземпляре оболочки.

nohup sh -c 'nc -l -p 4000  | dd of=/home/myname/test.txt 2>/run/user/myname/stderr  1>/run/user/myname/stdout' &
3
17.06.2015, 10:45
5 ответов

Для меня это был очень конкретный ответ, но я хочу объяснить в более общем виде, как это устранять.

На самом деле большая часть информации уже содержится в сообщении об ошибке, но сначала для меня это было неочевидно.

Вкратце:

  • Следуйте за номером строки в /boot/grub/grub.cfg.new. Попытайтесь понять, почему то, что вы обнаружите, является синтаксической ошибкой.
  • Следуйте за комментарием в этом файле, который указывает либо на / etc / default / grub, либо на конкретный файл в / etc / grub / *.
  • В случае прокси-скрипта следуйте подсказке к файлу в /etc/grub.d/proxifiedScripts/ .

Действия по устранению неполадок, подробно

/boot/grub/grub.cfg автоматически создается в «update-grub» на основе ряда файлов: / etc / default / grub и любые файлы в /etc/grub.d / * .

/boot/grub/grub.cfg.new
Однако в случае синтаксической ошибки (или любой другой, я полагаю) исходный /boot/grub/grub.cfg НЕ перезаписывается, а вместо этого создается новый файл в /boot/grub/grub.cfg.new .

Сообщение об ошибке содержит номер строки, в моем случае 262, которая относится к этому файлу /boot/grub/grub.cfg.new . В моем случае это было 262. Посмотрев файл, я обнаружил следующее:

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

Я узнал, что пустой блок if / then / fi в сценарии оболочки недопустим, поэтому это была синтаксическая ошибка. Довольно глупый дизайн языка imo, но так оно и есть.

Я также нашел исправление, которое заключается в добавлении в блок бессмысленного оператора. Предлагалось двоеточие, но могли быть и другие решения.

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

Еще лучше было бы полностью удалить этот бессмысленный блок.

Сейчас мы действительно не хотим редактировать этот файл вручную, потому что изменения будут стерты при следующем update-grub (в случае успеха, что является целью).

/etc/grub.d / *
Фрагмент кода содержит подсказку, где искать дальше: /etc/grub.d/60_memtest86+_proxy . В этом файле написано:

#!/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 / *
Соответствующая часть /etc/grub.d/proxifiedScripts/memtest86+ такова:

    [..]
    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
[..]

Сам файл сценарий оболочки, но в нем есть "кошачьи" операторы. Они печатают фрагменты сценария оболочки, которые в конечном итоге должны войти в /boot/grub/grub.cfg . Возможно, с некоторыми изменениями.

В /boot/grub/grub.cfg.new мы видим, что элемент «menuentry ...» фактически отсутствует, и вместо этого мы получаем пустой блок then..fi. Почему пропадает "menuentry ...", я не знаю.Может grub думает, что это не нужно. К сожалению, удаление ломает скрипт.

Обходной путь

Трюк / обходной путь заключался в добавлении двоеточия в этот файл, например:

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}
    }

При запуске update-grub генерируется grub.cfg с обходным путем, описанным выше.

Предпосылки / Дополнительные исследования

Папка /etc/grub.d/ в моей системе фактически содержала два файла для memtest86 + _proxy: 60_memtest86 + _proxy и 62_memtest86 + _proxy . Я предполагаю, что один из них - что-то вроде пережитка. Но у них обоих одна и та же обновленная временная метка, поэтому я действительно не знаю, какие из них можно было бы безопасно удалить. Отличие показывает следующее:

--- /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

Итак, оба файла относятся к одному и тому же проксифицированному сценарию, но результат передается через двоичный файл grubcfg_proxy с разными параметрами. Эти различные параметры могут быть ответственны за удаление материала «menuentry ...» в случае 60_memtest86 + _proxy .

Заключение

У других могут быть совершенно другие проблемы. Но поиск и устранение неисправностей, по крайней мере, первые шаги, должны быть очень похожими.

4
27.01.2020, 21:14

Спасибо, это действительно помогло мне.

В моем случае это был тот самый файл/etc/grub.d/proxifiedScripts/custom

Я попытался создать собственный скрипт с помощью grub-customizerдля загрузки Prime OS из каталога в корневом каталоге.

Я удалил файл, затем команда update-grubвыполнена без ошибок затем я перегенерировал пользовательский скрипт, используя grub-customizer, и он работает хорошо.

2
27.01.2020, 21:14

У меня была такая же проблема с Xubuntu 18.04, но я не смог найти ничего неправильного в файлах /etc/default/grub или /etc/grub.d

Так как я смог получить доступ к системе, несмотря на ошибку, мне не пришлось входить в нее через chroot, что будет необходимо, если вы не можете загрузиться в систему. Что я сделал, так это очистил и переустановил grub, что помогло.

Я использовал следующие шаги:

  1. Я подтвердил, что у меня есть интернет-соединение сsudo apt-get update # ***
  2. Я удалил личинку -pc и личинку -вместе сsudo apt-get purge grub-pc grub-common
  3. Я прочитал предупреждение об удалении загрузчика, нажал TAB , чтобы выделить «», и нажал ENTER .
  4. Я ввел команду apt-get install grub-common grub-pcи при появлении запроса нажал TAB , чтобы выделить «», и нажал ENTER
  5. При появлении варианта устройства я использовал клавиши UP/DN для выбора правильного диска (sdX ), НЕ являющегося разделом.

    Я убедился, что рядом с установочным диском [ ] /dev/sdX стоит звездочка (в моем случае :[ ] /dev/sda ). Если это не так, выделите его и нажмите клавишу ПРОБЕЛ, чтобы выбрать его. Затем я нажал TAB , чтобы выделить «», и нажал ENTER

    .

    Я проверил, что установка завершена и работает, введя команду sudo update-grub, и все работало без ошибок, как и ожидалось.

Источники:https://ubuntuforums.org/showthread.php?t=1581099

0
27.01.2020, 21:14

Согласно ответу @donquixote -у меня также были точно такие же файлы 60_memtest86+_proxyи 62_memtest86+_proxyв /etc/grub.d/. Запуск update-grubпривел к синтаксическим ошибкам в моем /boot/grub/grub.cfg, который читал:

### BEGIN /etc/grub.d/~60_memtest86+_proxy ###

if [ "${grub_platform}" == "pc" ]; then

fi
### END /etc/grub.d/~60_memtest86+_proxy ###

### BEGIN /etc/grub.d/62_memtest86+_proxy ###
menuentry "Memory Tester (memtest86+)" --class memtest86 --class gnu --class tool {
        search --fs-uuid --no-floppy --set=root --hint-ieee1275='ieee1275//disk@0,gpt5' --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  afa594f4-80a8-4a18-8df5-53d58be8651a
        linux16 /boot/memtest86+/memtest.bin 
}
### END /etc/grub.d/62_memtest86+_proxy ###

Чтобы решить эту проблему, я просто удалил 60_memtest86+_proxy, который создавал пустой оператор if. Это наконец заставило update-grubработать.

2
27.01.2020, 21:14

В Manjaro Linux я столкнулся с той же проблемой. Я получил намек на свое исправление, прочитав самый популярный ответ @donquixote.

Отредактируйте файл /etc/grub.d/proxifiedScripts/memtest86+и добавьте :между последним блоком if

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

Затем запустите sudo update-grub, и он должен завершиться успешно.

0
29.03.2020, 02:57

Теги

Похожие вопросы