Ubuntu

update-grub 上 grub.cfg 中的語法錯誤

  • November 29, 2020

我執行 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.

/boot/grub/grub.cfg.new按照建議檢查了第 159 行的文件,這是與該行及其周圍環境相對應的程式碼段:

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"{它永遠不會關閉它的“{”,但我無法找到它的來源……

我已經嘗試過執行引導修復(如this answer GRUB error: syntax error.error: Incorrect command中所建議的那樣),但要求啟動的第一個命令是: sudo chroot "/mnt/boot-sav/mapper/isw_cbgbbifgbg_Volume1p2" dpkg --configure -a 它給了我同樣的語法錯誤問題。

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可能已經以某種方式無序生產了。

引用自:https://unix.stackexchange.com/questions/622012