---
# System prepended metadata

title: 'Note: How to fix issue "system bootloader not found error"'
tags: [linux, SOP, Dev]

---

Note: How to fix issue "system bootloader not found error"
=================================================================================

Overview:
---------------------------------------------------------------------------------

因應需求，製作完畢一可攜式OS-USB（ubuntu）後，出現UEFI無法順利導引至boot loader，進而導致開機失敗（進入UEFI Shell），如下圖：

![image](https://hackmd.io/_uploads/Sykotjku0.png)


Root cause analysis
---------------------------------------------------------------------------------

### 開機流程（以LINUX為例）：

```flow
  start=>start: 系統通電
  cache_1=>operation: 硬體自檢並初始化，BMC開始介入
  cache_2=>operation: 載入BIOS
  cache_3=>operation: 載入EFI system partition和bootloader (UEFI)
  if_loop=>condition: 是否成功？
  yes=>operation: 載入GRUB並解壓縮initrd
  no=>operation: UEFI shell
  end=>end: 載入Kernel，進入OS
  
  start->cache_1->cache_2->cache_3->if_loop
  if_loop(yes)->yes
  if_loop(no)->no
  no->cache_2
  yes->end
  if_loop->end
  
 ```
根據上圖，如在載入EFI system partition（ESP）失敗，則會進入UEFI shell或是退回BIOS，甚至進入無限迴圈，與當前狀況大致符合，於是產生兩個假設：
 - **無法正確辨認ESP**
 - **無法正確辨認bootloader所導致**

第一個假設的請況下，解決方案相當簡單：
重新製作一個USB系統碟，並在安裝階段多切割一塊partition，供存放initrd和kernel文件；也就是將/boot路徑下的config獨立存放，issue is fixed！！
如圖：
1. ![image](https://hackmd.io/_uploads/BylGbCyuA.png)
2. ![image](https://hackmd.io/_uploads/Hyhv-AJOA.png)
3. ![image](https://hackmd.io/_uploads/BkV9fR1d0.png)
然而這樣出現兩個問題：
 - 以往製作的、釋出的系統碟工具，都可能面臨重工的問題
 - 這次的系統碟工具，客戶方有可能需要在"不啟動"情況下存入/修改內部設置文件，而安裝當初，第三個partition增加了lvm2，不僅增加掛載的複雜度，更有掛載失敗的可能性

於是嘗試從第二個假設著手：分析/修改bootloader
最初構思的解法也是如此，並參照了以下方法：
[Fix bootloadder](https://forum.zorin.com/t/how-to-fix-system-bootorder-not-found-error/4903)
然而失敗，經過分析的結果，確定bootloader有以下檔案：
 - BOOTX64.CSV
 - grub.cfg
 - mmx64.efi
 - shimix64.efi
 - grubx64.efi
其中，grub.cfg載明關於grub的各類參數，與此案較無關係
![image](https://hackmd.io/_uploads/r1GUglguC.png)

workflow如下：
``` mermaid
graph TD;
Boot_flow-->初次開機;
Boot_flow-->第二次包含以後開機;
初次開機-->/EFI/ubuntu/shimix64.efi;
第二次包含以後開機-->/EFI/BOOT/BOOTX64.efi;
/EFI/ubuntu/shimix64.efi-->/EFI/ubuntu/grubx64.efi-->執行GRUB;
/EFI/ubuntu/shimix64.efi-->修改BOOTX64.CSV;
/EFI/ubuntu/shimix64.efi-->在/EFI/BOOT/產生BOOTX64.efi
/EFI/BOOT/BOOTX64.efi-->執行GRUB;
```
其中，修改BOOTX64.CSV的部份是將路徑預設值修改成/EFI/BOOT/BOOTX64.efi
在分析檔案結構時，發現是：**自動生成的BOOTX64.efi無法被正確識別**；然而在UEFI shell底下可以順利執行grubx64.efi並進入OS，所以解決方案如下：
**將自動產生之BOOTX64.EFI刪除後，將grubx64.efi複製到/EFI/BOOT/，並命名為BOOTX64.EFI**

附圖是可順利開機和無法順利開機之兩組系統碟目錄結構比較：
 - 可順利開機：![](https://hackmd.io/_uploads/S1ECCPRDR.png)
 - 無法順利開機：![](https://hackmd.io/_uploads/SJXWy_CvC.png)

（經實驗證明，與檔案大小寫無關連，所以單純修改檔名並無效用；BOOT.bak是筆者建立的備份資料夾，並非自然產生）

Commands
---------------------------------------------------------------------------------
### commands
修改指令如下，可先建立備份資料夾（BOOT.bak）以防誤刪檔案：
command: `cp /boot/efi/EFI/BOOT* /boot/efi/EFI/BOOT.bak`
command: `rm /boot/efi/EFI/BOOT/*`
command: `cp /boot/efi/EFI/BOOT.bak/fbx64.efi /boot/efi/EFI/BOOT/`
command: `cp /boot/efi/EFI/BOOT.bak/mmx64.efi /boot/efi/EFI/BOOT/`
command: `cp /boot/efi/EFI/ubuntu/fbx64.efi /boot/efi/EFI/BOOT/BOOTX64.efi`

執行擷圖：
![image](https://hackmd.io/_uploads/rk7UZdAD0.png)

之後斷電，重新使用調整完畢的系統碟開機即可


Ref.
---------------------------------------------------------------------------------
[Fix bootloader](https://forum.zorin.com/t/how-to-fix-system-bootorder-not-found-error/4903)
[initrd & initramfs](https://blog.csdn.net/kwdecsdn/article/details/129151631?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-129151631-blog-51438638.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.1&utm_relevant_index=1)
[GRUB 2](https://ostechnix.com/configure-grub-2-boot-loader-settings-ubuntu-16-04/)
[開機流程](http://www.xionglilong.com/ubuntu/ubuntu-base/boot.html)
[The correlation between EFI、boot loading config & linux distribution](https://www.cnblogs.com/feipeng8848/p/10723661.html)
[bootOrder not found](https://askubuntu.com/questions/1255826/system-bootorder-not-found-initializing-defaults)