壓縮的基本原理#

壓縮的核心思想是消除資料中的冗餘。例如,一個檔案中有連續 100 個 1,原本需要 100 個位元儲存,壓縮後可以用「100 個 1」這樣的簡短描述來替代,大幅縮減空間。

壓縮帶來兩個主要好處:

  • 節省磁碟空間
  • 加速網路傳輸(傳輸量變小)

壓縮與打包是兩件事#

這是 Linux 壓縮觀念中最重要的區分:

  • 壓縮(Compression):對單一檔案進行壓縮,減小檔案體積
  • 打包(Archiving):將多個檔案合併成一個檔案,但不一定壓縮

在 Windows 中,「壓縮」和「打包」通常是同一個動作(如 ZIP)。但在 Linux 中,傳統上壓縮工具(gzip、bzip2、xz)只能處理單一檔案,所以需要先用 tar 打包多個檔案,再進行壓縮。這就是 .tar.gz.tar.bz2.tar.xz 這些組合副檔名的由來。

三大壓縮工具的比較#

工具副檔名壓縮比速度特點
gzip.gz普通最快最廣泛使用,相容性最好
bzip2.bz2較好中等適合需要更好壓縮比的場景
xz.xz最佳最慢壓縮比最高,但壓縮耗時較長

選擇哪種壓縮工具取決於場景:日常備份用 gzip(速度優先),軟體發布用 xz(體積優先),bzip2 介於兩者之間。

tar:打包的核心工具#

tar 的名稱來自 Tape Archive(磁帶歸檔),最初是為了將多個檔案寫入磁帶備份裝置而設計的。現在 tar 已經整合了壓縮功能,可以一步完成「打包 + 壓縮」。

tar 的重要觀念:

  • 保留檔案屬性:權限、擁有者、時間戳都會被完整保存
  • 支援差異備份:可以只打包自上次備份以來變更的檔案
  • 選擇性解壓縮:可以只從 tar 檔案中取出特定的檔案

tar 保留檔案屬性的特性讓它成為 Linux 系統備份的首選工具。相比之下,cp 指令在複製時可能會遺失某些屬性(如特殊權限、SELinux context)。

檔案系統層級的備份#

除了檔案層級的打包壓縮,Linux 還提供檔案系統層級的備份工具:

xfsdump/xfsrestore#

針對 XFS 檔案系統的專用備份工具,支援:

  • Level 0 ~ 9 的增量備份:Level 0 是完整備份,Level 1 只備份自 Level 0 以來的變更,以此類推
  • 備份整個檔案系統或特定目錄

dd#

dd磁區層級的備份工具——它不認識檔案系統,只是逐 byte 複製。因此:

  • 可以完整複製整顆磁碟(包括分割表、開機磁區)
  • 可以建立磁碟映像檔
  • 備份的目標不需要格式化

dd 非常強大但也非常危險——它不會詢問確認就直接覆蓋目標。if(input file)和 of(output file)寫反了,就可能毀掉整顆磁碟的資料。

備份策略的思考#

備份不只是技術操作,更是策略問題

  • 備份什麼:至少包含 /etc(設定)、/home(使用者資料)、/var(變動資料)
  • 備份到哪裡:異地備份是基本要求,本地備份無法防範硬體損毀或火災
  • 多久備份一次:取決於資料變動頻率和可接受的資料遺失量(RPO)
  • 完整備份 vs. 增量備份:完整備份還原簡單但佔空間,增量備份省空間但還原複雜

備份最致命的錯誤不是「沒有備份」,而是「有備份但從未驗證過能否還原」。定期測試還原流程,確認備份資料的完整性,是備份策略中不可省略的一環。