通過腳本創建雙分區 SD 卡映像
我有一個生成嵌入式 Linux 系統的系統。系統輸出三個文件:
- 包含 rootfs 的 tarball,不包括核心模組
- 包含核心模組的 tarball
- uImage
該系統部署在 1 GB SD 卡上,其中 10 MB 分配給 FAT 引導分區,其餘分配給 ext4 根分區。
系統的最佳輸出格式是可以使用 dd 寫入 SD 卡的圖像文件。現在,該映像文件是通過手動對 SD 卡進行分區和格式化、提取/複製其上的文件然後使用 dd 讀取卡的內容來創建的。它有效,但過程可能會容易得多。
我知道可以創建一個代表卡的循環文件系統,在其上創建文件系統,然後提取/複製它們上的文件。我已經嘗試過了,它在某種程度上有效,但還不夠好。問題似乎與 SD 卡的分區和“幾何”(如硬碟的幾何,據我所知,在儲存卡的情況下無關緊要)有關,如如果分區應該特定於卡的型號,但我在該領域的專家還不夠多說。
從兩個 tarball 和 uImage 到可以使用 dd 複製到 SD 卡上的圖像的正確方法是什麼?
如果您確定 SD 卡的大小始終與您實際擁有的相同(或更大),並且 1G 足以滿足您想要複製的內容,您可以按照以下步驟進行操作:
- 手動對適當的 SD 卡進行分區,但將分區留空(但在其上創建所需的文件系統)
- 將整個 SD 卡(例如
/dev/sdb
)複製到您的系統dd if=/dev/sdb of=empty.image bs=4M
- 每次必須創建新 SD 卡時,將空圖像複製到新圖像:
cp empty.image new.image
- 現在在該文件上創建一個循環設備:(
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 sfdisk
或https://superuser.com/questions/332252/creating-and-formating-a-partition-using-a- bash腳本)。這意味著:創建空文件 (sa),創建循環設備(無分區,無-P
),將該設備分區sfdisk
,分離循環設備,重新連接循環設備(帶分區-P
)並繼續。