Filesystems

將 .img 中的分區替換為另一個分區

  • December 31, 2014

我有 2 個 .img 文件(嵌入式 Linux 映像,每個都有 2 個分區 - 一個引導分區和一個 rootfs)。我需要將 rootfs 分區替換為另一個分區。

我怎樣才能做到這一點

  1. 直接在.imgs
  2. 將 .imgs 寫入 SD 卡。

如果答案包括命令,我將不勝感激。

首先確保您需要替換的分區至少與您要複製的分區大小相同。如果您的圖像文件壓縮,則可以使用kpartx.

跨磁碟映像複製文件系統

你需要 LVM2 才能工作。讓disk1.imgdisk2.img,假設在以下範例中兩個圖像的大小完全相同:

# Let device mapper detect partitions on disk images
kpartx -a disk1.img
kpartx -a disk2.img

# Unmount source and destination file systems
umount /dev/mapper/loop?p?

# Copy source file system to destination
dd if=/dev/loop1p2 of=/dev/loop0p2 bs=512
# or:
# cat dev/loop1p2 > /dev/loop0p2

# Remove device nodes
kpartx -d disk1.img
kpartx -d disk2.img

如果源文件系統較小,您將不得不擴展/dev/mapper/loop0p2使用resize2fs. 如果目標文件系統較小,那麼您必須使用您選擇的分區工具將源文件系統縮小到與目標文件系統*完全相同的大小。*我會推薦fdisk

編輯:當 SD 卡被檢測為/dev/mmcblk0(例如,假設目標是 SD 卡的第二個分區)時,您需要做的就是將文件系統從/dev/mapper/loop0p2例如復製到 SD 卡的第二個分區,例如/dev/mmcblk0p2

編輯:如果目標文件系統較小,則應縮小源文件系統以適應目標分區。

縮小源文件系統

假設已經添加了循環設備kpartx -a並且沒有安裝

# Check file systems block count and size
tune2fs -l /dev/mapper/loop0p2 | grep -E 'Block (count|size)'
tune2fs -l /dev/mapper/loop1p2 | grep -E 'Block (count|size)'

# Shrink source file system to fit the destination
# (FS check is mandatory before shrinking)
fsck -f /dev/mapper/loop1p2
resize2fs /dev/mapper/loop1p2 <loop0p2 block count>

# Proceed with file system copy...

resize2fs如果沒有足夠的塊來適應請求的大小,則會失敗(儘管我從未遇到過這種情況)。如果塊大小不同,您可以在傳遞新的文件系統大小時乘以並附加到<block count>結果<block size>B

# Example: 123456 blocks, 4096 bytes per block
resize2fs /dev/mapper/loop1p2 $((123456*4096))B

或者,您可以將源文件系統縮小到最小大小,然後擴展目標文件系統以適應其分區,不涉及計算:

resize2fs -M /dev/mapper/loop1p2
# Do the copy ...
resize2fs /dev/mapper/loop0p2

僅當無法進行操作時,要麼失敗。

您很可能會在複製操作結束時收到錯誤,因為源分區尚未調整大小。它通常不會造成傷害,因為核心不允許寫入超過分配的目標分區的末尾。

您可能需要非常小心並使用dd來限制要復製到目標分區大小的數據量(注意塊大小bs和“計數”)。我將把命令和參數留給你,因為你有一個有根據的猜測所需的一切;-)。

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