Filesystems

通過腳本創建雙分區 SD 卡映像

  • January 2, 2018

我有一個生成嵌入式 Linux 系統的系統。系統輸出三個文件:

  • 包含 rootfs 的 tarball,不包括核心模組
  • 包含核心模組的 tarball
  • uImage

該系統部署在 1 GB SD 卡上,其中 10 MB 分配給 FAT 引導分區,其餘分配給 ext4 根分區。

系統的最佳輸出格式是可以使用 dd 寫入 SD 卡的圖像文件。現在,該映像文件是通過手動對 SD 卡進行分區和格式化、提取/複製其上的文件然後使用 dd 讀取卡的內容來創建的。它有效,但過程可能會容易得多。

我知道可以創建一個代表卡的循環文件系統,在其上創建文件系統,然後提取/複製它們上的文件。我已經嘗試過了,它在某種程度上有效,但還不夠好。問題似乎與 SD 卡的分區和“幾何”(如硬碟的幾何,據我所知,在儲存卡的情況下無關緊要)有關,如如果分區應該特定於卡的型號,但我在該領域的專家還不夠多說。

從兩個 tarball 和 uImage 到可以使用 dd 複製到 SD 卡上的圖像的正確方法是什麼?

如果您確定 SD 卡的大小始終與您實際擁有的相同(或更大),並且 1G 足以滿足您想要複製的內容,您可以按照以下步驟進行操作:

  1. 手動對適當的 SD 卡進行分區,但將分區留空(但在其上創建所需的文件系統)
  2. 將整個 SD 卡(例如/dev/sdb)複製到您的系統dd if=/dev/sdb of=empty.image bs=4M
  3. 每次必須創建新 SD 卡時,將空圖像複製到新圖像:cp empty.image new.image
  4. 現在在該文件上創建一個循環設備:(losetup -f -P new.image-P重要,因為這將強制核心讀取分區資訊)。

這將創建一個新的循環設備(比如/dev/loop0和分區 /dev/loop0p1.../dev/loop0pn。這些現在可以像任何“普通”分區一樣安裝和使用。完成工作後,使用 .呼叫losetup -d /dev/loop0創建的圖像並將其複製到 SD 中dd if=new.image of=/dev/sdb bs=4M。所有這些步驟都可以進行。

編輯:

代替上面的 2) 和 3):

您也可以只複製分區塊(如果它是 MBR)並保留它(dd if=/dev/sdb of=empty_MBR bs=512 count=1);然後對於新的 SD,創建一個空文件 ( truncate -s 1G empty.file),它只是一個稀疏文件 (size=0),複製分區表 ( dd if=empty_MBR of=empty.file),創建循環設備 ( losetup -f -P empty.file),格式化分區,然後如上所示繼續。

編輯2:

如果您甚至不想保留小 MBR 文件,您也可以使用sfdisk腳本(參見man sfdiskhttps://superuser.com/questions/332252/creating-and-formating-a-partition-using-a- bash腳本)。這意味著:創建空文件 (sa),創建循環設備(無分區,無-P),將該設備分區sfdisk,分離循環設備,重新連接循環設備(帶分區-P)並繼續。

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