作為碼農
首先,建議了解下grub2的啟動順序和邏輯。可以參考這篇文章,grub.cfg詳解。
從執行順序倒推,如下如果全部執行成功,則會進入grub的啟動菜單;如果最后一步,沒有找到grub.cfg或者執行grub.cfg出錯,則進入grub普通模式;如果倒數第二步,家在normal.mod模塊失敗,則進入grub secure模式。
GRUB2在BIOS平台上的常規啟動步驟是這樣的:BIOS --> boot.img[MBR] --> core.img[MBR gap/embedding area/BIOS Boot Partition] --> 設置"prefix root cmdpath"環境變量 --> 加載"normal.mod"模塊[同時還包括它所依賴的 terminal crypto extcmd boot gettext 模塊] --> 執行"normal $prefix/grub.cfg"命令
GRUB2在UEFI平台上的常規啟動步驟是這樣的:UEFI --> core.img[BOOTX64.EFI/BOOTX86.EFI] --> 設置"prefix root cmdpath"環境變量 --> 加載"normal.mod"模塊[同時還包括它所依賴的 terminal crypto extcmd boot gettext 模塊] --> 執行"normal $prefix/grub.cfg"命令
這里我們分別介紹兩種模式下的解決方式:
- Grub普通模式
- 手動引導進入系統
- ls 可以看到形如 (hd0, gpt2)之類的硬盤分區, ls (hd0,gpt2)/root/之類的可以看到文件系統結構;
- 找到要啟動的系統路徑,主要是grub目錄、vmlinux、initrd,如下圖
-
# ll /boot/ 總用量 135336 drwxr-xr-x 4 root root 4096 7月 10 22:22 ./ drwxr-xr-x 24 root root 4096 7月 10 22:20 ../ -rw-r--r-- 1 root root 1536934 4月 24 12:56 abi-4.15.0-20-generic -rw-r--r-- 1 root root 1537050 5月 24 00:54 abi-4.15.0-23-generic -rw-r--r-- 1 root root 216807 4月 24 12:56 config-4.15.0-20-generic -rw-r--r-- 1 root root 216807 5月 24 00:54 config-4.15.0-23-generic drwxr-xr-x 3 root root 4096 1月 1 1970 efi/ drwxr-xr-x 5 root root 4096 8月 5 07:38 grub/ -rw-r--r-- 1 root root 55988734 7月 10 22:20 initrd.img-4.15.0-20-generic -rw-r--r-- 1 root root 53910349 7月 10 22:22 initrd.img-4.15.0-23-generic -rw-r--r-- 1 root root 182704 1月 28 2016 memtest86+.bin -rw-r--r-- 1 root root 184380 1月 28 2016 memtest86+.elf -rw-r--r-- 1 root root 184840 1月 28 2016 memtest86+_multiboot.bin -rw-r--r-- 1 root root 0 4月 24 12:56 retpoline-4.15.0-20-generic -rw-r--r-- 1 root root 0 5月 24 00:54 retpoline-4.15.0-23-generic -rw------- 1 root root 4038188 4月 24 12:56 System.map-4.15.0-20-generic -rw------- 1 root root 4039393 5月 24 00:54 System.map-4.15.0-23-generic -rw-r--r-- 1 root root 8249080 4月 27 10:40 vmlinuz-4.15.0-20-generic -rw------- 1 root root 8257272 5月 24 01:49 vmlinuz-4.15.0-23-generic
-
- 設置grub boot環境,其中root的地址為要啟動的linux系統(如Ubuntu)所在的硬盤分區節點名。hd0對應sda,hd1對應sdb,以此類推。。。(hd0,gpt1)對應sda1,(hd1, gpt2)對應sdb2以此類推。。。
-
grub> set boot=(hd0,gpt2) grub> linux /boot/vmlinuz-4.15.0-23-generic root=/dev/sda2 grub> initrd /boot/initrd.img-4.15.0-23-generic
grub> boot
-
- 修復引導
- 一般為了避免進入系統后,下次再進入還要輸入以上命令,可以用如下方法
-
# sudo update-grub # sudo grub-install /dev/sda
-
- 然而我發現,這個方式在我的case里不生效,嘗試找下根本原因
- 一般為了避免進入系統后,下次再進入還要輸入以上命令,可以用如下方法
- 手動引導進入系統
- Grub Secure模式
- 手動引導進入系統, LInk
- 修復引導
