update-grub 上的 grub.cfg 中存在语法错误

update-grub 上的 grub.cfg 中存在语法错误

我运行 Ubuntu 20.04,当我执行update-grub命令时出现此错误:

root@ubuntu:/# update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Création du fichier de configuration GRUB…
Image Linux trouvée : /boot/vmlinuz-5.8.0-25-generic
Image mémoire initiale trouvée : /boot/initrd.img-5.8.0-25-generic
Image Linux trouvée : /boot/vmlinuz-5.4.0-53-generic
CentOS Linux 8 (Core) trouvé sur /dev/sdb9
Image Linux trouvée : /boot/vmlinuz-5.8.0-25-generic
Image mémoire initiale trouvée : /boot/initrd.img-5.8.0-25-generic
Image Linux trouvée : /boot/vmlinuz-5.4.0-53-generic
CentOS Linux 8 (Core) trouvé sur /dev/sdb9
Image Linux trouvée : /boot/vmlinuz-5.8.0-25-generic
Image mémoire initiale trouvée : /boot/initrd.img-5.8.0-25-generic
Image Linux trouvée : /boot/vmlinuz-5.4.0-53-generic
Image Linux trouvée : /boot/vmlinuz-5.8.0-25-generic
Image mémoire initiale trouvée : /boot/initrd.img-5.8.0-25-generic
Image Linux trouvée : /boot/vmlinuz-5.4.0-53-generic
CentOS Linux 8 (Core) trouvé sur /dev/sdb9
Image Linux trouvée : /boot/vmlinuz-5.8.0-25-generic
Image mémoire initiale trouvée : /boot/initrd.img-5.8.0-25-generic
Image Linux trouvée : /boot/vmlinuz-5.4.0-53-generic
Adding boot menu entry for UEFI Firmware Settings
erreur : syntax error.
erreur : Incorrect command.
erreur : syntax error.
erreur : Incorrect command.
erreur : syntax error.
Erreur de syntaxe à la ligne 159
Des erreurs de syntaxe sont détectées dans le fichier de configuration
de GRUB. Veuillez vérifier qu'il n'y a pas d'erreur dans les fichiers
/etc/default/grub et /etc/grub.d/*. Sinon veuillez signaler un bogue
en joignant le fichier /boot/grub/grub.cfg.new.

我按照建议检查了第 159 行的文件/boot/grub/grub.cfg.new,下面是与该行及其周围环境相对应的代码片段:

152 ### END /etc/grub.d/31_linux_xen ###
153 
154 ### BEGIN /etc/grub.d/34_memtest86+ ###
155 ### END /etc/grub.d/34_memtest86+ ###
156 
157 ### BEGIN /etc/grub.d/35_os-prober_proxy ###
158 submenu "Options avancées pour Ubuntu"{
159 function gfxmode {
160         set gfxpayload="${1}"
161         if [ "${1}" = "keep" ]; then
162                 set vt_handoff=vt.handoff=7
163         else
164                 set vt_handoff=
165         fi
166 }
167 if [ "${recordfail}" != 1 ]; then
168   if [ -e ${prefix}/gfxblacklist.txt ]; then
169     if hwmatch ${prefix}/gfxblacklist.txt 3; then
170       if [ ${match} = 0 ]; then
171         set linux_gfx_mode=keep
172       else
173         set linux_gfx_mode=text
174       fi
175     else
176       set linux_gfx_mode=text
177     fi
178   else
179     set linux_gfx_mode=keep
180   fi
181 else
182   set linux_gfx_mode=text
183 fi
184 export linux_gfx_mode

我可以看到第 158 行似乎有一个问题,submenu "Options avancées pour Ubuntu"{它永远不会关闭它的“{”,但我无法找到它来自哪里......

我已经尝试运行启动修复(正如这个答案所建议的那样)GRUB 错误:语法错误。错误:命令不正确)但要求启动的第一个命令是: sudo chroot "/mnt/boot-sav/mapper/isw_cbgbbifgbg_Volume1p2" dpkg --configure -a 它给了我同样的语法错误问题。

答案1

update-grub命令执行grub-mkconfig -o /boot/grub/grub.cfg "$@"后,又执行目录中的脚本/etc/grub.d/。这些脚本创建 的内容grub.cfg,以及注释行,例如

### BEGIN /etc/grub.d/35_os-prober_proxy ###

将指示哪个脚本负责grub.cfg文件的每个部分。

对于您的情况,您可能应该研究该/etc/grub.d/35_os-prober_proxy脚本,以及目录中紧随其后的脚本(按默认的 ASCII 字母数字排序顺序)。

另一方面,在我的 Debian 10 系统中,该function gfxmode {行是 输出的一部分/etc/grub.d/10_linux,它负责生成普通的 Linux 启动项,然后还有另一个脚本20_linux_xen为 Xen 风格的虚拟化创建启动项(如果已安装),并且然后30_os-prober检测并添加其他操作系统的启动项。显然 Ubuntu 的做法有些不同,但这让我怀疑某些部分grub.cfg可能是在某种程度上被乱序生产的。

答案2

  • 德比安特里克西
  • grub 定制器 5.2.3

跑步:

sudo cp /boot/grub/grub.cfg.new /. # put your home path here
sudo rm /boot/grub/grub.cfg.new
grub-customizer 

然后按下恢复按钮(右上方位置)并应用。

相关内容