---
# System prepended metadata

title: 'Note: after restoring image-file via dd command, remember to repair the disk (main partition table)'
tags: [disk partiton, GPT, linux, Dev, note, file system]

---

Note: after restoring image-file via dd command, remember to repair the disk (main partition table) 
=================================================================================

Issue description
---------------------------------------------------------------------------------
使用dd command將製作好的OS image file還原至USB時，發現無法使用也無法掛載的情況，如下：
![image](https://hackmd.io/_uploads/BJpWEvwd0.png)


Root cause analysis
---------------------------------------------------------------------------------
### 使用gdisk分析
安裝
Command: `sudo apt install gdisk`

執行
Command: `sudo gdisk /dev/"target disk"`
![image](https://hackmd.io/_uploads/Hk3Iutw_C.png)

根據圖中訊息可以得到以下訊息：
![image](https://hackmd.io/_uploads/S1fMODjdC.png)
`重要：備份分割表標頭檔無效用，然而其主要分割標頭檔有效；從主要分割表中重新生成主要分割標頭檔`
`警告：主要分割表與備份分割表並不一致`

判斷是使用dd command進行檔案還原時，**會出現主要分割表並未寫入的狀況**，導致無法識別分割磁區，進而無法掛載並操作；而備份分割表因為分別寫入多個區塊（block），故能夠成功寫入
主要分割表/備份分割表/主要磁區關係如下：
![image](https://hackmd.io/_uploads/SyQ4Bco_C.png)

生成主要磁區標頭檔流程如下：
```flow
  start=>start: 執行gdisk，發現主要分割標頭檔有效，而備份分割標頭檔無效
  cache_1=>operation: 讀取主要分割標頭檔（舊）->主要分割表
  cache_2=>operation: 讀取備份分割標頭檔（新）->備份分割表
  cache_3=>operation: 比對主要（舊）/備份（新）分割表（CRC）
  if_loop=>condition: 是否一致？
  yes=>operation: 自動再生成主要分割標頭檔
  no=>operation: 提示訊息：需要修補主要分割標頭檔/主要分割表（舊->新）
  end=>end: 自動生成/修補後生成主要分割並讀取磁區
  
  start->cache_1->cache_2->cache_3->if_loop
  if_loop(yes)->yes
  if_loop(no)->no
  no->end
  yes->end
  if_loop->end
  
 ```
 根據以上流程圖可以得知，**USB中的主要分割標頭檔/主要分割表，還是維持在執行dd command之前的狀態**，所以產生錯誤



Issue recurrence
---------------------------------------------------------------------------------
### 製作一OS USB，模擬GPT分割表缺損的狀況（sdb）
![image](https://hackmd.io/_uploads/Skgu-DPuA.png)

### 使用dd command還原image file
command: `dd bs=512 if=/path to image.img/ of=/path to target USB/`
![image](https://hackmd.io/_uploads/HkSCNDvdR.png)

### 製作完成，因為GPT分割表缺損，無法掛載
![image](https://hackmd.io/_uploads/rJfJ4PwdR.png)
![image](https://hackmd.io/_uploads/BJpWEvwd0.png)

Solution
---------------------------------------------------------------------------------

### 使用gdisk修復

執行
command: `sudo gdisk /dev/"target disk"`
![image](https://hackmd.io/_uploads/Hk3Iutw_C.png)

### 選擇"r"進入修復選項
輸入"?"提示符可詳列出所有選項
![image](https://hackmd.io/_uploads/H1RbK9wO0.png)

### 輸入"b"提示符以選擇"載入備份GPT分割表標頭檔（重建主要分割表）"，再輸入"w"寫入指令
選擇"Y"提示符確認
![image](https://hackmd.io/_uploads/B1lphqcPOR.png)

### 修復完成，重新啟動後使用
![image](https://hackmd.io/_uploads/rJygjcvOR.png)


Result
---------------------------------------------------------------------------------
可辨識和掛載磁區
![image](https://hackmd.io/_uploads/BJtzyowdR.png)

Ref.
---------------------------------------------------------------------------------

[gdisk command](https://github.com/eZioPan/Learning_Linux/blob/markdown/07%E8%A1%A52%E3%80%81gdisk%20%E5%91%BD%E4%BB%A4.adoc)
[gdisk command in chinese](https://www.cnblogs.com/ywb123/p/17483703.html)
[Details about GPT & MBR](https://www.h1ya.com/mbr%E5%92%8Cgpt%E5%88%86%E5%8C%BA%E8%A1%A8%E7%9A%84%E7%BB%93%E6%9E%84%E5%8F%8A%E6%81%A2%E5%A4%8D%E6%96%B9%E6%B3%95)
[GUID Partition Table (GPT) Disk Layout](https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html)
[Retrieve data from disk after dd](https://askubuntu.com/questions/1376645/retrieve-data-from-disk-after-dd)