2021-05-12 14:32:11
用 snapper 輕鬆玩轉 Btrfs 的快照功能
一、前言
2017 年五月初 WannaCry 勒索病毒的爆發讓我意識到了部署儲存快照的重要性,特別是在提供儲存服務的伺服器上。
在 Linux 作業系統上,有多種實現儲存快照的方案,如使用 LVM、ZFS 儲存池、Btrfs 檔案系統等。
Btrfs 檔案系統具有透明壓縮、軟 RAID、快照等諸多實用功能,而且設定和管理起來比其他檔案系統都要簡單不少。
所以,Btrfs 目前是我心目中最完美的倉庫盤專用檔案系統!
注意
Btrfs 的 I/O 效能相比其他檔案系統還是要遜色不少的。如果磁碟需要大量且頻繁的 I/O 操作,建議選擇其他檔案系統。
snapper 是一款快照管理實用工具,支援多種檔案系統,當然也包括 Btrfs。
相比 Btrfs 自帶的快照管理工具,snapper 可以更方便、直觀地對快照進行管理、比較,而且還有定時建立快照的功能。
二、實驗環境
- 虛擬機器:VMware Fusion 10.0.1
- 作業系統:CentOS 7.4.1708 最小安裝
- 應用軟體: snapper 0.2.8
- 虛擬磁碟:
/dev/nvme0n1
- 磁碟掛載點:
/mnt/btrfs
三、準備工作
3.1 安裝 snapper 快照管理實用工具
yum -y install snapper
3.2 把磁碟格式化成 Btrfs 格式
mkfs.btrfs -f /dev/nvme0n1
3.3 掛載磁碟
mount /dev/nvme0n1 /mnt/btrfs
注意
在進行下列操作時,請保持磁碟處於掛載狀態!
四、設定 snapper
在 Btrfs 中,snapper 是以子卷為單位管理快照的。我們要先為子捲建立組態檔才能管理快照。
這裡我們不另外劃分子捲,直接以 Btrfs 掛載點的根目錄來進行操作(根目錄也算是一個子捲)。
4.1 建立組態檔
命令基本用法
snapper -c <設定名稱> create-config <子捲路徑>
用法舉例
建立 /mnt/btrfs/
的快照組態檔。
snapper -c snap_test create-config /mnt/btrfs/
4.2 刪除組態檔
命令基本用法
snapper -c <設定名稱> delete-config
4.3 列出現有組態檔
命令基本用法
snapper list-configs
五、快照的管理
5.1 拍攝一個快照
5.1.1 拍攝一個普通快照
命令基本用法
snapper -c <設定名稱> create [選項]
選項 | 功能 |
---|---|
-p |
列印快照的編號 |
-c <number|timeline> |
指定清理演算法(後面 6.2 和 6.3 會詳細解釋) |
--description=<描述> |
為快照新增描述 |
用法舉例
在 /mnt/btrfs/
上拍攝一個快照,描述資訊為 kuaizhao1
,並列印其編號。
snapper -c snap_test create --description=kuaizhao1 -p
執行結果
1
5.1.2 拍攝一對快照
快照對中包含了 pre
快照和 post
兩種型別的快照。
一個 pre
快照需要對應一個 post
快照。
一般在進行檔案系統操作之前拍攝一個 pre
快照,在操作完成後再拍攝一個 post
快照。
快照對其實跟普通快照並沒有什麼本質上的區別,只是做個標記便於識別和管理而已。
命令基本用法
拍攝 pre
快照
snapper -c <設定名稱> create -t pre [選項]
拍攝 post
快照
snapper -c <設定名稱> create -t post --pre-number=<pre 快照編號> [選項]
選項 | 功能 |
---|---|
-p |
列印快照的編號 |
-c empty-pre-post |
指定清理演算法(後面 6.2 和 6.3 會詳細解釋) |
--description=<描述> |
為快照新增描述 |
說明
快照編號可通過執行 5.2 的命令來檢視,下同。
5.2 列出所有快照
命令基本用法
snapper -c <設定名稱> list
用法舉例
列出 /mnt/btrfs/
中的所有快照。
snapper -c snap_test list
執行結果
# 前期:指快照對中 post 快照所對應的 pre 快照名
# 清空:指清理演算法
型別 | # | 前期 # | 日期 | 使用者 | 清空 | 描述 | 使用者資料
-------+---+--------+------------------------------------+------+----------+-----------+---------
single | 0 | | | root | | current |
single | 1 | | 2017年10月29日 星期日 13時23分48秒 | root | | kuaizhao1 |
說明
0 號快照並不是真正的快照,它表示當前檔案系統的狀態。
5.3 刪除快照
命令基本用法
snapper -c <設定名稱> delete <快照 1 編號> [<快照 2 編號>...]
用法舉例
刪除剛才建立的快照。
snapper -c snap_test delete 1
5.4 比較兩個快照的差異
命令基本用法
snapper -c <設定名稱> status <快照 1 編號>..<快照 2 編號>
執行完該命令之後,snapper 會分析快照 2 相比快照 1 有哪些差異,並將比較結果儲存到檔案中以便下次快速查詢。
具體有哪些差異要看檔名以及對應的旗標。
旗標 | 說明 |
---|---|
+ |
檔案被建立 |
- |
檔案被刪除 |
c |
檔案內容被修改 |
t |
檔案型別被修改(例如檔案變為目錄) |
p |
檔案許可權被修改 |
u |
檔案屬主別修改 |
g |
檔案屬組別修改 |
x |
檔案擴充套件屬性被修改 |
a |
檔案 ACL 許可權被修改 |
用法舉例
在 /mnt/btrfs/
上建立檔案 1.txt
,然後拍攝一個快照,再往 1.txt
新增一點內容,然後建立檔案 2.txt
,再拍攝一個快照。比較這兩個快照的差異。
touch /mnt/btrfs/1.txt # 建立 1.txt
snapper -c snap_test create # 拍攝快照
echo "Hello" > /mnt/btrfs/1.txt # 新增內容
touch /mnt/btrfs/2.txt # 建立 2.txt
snapper -c snap_test create # 拍攝快照
snapper -c snap_test status 1..2 # 比較快照 1 到快照 2 的差異
執行結果
c..... /mnt/btrfs/1.txt # 1.txt 被修改了
+..... /mnt/btrfs/2.txt # 增加了 2.txt
5.5 回滾快照
命令基本用法
snapper -c <設定名稱> undochange <快照編號>..<0>
注意
建???在回滾快照之前先為當前狀態建立一個快照。
用法舉例
回滾到上面建立的快照 1,並對比前後結果。
tree /mnt/btrfs/ # 檢視回滾前檔案
snapper -c snap_test undochange 1..0 # 回滾快照
tree /mnt/btrfs/ # 檢視回滾後檔案
執行結果
# 回滾前狀態
/mnt/btrfs/
├── 1.txt
└── 2.txt
# 執行回滾命令後
建立:0 修訂:1 刪除:1
# 回滾後狀態
/mnt/btrfs/
└── 1.txt
5.6 快照檔案的管理
由 snapper 所產生的快照預設儲存在子捲下面的 .snapshots
目錄中。我們來看一下它的結構:
/mnt/btrfs/.snapshots/
├── 1 # 快照 1 目錄
│ ├── info.xml # 快照基本資訊
│ └── snapshot # 快照內容
│ └── 1.txt
└── 2 # 快照 2 目錄
├── filelist-1.txt # 快照差異比較結果
├── info.xml # 快照基本資訊
└── snapshot # 快照內容
├── 1.txt
└── 2.txt
可以看到,每個快照的基本資訊和內容都在其對應編號的目錄中,子目錄 snapshot
的內容就是拍攝快照時子捲的所有內容。
快照檔案預設是唯讀的,而且只有 root 可以存取。如果需要恢復單一檔案,可以把快照裏面的內容用 cp
命令拷貝回來。
由於 Btrfs 檔案系統具有寫時複製的特性,所以如果檔案系統中的檔案沒有經常被替換,快照占用的空間是非常小的。
六、快照的自動拍攝與清理
自動拍攝及清理快照是 snapper 的特色功能之一。
6.1 開啟快照自動拍攝
systemctl start snapper-timeline.timer ; systemctl enable snapper-timeline.timer
預設情況下,每小時自動拍攝一次快照。
如需修改時間間隔,請修改相關的定時器組態檔。修改方法這裡就不說了。
快照的清理演算法將被自動設定為 timeline
。
6.2 開啟快照自動清理
systemctl start snapper-cleanup.timer ; systemctl enable snapper-cleanup.timer
預設情況下,每天自動清理一次快照。
如需修改時間間隔,請修改相關的定時器組態檔。修改方法這裡就不說了。
不指定清理演算法的快照不會被自動清理。
6.3 修改快照自動清理的引數
組態檔位置:/etc/snapper/configs/<設定名稱>
。
常用欄位及對應的功能如下:
欄位名 | 功能 |
---|---|
NUMBER_CLEANUP |
開啟 number (基於數量) 的清理演算法 |
NUMBER_LIMIT |
最大快照數量 |
TIMELINE_CLEANUP |
開啟 timeline (基於時間) 的清理演算法 |
TIMELINE_LIMIT_HOURLY |
每小時快照的保留數目 |
TIMELINE_LIMIT_DAILY |
每天快照的保留數目 |
TIMELINE_LIMIT_WEEKLY |
每週快照的保留數目 |
TIMELINE_LIMIT_MONTHLY |
每月快照的保留數目 |
TIMELINE_LIMIT_YEARLY |
每年快照的保留數目 |
EMPTY_PRE_POST_CLEANUP |
開啟 empty-pre-post (基於快照對) 的清理演算法 |
EMPTY_PRE_POST_CLEANUP |
開啟自動清理無變化快照對 |
本文永久更新連結地址:http://www.linuxidc.com/Linux/2018-01/150112.htm
相關文章