Dd

創建 SD 卡的磁碟映像時出現問題

  • May 27, 2022

我已經建構了一個分區大小為 3.1 GB 的 Armbian 自定義映像,現在我已經完成了它的工作。它目前被寫入使用 GUID 分區表 (GPT) 的可引導 64 GB SD 卡。

我的問題是,當我想使用 Ubuntu 製作卡的圖像時,我得到一個 63 GB 大小的圖像文件,但我不想要一個有 60 GB 空白空間的圖像文件。

我尋找通過使用truncate命令縮短圖像文件的其他方法,並使用創建圖像dd count=但它不起作用。當我使用dd它時,它會創建一個圖像文件,該文件在安裝時是所有“可用空間”和 PMBR,並truncate會破壞一個工作圖像文件。

所以(除非我做錯了),我怎樣才能創建一個包含啟動資訊的 SD 卡的 3 GB 映像?

truncate是一個很好的工具。您需要縮小映像,因此它包含分區表中定義的每個分區。換句話說,如果最接近末尾的分區的末尾扇區是N(注意它不一定是編號最高的分區),N+1則需要圖像的扇區(+1因為編號從 開始0)。

使用gdisk -l image來了解N.

該卡很可能使用 512 字節扇區,並且分區表在根據 512 字節扇區解釋時是有效的(為了比較:看看當這個假設不成立時會發生什麼)。所以你需要(N+1)*512字節(或更多,擁有更多並不是致命的)。truncate因此。

首先直接從卡中讀取這個字節數會給你同樣的結果。一種簡單的方法(儘管非 POSIX,請參閱)是head -c number-of-bytes-here /dev/sdx > image.

然後,您需要 33 個額外的邏輯扇區用於輔助(備份)GPT。再次使用truncate並將33*512字節添加到文件 ( truncate -s +16896 image)。truncate我們可以使用第一個(或使用 閱讀更多內容)將圖像縮小到所需的最終大小head,但是分兩步執行此操作會導致這額外的 33 個扇區包含零,而不是可能會立即乾擾的垃圾。

第一次截斷(或創建部分圖像)丟棄了原始的輔助 GPT。使用gdisk image並讓它解決問題。它會告訴你disk size is smaller than the main header indicatesinvalid backup GPT header, but valid main header; regenerating backup header from main header。多虧了第二個truncate,才有了備用 GPT 的空間。您只需要“將w表寫入磁碟並退出”;該工具將重寫 GPT,包括備份的。

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