ZFS 快照:如何建立、還原與自動化

10 分鐘閱讀 - 2026年5月5日

hero section cover
目錄
  • ZFS 快照:如何建立、還原及自動化
  • ZFS 快照如何運作
  • 建立快照
  • 從快照還原
  • 管理和修剪快照
  • 使用 Sanoid 自動化保留
  • 使用 zfs 發送異地複製
  • 有關贖金軟體防護的說明
  • 視訊建議
  • 最後的想法
分享

學習如何在 Linux 上建立、還原及自動化 ZFS 快照。涵蓋指令、回捲、保留政策,以及使用 Sanoid 進行異地複製

ZFS 快照:如何建立、還原及自動化

ZFS 快照是檔案系統的唯讀、時間點複本。它會立即建立,在資料變更前不佔空間,並可讓您在幾秒鐘內回溯或復原檔案。如果您要管理伺服器、VPS 實體或任何您不能遺失的資料,快照應該是您工作流程的一部分。

這篇文章涵蓋 ZFS 快照的運作方式、如何使用它們,以及如何自動保留它們,以免堆積如山。

ZFS 快照如何運作

ZFS 使用寫入複製 (CoW) 模型。當您拍攝快照時,ZFS 不會複製任何資料。它只會記錄區塊指標樹的目前狀態。新的寫入會寫到空閒的區塊,而快照則會持續參考原始區塊。

這表示不論資料集大小,快照都會在微秒內建立,而且在建立時不會消耗額外空間。它們只會在即時資料集變更時才開始使用空間,因為快照會保留原本要釋放的原始區塊。

這與rsynctar 等掃描和複製整個檔案的檔案層級備份工具根本不同。如果您變更 10GB 檔案中的 4KB,rsync 會複製整個檔案。ZFS 只會儲存 4KB 區塊。

快照也是不可變的。它們在核心層級被強制為唯讀,因此使用者空間程序 (包括勒索軟體) 無法修改它們。結合 ZFS 的內建校驗和,這表示您可以在還原時驗證資料的完整性。

建立快照

先決條件

您需要安裝 ZFS 並設定一個池。在 Ubuntu 20.04+ 上:

sudo apt update && sudo apt upgrade -y
sudo apt install zfsutils-linux -y
sudo modprobe zfs

建立資料池。對於單一磁碟 (典型的 VPS):

sudo zpool create tank /dev/sdb

對於專用伺服器上的鏡射設定,請使用磁碟 ID 而非裝置名稱,以避免重新開機後發生問題:

sudo zpool create tank mirror /dev/disk/by-id/ata-DISK1 /dev/disk/by-id/ata-DISK2

啟用壓縮 (LZ4 既快速又有效):

sudo zfs set compression=lz4 tank

然後為您的工作負載建立資料集:

sudo zfs create tank/web
sudo zfs create tank/databases

拍攝快照

基本指令:

sudo zfs snapshot tank/web@before-update

對於有時間戳記的名稱 (對 cron 很有用):

sudo zfs snapshot tank/db@$(date +%Y%m%d_%H%M%S)

若要一次擷取所有子資料集,請使用遞歸旗標:

sudo zfs snapshot -r tank@daily_backup

驗證:

sudo zfs list -t snapshot

從快照還原

還原個別檔案

每個 ZFS 資料集的掛載點都有一個隱藏的.zfs/snapshot目錄。它不會顯示在ls 中,但您可以直接導覽到它:

ls /tank/web/.zfs/snapshot/before-update/

還原單一檔案:

cp -p /tank/web/.zfs/snapshot/before-update/config/app.conf /tank/web/config/

-p標記會保留權限和時間戳記。

回滾整個資料集

如果您需要還原所有內容,例如在升級失敗後:

sudo zfs rollback tank/web@before-update

這幾乎是瞬間的事,因為 ZFS 會更新區塊指針,而不是複製資料。但這會造成破壞:在快照之後所做的所有變更都會永久遺失。

