ZFS 快照:如何建立、還原與自動化
10 分鐘閱讀 - 2026年5月5日

學習如何在 Linux 上建立、還原及自動化 ZFS 快照。涵蓋指令、回捲、保留政策,以及使用 Sanoid 進行異地複製
ZFS 快照:如何建立、還原及自動化
ZFS 快照是檔案系統的唯讀、時間點複本。它會立即建立,在資料變更前不佔空間,並可讓您在幾秒鐘內回溯或復原檔案。如果您要管理伺服器、VPS 實體或任何您不能遺失的資料,快照應該是您工作流程的一部分。
這篇文章涵蓋 ZFS 快照的運作方式、如何使用它們,以及如何自動保留它們,以免堆積如山。
ZFS 快照如何運作
ZFS 使用寫入複製 (CoW) 模型。當您拍攝快照時,ZFS 不會複製任何資料。它只會記錄區塊指標樹的目前狀態。新的寫入會寫到空閒的區塊,而快照則會持續參考原始區塊。
這表示不論資料集大小,快照都會在微秒內建立,而且在建立時不會消耗額外空間。它們只會在即時資料集變更時才開始使用空間,因為快照會保留原本要釋放的原始區塊。
這與rsync或tar 等掃描和複製整個檔案的檔案層級備份工具根本不同。如果您變更 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,creationUSED列顯示該快照獨有的空間。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 list和zfs destroy等指令會顯著變慢。保持緊密的保留。
使用 Sanoid 自動化保留
Sanoid是自動化 ZFS 快照建立和修剪的標準工具。您在sanoid.conf 中定義保留政策,其餘的就由它來處理。
典型的生產組態可能如下
| 工作負載類型 | 每小時 | 每日 | 每週 | 每月 |
|---|---|---|---|---|
| 標準生產 | 24-48 | 30 | 8 | 12 |
| 資料庫(高流失率) | 72 | 30 | 12 | 24 |
| 日誌 / 低優先順序 | 12-24 | 7 | 0 | 3 |
| 靜態媒體 | 0 | 7 | 0 | 3 |
Sanoid 也透過frequently參數支援每小時一次的快照。設定frequently = 96,frequent_period = 15,就可以每 15 分鐘做一次快照。
透過 cron 安排 Sanoid 每分鐘或每 15 分鐘執行一次,它就會自動建立和修剪快照。
使用 zfs 發送異地複製
單一伺服器上的快照可防止意外變更和軟體故障,但無法防止硬體遺失。為此,請透過 SSH 使用zfs send和zfs 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/webSanoid 的配套工具syncoid 可自動執行此程序,並處理增量傳送、錯誤復原和日誌。
有關贖金軟體防護的說明
ZFS 快照在核心層級是唯讀的,這表示標準的惡意軟體無法修改或加密它們。這是一層強大的防禦。但它並非刀槍不入:如果攻擊者取得 root 存取權限,他們可以在加密您的資料之前刪除快照。
快照應該是更廣泛策略的其中一層。請將快照與異地複製、限制 root 存取權限及網路層級安全性結合。不要單獨依賴快照。
視訊建議

如何在 VPS 上安装和使用 Redis
9 分鐘閱讀 - 2026年1月7日