Proxmox VE 4.x 中文初階學習手冊
這個方式很簡單也很實用
https://www.howtoforge.com/tutorial/how-to-use-snapshots-clones-and-replication-in-zfs-on-linux/
http://blog.hychen.org/archives/2013/08/09/87/zfs-%E7%9A%84-snapshot-%E5%82%99%E4%BB%BD/
在Linux 下如何使用 ZFS 快照(snapshots), clones 和 replication ZFS Snapshots - 概述
快照是ZFS最強大的功能之一,快照提供了唯讀, 檔案系統的時間點副本,而且在 zfs pool 裡不佔用額外的空間. The snapshot uses only space when the block references are changed. 快照通過僅記錄當前數據集與先前版本之間的差異來保留磁盤空間。
用於快照的典型範例是當執行類似軟體安裝或系統升級等危險動作時具有快速備份檔案系統當前狀態的方式。
建立/刪除 ZFS Snapshot無法直接查看快照,但可以 cloned, backed和 rolled back 快照。 創建和銷毀ZFS快照非常容易,我們可以使用zfs snapshot和zfs destroy命令。
Create a pool called pool2T1.
建立一個名為 datapool 的 pool2T1
# zpool create pool2T1 mirror /dev/sdb /dev/sdc
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
pool2T1 1.98G 65K 1.98G - 0% 0% 1.00x ONLINE -
現在有一個叫做 pool2T1的 pool, 接下來我們要建立一個 ZFS 檔案系統來模擬快照功能.
# zfs create pool2T1/docs -o mountpoint=/docs
# zfs list -r pool2T1
NAME USED AVAIL REFER MOUNTPOINT
datapool 93.5K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
要建立這個檔案系統的快照, 我們可以透過指定池和快照名稱來使用zfs snapshot命令。我們可以使用 -r 選項讓這個pool底下所有的分割區同時都建立快照. 快照名稱必須滿足以下命名要求:
filesystem@snapname volume@snapname# zfs snapshot pool2T1/docs@version1
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool2T1/docs@version1 0 - 19.5K -
pool2T1/docs 的快照已經建立完成.
要刪除快照,我們可以手動使用 zfs destroy 指令來完成.
# zfs destroy datapool/docs@version1
# zfs list -t snapshot
no datasets available
在這個模擬中, 我們需要在 /docs 目錄裡建立測試檔案.
# echo "version 1" > /docs/data.txt
# cat /docs/data.txt
version 1
建立快照
# zfs snapshot pool2T1/docs@version1
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool2T1/docs@version1 9K - 19.5K -
現在我們變更 /docs/data.txt 這個檔案的內容
# echo "version 2" > /docs/data.txt
# cat /docs/data.txt
version 2
我們可以完全回覆到某一個時間點所做的快照副本(就像大雄的時光機一樣).
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool2T1/docs@version1 9.50K - 19.5K -
# zfs rollback pool2T1/docs@version1
# cat /docs/data.txt
version 1
正如我們所看到的,data.txt的內容回到以前的內容。
如果我們要重新命名快照,我們可以使用zfs rename命令。
# zfs rename pool2T1/docs@version1 pool2T1/docs@version2
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool2T1/docs@version2 9.50K - 19.5K -
注意:如果存在此數據集的快照,則無法銷毀數據集,但我們可以使用-r選項覆蓋該數據集。
# zfs destroy pool2T1/docs
cannot destroy 'datapool/docs': filesystem has children
use '-r' to destroy the following datasets:
pool2T1/docs@version2
# zfs destroy -r pool2T1/docs
# zfs list -t snapshot
no datasets available
ZFS Clones 概述
克隆是可寫卷或檔案系統,其初始內容與創建它的數據集相同。
建立及刪除 ZFS Clone
只能從快照創建 Clone,
當一個快照被建立 Clone 後,這個快照只能在這個 Clone 被刪除後,才刪除原來的快照.
要創建快照,請使用 zfs clone 指令.
# zfs create pool2T1/docs -o mountpoint=/docs
# zfs list -r pool2T1
NAME USED AVAIL REFER MOUNTPOINT
pool2T1 93.5K 1.92G 19K /datapool
pool2T1/docs 19K 1.92G 19K /docs
# mkdir /docs/folder{1..5}
# ls /docs/
folder1 folder2 folder3 folder4 folder5
# zfs snapshot pool2T1/docs@today
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool2T1/docs@today 0 - 19K -
現在可以使用這個快照 pool2T1/docs@today 來建立 clone.
# zfs clone pool2T1/docs@today pool2T1/pict
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
pool2T1 166K 1.92G 19K /pool2T1
poo2T1l/docs 19K 1.92G 19K /docs
pool2T1/pict 1K 1.92G 19K /pool2T1/pict
這個 cloning 程序已經完成, 快照 pool2T1/docs@today 已經 cloned 到 /pool2T1/pict.
當我們檢查 /pool2T1/pict 的內容時,內容應該與 /pool2T1/docs 目錄相同.
# ls /datapool/pict
folder1 folder2 folder3 folder4 folder5
在刪除 pool2T1/pict 前, pool2T1/docs 無法被刪除.
# zfs destroy datapool/docs@today
cannot destroy 'pool2T1/docs@today': snapshot has dependent clones
use '-R' to destroy the following datasets:
datapool/pict
無法刪除 'pool2T1/docs@today': 快照已經被 Clone
使用 '-R' 選項以強制刪除下列面的 datasets:
datapool/pict
# zfs destroy datapool/pict
最後我們可以銷毀快照。
# zfs destroy pool2T1/docs@today
# zfs list -t snapshot
no datasets available
ZFS Replication概述
ZFS replication 的基礎是快照(snapshot), 我們隨時可以建立快照,並且可以建立儘可能多的快照. 通過不斷創造,轉移及恢復快照,可以在不同的主機間同步.
ZFS提供了一個內置的序列化功能 ---它可以將數據的流表示發送到標準輸出(that can send a stream representation of the data to standard output).
在這一節中, 我將向您展示如何將數據集(data set)從數據池複製(replicate)到backuppool,但是不僅可以將數據存儲在連接到本地系統的另一個池上,而且可以通過網絡將其發送到另一個系統。
用於複製數據的命令是zfs send和zfs receive。
另外建立一個名為 backuppool 的pool
# zpool create backuppool mirror sde sdf
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
backuppool 1.98G 50K 1.98G - 0% 0% 1.00x ONLINE -
datapool 1.98G 568K 1.98G - 0% 0% 1.00x ONLINE -
檢查 pool 狀態:
# zpool status
pool: datapool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
datapool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
pool: backuppool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
backuppool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
建立一個我們要複製(replicate)的 dataset.
# zfs snapshot datapool/docs@today
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/docs@today 0 - 19K -
# ls /docs/
folder1 folder2 folder3 folder4 folder5
It's time to do the replication.
# zfs send datapool/docs@today | zfs receive backuppool/backup
(跨主機則使用
zfs send datapool/docs@today | ssh host zfs receive backuppool/backup
)
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
backuppool 83K 1.92G 19K /backuppool
backuppool/backup 19K 1.92G 19K /backuppool/backup
datapool 527K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
# ls /backuppool/backup
folder1 folder2 folder3 folder4 folder5
The dataset datapool/docs@today has been successfully replicated to backuppool/backup.
To replicate a dataset to another machine, we can use the command below:
# zfs send datapool/docs@today | ssh otherserver zfs recv backuppool/backup
Done.
結論
快照,克隆和復制是ZFS最強大的功能。
快照用於創建文件系統或卷的時間點副本,
克隆用於創建重複數據集,
複製用於將數據集從一個數據池複製到同一計算機上的另一個數據池,或者將數據池複製到不同的 機器。