Linux

創建分區的映像(僅已使用空間)

  • May 5, 2021

我有一個sdb1大小為 3.3 GB 的分區。從 3.3 GB 開始,僅使用 1.9 GB,而 1.2 GB 是一個空白空間。我想創建這個分區的圖像。但我希望圖像只有已用空間,即 1.9 GB

現在,當我使用 dd 執行命令時:

dd if=/dev/sdb1 of=/home/data/Os.img bs=1M status=progress

我看到 dd 正在製作 3.3 GB 的圖像的行為雖然我不希望未分配的空間成為作業系統圖像的一部分。

所以我嘗試了不同的解決方案。我找到了一種解決方案:

dd if=/dev/sdb1 of=/home/data/OS.img bs=1M count=1946 status=progress

這個解決方案創建了一個 1.9 GB 的圖像,因為我定義了一個 1M 的塊大小,計數為 1946,總共將提供 1.9 GB。

問題 我無法確定這個 dd 命令是只製作了已用空間的映像,還是只創建了一個大小為 1.9 GB 的映像,其中既有已用空間也有未使用空間?

還有其他方法可以僅為已用空間創建圖像嗎?

這已經回答here

首先製作分區的圖像。

然後使用 losttup 掛載鏡像。由於它不是磁碟而是分區,因此您不需要 partscan 標誌。

# lsblk
# losetup --find foo.img

查找新創建的循環設備

# lsblk
loop1    7:1    0   4096M  0 loop 

通過寫入一個大的空文件將剩餘空間清零。

# mount /dev/loop1 /mnt
# dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
# rm /mnt/filler
# umount /dev/loop1

現在壓縮圖像。

# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz

到目前為止,對於分區映像。

如果分區上有 ext4 文件系統,您可以使用resize2fs將其調整為最小大小。這會將所有數據移動到第一個塊。

e2fsck -f /dev/loop1
resize2fs -M /dev/loop1

您可以使用Clonezilla並創建一個 Clonezilla 映像,這是一個包含一組文件的目錄,其中最大的文件被壓縮。Clonezilla 足夠聰明,可以僅從分區中複製標記為已被文件系統使用的塊,這使得它比dd. 這也意味著映像將比同時複製可用驅動器空間時更小。

但是當你將鏡像的內容還原到一個分區時,目標必須是一個分區

$$ at least $$大小相同,因此如果您希望還原操作後目標的大小更小,則必須使用另一種方​​法。


如果您希望在映像和還原操作之後分區的大小更小,您應該在文件級別工作。你可以

  • 創建一個壓縮包,一個

$$ compressed $$整個文件系統的tarfile,

  • 使用所需大小的文件系統創建新分區
  • 從 tarball 中提取包含所有文件的目錄樹。

從另一個作業系統啟動,使要複製的分區處於非活動狀態,並tar以提升的權限執行,例如

  • 將目錄更改為要複製的分區的頂部
sudo tar -cvzf /path-to/file.tar.gz .

當您恢復時(也從另一個作業系統啟動)

  • 將目錄更改為要從 tarfile 中提取的分區的頂部
sudo tar -xvf /path-to/file.tar.gz

請注意此結果與複製操作結果之間的重要區別,

  • 分區的 UUID 會有所不同。如果複製的分區包含系統分區,則必須將 UUID 更改為原始分區的 UUID,或者更改對 UUID 的引用/etc/fstab/boot/grub/grub.cfg匹配新的 UUID。

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