Gzip

1TB 驅動壓縮後顯示只有 3.8GB,我做錯了什麼?

  • September 26, 2021

在 Linux Mint 20.2 Cinnamon 上,我想創建包含 Windows 10 的輔助磁碟驅動器 (SATA) 的磁碟映像,現在沒關係,直接gzip使用Parallel gzip=pigz編輯到 NTFS 格式的外部 HDD 上(即時壓縮)。

我的問題是在生成的壓縮文件中,內容的大小有些扭曲(錯誤),我希望您看看:

1TB 驅動器未壓縮磁碟僅顯示 3.8GB,而其壓縮大小為 193 GB。

1TB 驅動器未壓縮磁碟僅顯示 3.8GB,而其壓縮大小為 193 GB。

$ gzip --list sata-disk--windows10--2021-Sep-24.img.gz 
        compressed        uncompressed  ratio uncompressed_name
      206222131640          3772473344 -5366.5% sata-disk--windows10--2021-Sep-24.img
-rwxrwxrwx 1 vlastimil vlastimil 193G 2021-Sep-24 sata-disk--windows10--2021-Sep-24.img.gz

我剛剛執行的以下 shell 片段的註釋

  • 序列號被刪減,當然 ( ABCDEFGHIJKLMNO)
  • 我試圖用--sizeofpv命令強制大小
  • 整個磁碟的確切字節大小來自smartctl -i /dev/sdX

我剛剛執行的 shell 片段如下

dev=/dev/disk/by-id/ata-Samsung_SSD_870_QVO_1TB_ABCDEFGHIJKLMNO; \
file=/media/vlastimil/4TB_Seagate_NTFS/Backups/sata-disk--windows10--"$(date +%Y-%b-%d)".img.gz; \
pv --size 1000204886016 < "$dev" | pigz -9 > "$file"

我很確定問題出在我如何使用管道或pv就此而言,但我無法證明這一點。使用正常文件 (~2GB) 的測試場景可以正常工作並且符合預期。這可能是一個錯誤gzip…?

請問我在這裡做錯了什麼?先感謝您。


也許最後要介紹的是pvand的版本pigz

  • 我使用的是打包版本pv:1.6.6-1
  • 我正在使用的編譯版本pigz:2.6

我可能剛剛找到了這個奇怪的答案。

正如gzip手冊頁所說:

錯誤:該gzip格式表示輸入大小以 2^32 為模,因此該選項報告不正確的未壓縮大小和4 GB 及更大--list的未壓縮文件的壓縮比。

它進一步指出:

要解決此問題,您可以使用以下命令來發現大型未壓縮文件的真實大小:zcat file.gz | wc -c.

就個人而言:可以找出實際大小的命令可能對像 1TB 這樣的非常大的文件沒有用,因為我真的無法想像它首先會在哪裡解壓縮此類文件。其次,這需要很長時間。即使空間不是問題,SSD也會存在磨損問題等。

很明顯gzip實際上是導致問題的原因。它不會消失。實際上,它會導致無法觀看解壓進度。(當然,不餵pv大小。)


那麼有什麼可行的解決方案嗎?

可悲的是,到目前為止,我什麼也沒找到。我剛剛嘗試了Parallelbzip2(直接來自 Ubuntu 焦點宇宙),它還報告了無效的文件大小(這次是 202 GB)。我需要相對快速地完成,所以這些是我的候選人。如果我沒有找到任何其他快速的替代方案,我會堅持使用它,gzip因為它是最快的。


以顏色開始/結束的範例:)

# UPDATED on 2021-sep-25 03:00 AM
# SATA disk backup using Parallel `gzip` = `pigz` (compiled version 2.6)
tput bold; tput setaf 2; printf '%s' 'Start : '; date; printf '\n'; tput sgr0; \
gz_date=$(date +%Y-%b-%d | tr '[:upper:]' '[:lower:]'); \
gz_disk=/dev/disk/by-id/ata-Samsung_SSD_870_QVO_1TB_ABCDEFGHIJKLMNO; \
gz_file=/media/vlastimil/4TB_Seagate_Ext4/Backups/sata-disk--windows10--"$gz_date".img.gz; \
pv --size 1000204886016 < "$gz_disk" | pigz -9 > "$gz_file"; \
printf '\n'; tput bold; tput setaf 2; printf '%s' 'Finish: '; date; tput sgr0;

可以在此處找到我的壓縮機候選者與他們的速度的列表。但如果它消失了,這裡有一個截圖(點擊放大):

壓縮機程序列表及其速度比較

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