![Linux 上的壓縮磁碟映像](https://rvso.com/image/1267762/Linux%20%E4%B8%8A%E7%9A%84%E5%A3%93%E7%B8%AE%E7%A3%81%E7%A2%9F%E6%98%A0%E5%83%8F.png)
我剛買了一台配備更大硬碟的新電腦。我想我複製了所有重要文件,但為了確定,我想保留舊磁碟的磁碟映像。為了節省空間,我想壓縮它,但我沒有找到安裝壓縮映像的選項。
我的目標:
- 結果必須易於訪問
- 在我可以訪問任何內容之前無需解壓整個內容
- 檔案應該能夠快速定位 - 無 TAR/CPIO 檔案
- 所需空間應小於僅複製檔案的空間
因此,理想情況下,我正在尋找一個只讀的壓縮檔案系統,我可以在檔案中建立它並自動增長。
答案1
使用取證分析軟體,例如蓋馬格(開源,sourceforge.net)。它有一個漂亮的用戶介面,允許快速創建整個硬碟的壓縮磁碟映像。
使用「進階取證影像 (.aff)」 這將建立一個單一的壓縮檔案(當然,它也會建立一個 .info 檔案)。
修改預設壓縮率1(最快,但壓縮最少)。如果您有一台具有大量內核的快速計算機,您可以透過建立來變更此設定/etc/guymager/local.cfg
:
AffCompression = 3
9
是最好但最慢的壓縮。3
提供良好的壓縮和良好的性能。
更新
安裝並不像看起來那麼簡單。首先,你需要AFFLIB(烏班圖:)aptitude install afflib-tools
。現在您可以使用以下命令取得原始磁碟映像[affuse][3] <image> <mount-point>
但由於某種原因,安裝原始映像失敗。parted
說第一個分區以1048576B
but開頭
mount -t ext4 -o loop,ro,offset=1048576 /mnt/backup.raw /mnt/backup
失敗並出現常見的無用安裝錯誤:
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
並dmesg
說:
EXT4-fs (loop0): VFS: Can't find ext4 filesystem
答案2
正如 Matthias Krull 在上面的評論中所建議的,qcow2 是一種很好的格式,它支援壓縮來儲存磁碟映像。以下是壓縮/dev/sda
為壓縮影像檔案的範例命令sda.qcow2
。預設使用 zlib 壓縮,但我認為 zstd 可能有更好的壓縮比。使用 8 個執行緒來提高吞吐量,但您應該將其變更為您擁有的處理器核心的數量。
qemu-img convert -c -p -S 512 -o compression_type=zstd" -f raw -O qcow2 -m 8 \
/dev/sda sda.qcow2
存取鏡像可以使用唯讀塊設備NBD,網路塊設備,如下:
modprobe nbd
qemu-nbd -r -c /dev/nbd0 sda.qcow2
kpartx -av /dev/nbd0
mount
然後可以使用中的適當設備正常安裝檔案系統/dev/mapper
。
答案3
對於支援區塊壓縮的檔案系統,一種選擇是將磁碟映像直接儲存為檔案。我知道 BTRFS 支持這一點,但也可能有其他支援。對於 BTRFS,您可能需要啟用掛載選項compress-force
來覆寫不可壓縮啟發式。您還需要建立一個稀疏文件。這可以透過 來完成dd
,如本例所示:
dd if=/dev/sda of=/mount/btrfs/sda.img conv=sparse,fsync iflag=nocache oflag=nocache
這將創建一個稀疏文件,因此零扇區不會佔用空間,並且 BTRFS 將壓縮可壓縮的區塊(假設您確實打開了它)。此compsize
工具可用於查看檔案的壓縮程度。使用du
只會顯示未壓縮檔案減去漏洞的大小,因此不準確。
若要掛載映像中的任何檔案系統,可以使用下列命令:
LOOPDEV=$(losetup --show -f /mount/btrfs/sda.img)
kpartx -av "$LOOPDEV"
mount /dev/mapper/"$LOOPDEV"p3 # To mount the 3rd partition
如果您不使用具有本機壓縮的檔案系統,例如。ext4
,您仍然可以使用此方法,將磁碟映像包裝在 BTRFS 檔案系統映像中。這可能看起來像這樣:
truncate -s 100G backup-sda.btrfs.img
mkfs.btrfs backup-sda.btrfs.img
mount -o compress-force=zstd:9 backup-sda.btrfs.img /media/tmp
cd /media/tmp
# Now do commands to create disk image as above
與使用 的方法相比,此方法可以更好地控制壓縮演算法和壓縮級別qemu-img convert
,後者僅允許選擇壓縮方法,而不能選擇級別,並且可用的壓縮方法較少。