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