Snapper

出自 Arch Linux 中文维基

Snapper 是一個由 openSUSE 的 Arvin Schnell 開發的工具,用於管理 Btrfs 子卷和 LVM 精簡配置(thin-provisioned)卷。它可以創建和比較快照,在快照間回滾,並支持自動按時間序列創建快照。

安裝[編輯 | 編輯原始碼]

安裝 snapper 包。或者安裝開發版本 snapper-gitAUR

此外,還可以安裝 GUI 前端 snapper-gui-gitAUR

建立一個新的配置[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: Add instructions for using thin-provisioned LVM snapshots. (在 Talk:Snapper#LVM thin-provisioned snapshots 中討論)

在為 btrfs 子卷建立一個 snapper 配置前,這個子卷必須已經存在。否則,你應該在建立 snapper 配置前創建它。

要為位置為 /path/to/subvolume 的 btrfs 子卷創建一個新的 snapper 配置文件,並命名為 config

# snapper -c config create-config /path/to/subvolume

這將會:

  • 根據 /usr/share/snapper/config-templates/default 處的默認配置模板創建一個配置文件 /etc/snapper/configs/config
  • /path/to/subvolume/.snapshots 處創建一個子卷,用於存儲未來該配置文件產生的子卷。子卷的路徑將會是 /path/to/subvolume/.snapshots/#/snapshot# 是子卷序號。
  • config 加入到 /etc/conf.d/snapperSNAPPER_CONFIGS 中。

例如,要為掛載在 / 的子卷創建一個配置文件:

# snapper -c root create-config /

此時,配置文件已經激活。如果你的 cron 守護進程已經運行, snapper 將會使用 #自動按時創建快照。否則,你需要使用 systemd 單元文件和定時器。參閱 #啟用/停用

參閱 snapper-configsman page

創建快照[編輯 | 編輯原始碼]

自動按時創建快照[編輯 | 編輯原始碼]

一個快照時間線(timeline)由可配置數目的每小時/日/月/年快照組成。當自動按時創建啟用時,默認每小時創建一個快照。每天由時間線清理算法清理多餘快照。

啟用/停用[編輯 | 編輯原始碼]

如果你擁有一個 cron 守護進程,該特性應該已經自動啟用。要停用,編譯你想禁用該特性的子卷對應配置文件為:

TIMELINE_CREATE="no"

如果你沒有 cron 守護進程,你可以使用提供的 systemd 單元文件。Startenable snapper-timeline.timer 來啟用自動按時創建快照。另外,startenable snapper-cleanup.timer 來定期清理老舊快照。

設置快照限制[編輯 | 編輯原始碼]

默認配置將保留 10 個每小時快照,10 個每日快照,10 個每月快照和 10 個每年快照。你可以在配置文件中更改這些限制,特別是在繁忙的子卷,例如 / 上。參閱 Snapper#Preventing slowdowns

這是一份名為 config 的配置文件的示例片段,它將保留 5 個每小時快照,7 個每日快照,不保留每月和每年快照:

/etc/snapper/configs/config
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"

更改創建和清理頻率[編輯 | 編輯原始碼]

如果你使用提供的 systemd 定時器,你可以 修改 它們來更改創建和清理頻率。

例如,編輯 snapper-timeline.timer,加入下列配置來設定快照頻率為間隔五分鐘,而不是一小時:

[Timer]
OnCalendar=*:0/5
注意: 配置項 TIMELINE_LIMIT_HOURLY 在上述示例中,其含義將會變為表示保留多少個每5分鐘快照。

在編輯 snapper-cleanup.timer 來每小時運行清理,而不是每天的時候, 你需要更改 OnUnitActiveSec。 加入:

[Timer]
OnUnitActiveSec=1h

參閱 Systemd/定時器Systemd#Drop-in files.

手動創建快照[編輯 | 編輯原始碼]

簡單快照[編輯 | 編輯原始碼]

默認情況下 snapper 創建 'simple 類型的快照,它們與其他快照沒有特別關係。

要為一個子卷創建快照:

 # snapper -c config create --description desc

以上命令沒有對應的清理算法,因此該快照將會一直存儲直到 刪除 它。

要設置一個清理算法,在 create 後使用 -c 選項,並在 numbertimelineprepost 中選擇一個參數。 number 使 snapper 定期清理超出配置文件中設置的數量限制的快照。例如,要創建一個使用 number 清理算法的快照:

 # snapper -c config create -c number

參閱 #自動按時創建快照 查看 timeline 是如何工作的。參閱 #Pre/post 快照 查看 pre post 如何工作。

Pre/post 快照[編輯 | 編輯原始碼]

除了 simple 快照以外,你還可以創建 pre/post 快照,pre 快照永遠有一個對應的 post 快照。配對的目的是可以在系統更改前後創建快照。

要創建一個 pre/post 快照對,先創建一個 pre 快照:

 # snapper -c config create -t pre -p

記下輸出的快照序號,它將會在創建 post 快照時使用。

然後執行一個系統更改(例如:安裝一個新程序,更新系統,等等)

現在創建 post 快照:

 # snapper -c config create -t post --pre-number N

N 是對應的 pre 快照的序號。

另一種方法是在 create 時使用 --command 選項,將會在 pre/post 快照間執行一個命令:

 # snapper -c config create --command cmd

cmd 是你希望在 pre/post 快照間執行的命令。

參閱 Snapper#Wrapping pacman transactions in snapshots.

啟動時快照[編輯 | 編輯原始碼]

要讓 snapper 為 root 配置文件創建一個快照,啟用 snapper-boot.timer

列出快照[編輯 | 編輯原始碼]

要列出名為 config 的配置文件對應的快照:

 # snapper -c config list

列出配置[編輯 | 編輯原始碼]

列出所有你已經創建的配置:

 # snapper list-configs

刪除快照[編輯 | 編輯原始碼]

要刪除序號為 N 的快照:

 # snapper -c config delete N

可以一次刪除多個快照。例如,要刪除 root 配置文件的 65 和 70 號快照:

 # snapper -c root delete 65 70
注意: 刪除 pre 快照時, 你應該總是刪除對應的 post 快照。反之亦然。

允許非 root 用戶訪問[編輯 | 編輯原始碼]

所有配置文件都是由 root 用戶創建的,默認情況下,也只有 root 用戶可以查看並訪問它們。

要讓指定用戶可以列出某一配置文件的快照,修改 /etc/snapper/configs/config 中的 ALLOW_USERS 項。現在你應該可以以普通用戶權限運行 snapper -c configlist

最後,如果你想允許某一用戶瀏覽 .snapshots 目錄,但是該目錄的擁有者必須為 root。因此,你應該修改包括該用戶的組為組擁有者,以 users 為例:

# chmod a+rx .snapshots
# chown :users .snapshots

疑難解答[編輯 | 編輯原始碼]

日誌[編輯 | 編輯原始碼]

Snapper 將所有活動寫入到 /var/log/snapper.log 中 —— 在你認為出錯時,首先檢查該文件。

當你遇到關於每小時/每日/每周快照的問題時,最常見的原因是由於 cronie 服務(或者你使用的其他 cron 守護進程)沒有運行。

IO 錯誤[編輯 | 編輯原始碼]

如果你在試圖創建快照時遇到 'IO Error',請確認你試圖創建快照的子卷對應的 .snapshots 目錄是一個子卷。

另一個可能的原因是 .snapshots 目錄的擁有者不是 root。你會在在 /var/log/snapper.log 中找到 Btrfs.cc(openInfosDir):219 - .snapshots must have owner root

相關資源[編輯 | 編輯原始碼]