如果在目標與目前狀態之間存在更新的快照,ZFS 會阻止回滾。使用-r來強制執行,並移除這些中間快照:

sudo zfs rollback -r tank/db@20260426_090000

一個好習慣:在回捲之前先為目前 (已損毀) 的狀態製作快照,以便在需要時有後備。

復原方法速度資料遺失風險最適合
透過.zfs還原檔案視檔案大小而定意外刪除、單一檔案復原
完全回滾即時高 (會遺失所有快照後的變更)升級失敗、全系統問題
複製測試即時無(建立平行資料集)在承諾回滾之前進行驗證

管理和修剪快照

快照的大小從零開始,但會隨著其下的即時資料變更而成長。若要檢查空間使用情況,請

zfs list -t snapshot -o name,used,refer,creation

USED列顯示該快照獨有的空間。REFER顯示資料集在拍攝快照時的總大小。

若要刪除快照:

sudo zfs destroy tank/web@before-update

您也可以依模式刪除:

sudo zfs destroy tank/web@daily-2026-04-%

總是先進行乾燥運轉:

sudo zfs destroy -nv tank/web@daily-%

ZFS 在技術上可以處理數百萬個快照,但每個資料集超過幾千個時,效能就會下降。zfs listzfs destroy等指令會顯著變慢。保持緊密的保留。

使用 Sanoid 自動化保留

Sanoid是自動化 ZFS 快照建立和修剪的標準工具。您在sanoid.conf 中定義保留政策,其餘的就由它來處理。

典型的生產組態可能如下

工作負載類型每小時每日每週每月
標準生產24-4830812
資料庫(高流失率)72301224
日誌 / 低優先順序12-24703
靜態媒體0703

Sanoid 也透過frequently參數支援每小時一次的快照。設定frequently = 96frequent_period = 15,就可以每 15 分鐘做一次快照。

透過 cron 安排 Sanoid 每分鐘或每 15 分鐘執行一次,它就會自動建立和修剪快照。

使用 zfs 發送異地複製

單一伺服器上的快照可防止意外變更和軟體故障,但無法防止硬體遺失。為此,請透過 SSH 使用zfs sendzfs receive進行異地複製:

zfs send tank/web@backup | ssh user@remote zfs receive backup/web

用於增量傳輸 (僅傳送自上次快照以來的變更):

zfs send -i tank/web@old_snap tank/web@new_snap | ssh user@remote zfs receive backup/web

Sanoid 的配套工具syncoid 可自動執行此程序,並處理增量傳送、錯誤復原和日誌。

有關贖金軟體防護的說明

ZFS 快照在核心層級是唯讀的,這表示標準的惡意軟體無法修改或加密它們。這是一層強大的防禦。但它並非刀槍不入:如果攻擊者取得 root 存取權限,他們可以在加密您的資料之前刪除快照。

快照應該是更廣泛策略的其中一層。請將快照與異地複製、限制 root 存取權限及網路層級安全性結合。不要單獨依賴快照。

視訊建議

最後的想法

ZFS 快照快速、節省空間,而且只要瞭解基本知識就能簡單使用。它們無法取代異地備份,但卻能彌補傳統備份工具的不足:即時、零開銷的復原點,您可以根據需要隨時進行復原。

如果您在 VPS 或專用伺服器上執行 ZFS,請設定 Sanoid、定義保留政策,並自動進行複製。只需 30 分鐘即可完成設定,出錯時可節省數小時。請在FDC VPS專屬伺服器上試試看。

博客

本周特色

更多文章
ZFS 快照:如何建立、還原與自動化

ZFS 快照:如何建立、還原與自動化

學習如何在 Linux 上建立、還原及自動化 ZFS 快照。涵蓋指令、回捲、保留政策,以及使用 Sanoid 進行異地複製

10 分鐘閱讀 - 2026年5月5日

如何在 VPS 上安装和使用 Redis

9 分鐘閱讀 - 2026年1月7日

更多文章