跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 管理指南 / 一般工作 / 使用 Snapper 進行系統復原和快照管理
適用範圍 SUSE Linux Enterprise Server 12 SP5

7 使用 Snapper 進行系統復原和快照管理

在 Linux 上建立檔案系統快照以執行復原的功能是過去使用者常常要求的一項功能。現在,Snapper 與 Btrfs 檔案系統或簡易佈建的 LVM 磁碟區合用,填補了這個空白。

Btrfs 是一個適用於 Linux 的全新寫時複製檔案系統,它支援子磁碟區 (每個實體分割區中的一或多個可獨立掛接的檔案系統) 的檔案系統快照 (子磁碟區於特定時間點之狀態的副本)。快照在使用 XFS、Ext4 或 Ext3 格式化之簡易佈建的 LVM 磁碟區上同樣受支援。Snapper 可讓您建立和管理這些快照。它包含一個指令行和一個 YaST 介面。從 SUSE Linux Enterprise Server 12 開始,還可以從 Btrfs 快照開機。如需詳細資訊,請參閱第 7.3 節 「透過從快照開機來執行系統復原」

您可以使用 Snapper 執行以下任務︰

7.1 預設設定

SUSE Linux Enterprise Server 上的 Snapper 設定為充當系統變更的復原工具。依預設,SUSE Linux Enterprise Server 的根分割區 (/) 使用 Btrfs 格式化。如果根分割區 (/) 足夠大 (大約超過 16GB),則會自動啟用快照建立功能。預設不會在 / 外的分割區上建立快照。

提示
提示:在已安裝系統中啟用 Snapper

如果您在安裝期間停用了 Snapper,以後隨時都可啟用它。若要進行此操作,請執行以下指令以建立根檔案系統的預設 Snapper 組態︰

tux > sudo snapper -c root create-config /

之後,依第 7.1.3.1 節 「停用/啟用快照」所述啟用不同的快照類型。

請記住,若要使用快照,需依照安裝程式的建議設定一個包含子磁碟區的 Btrfs 根檔案系統,並且需有一個大小至少為 16 GB 的分割區。

建立快照時,快照和原件都會指向檔案系統中的同一區塊。因此,快照最初並不佔用額外的磁碟空間。如果原始檔案系統中的資料經過修改,則會複製變更後的資料區塊,同時保留快照的舊資料區塊。因此,快照便會佔用與已修改資料相同的空間。這樣,經過一段時間之後,快照配置的空間不斷增大。因而,從包含快照的 Btrfs 檔案系統刪除檔案可能無法釋放磁碟空間!

注意
注意:快照位置

快照始終位於建立快照所在的同一分割區或子磁碟區上。而無法儲存到其他分割區或子磁碟區上。

因此,包含快照的分割區必須比一般分割區更大。確切大小很大程度上取決於保留的快照數和資料修改量。一般來說,您應該考慮使用比平常大兩倍的大小。為了防止磁碟上的空間耗盡,系統會自動清理舊快照。如需詳細資訊,請參閱第 7.1.3.4 節 「控制快照歸檔」

7.1.1 快照類型

儘管快照本身在技術方面並無區別,但我們根據觸發它們的事件將其分成三類︰

時間軸快照

每小時建立一個快照。系統會自動刪除舊快照。依預設,系統會保留過去十天、十個月或十年的第一個快照。時間軸快照預設已停用。

安裝快照

每當使用 YaST 或 Zypper 安裝一個或多個套件時,均會建立一對快照︰安裝開始前建立一個 (),安裝結束後建立另一個 ()。如果重要系統元件 (如核心) 已經安裝,則快照對會標示為重要 (important=yes)。系統會自動刪除舊快照。依預設,系統會保留最近十個重要快照以及最近十個一般快照 (包括管理快照)。預設系統會啟用安裝快照。

管理快照

每當您使用 YaST 管理系統時,均會建立一對快照︰啟動 YaST 模組時建立一個 (),關閉模組時建立另一個 ()。系統會自動刪除舊快照。依預設,系統會保留最近十個重要快照以及最近十個一般快照 (包括安裝快照)。預設系統會啟用管理快照。

7.1.2 從快照中排除的目錄

出於不同原因,需要將一些目錄從快照中排除。下列清單顯示排除的所有目錄︰

/boot/grub2/i386-pc/boot/grub2/x86_64-efi/boot/grub2/powerpc-ieee1275/boot/grub2/s390x-emu

不支援對開機載入程式組態進行復原。上面列出的目錄是架構專屬目錄。前兩個目錄位於 AMD64/Intel 64 機器上,後兩個目錄分別位於 IBM POWER 和 IBM Z 上。

/home

如果 /home 不在獨立的分割區上,系統會將其排除以避免在復原時發生資料遺失。

/opt/var/opt

協力廠商產品通常會安裝到 /opt。系統會將該目錄排除以避免在復原時解除安裝這些應用程式。

/srv

包含 Web 和 FTP 伺服器的資料。系統會將該目錄排除以避免在復原時發生資料遺失。

/tmp/var/tmp/var/cache/var/crash

包含暫存檔案和快取的所有目錄均會從快照中排除。

/usr/local

在手動安裝軟體時會用到此目錄。系統會將該目錄排除,以免在復原時解除安裝這些安裝的軟體。

/var/lib/libvirt/images

使用 libvirt 管理之虛擬機器影像的預設位置。已排除,以確定復原期間虛擬機器影像不會取代為舊版本。依預設,此子磁碟區是使用寫入時不複製選項建立的。

/var/lib/mailman/var/spool

系統會排除包含郵件或郵件佇列的目錄以避免復原之後遺失郵件。

/var/lib/named

包含 DNS 伺服器的區域資料。從快照中排除該目錄是為了確保名稱伺服器在復原之後可以運作。

/var/lib/mariadb/var/lib/mysql/var/lib/pgqsl

這些目錄包含資料庫資料。依預設,這些子磁碟區是使用寫入時不複製選項建立的。

/var/log

記錄檔案位置。從快照中排除該目錄是為了在復原損毀系統之後能夠對記錄檔案進行分析。/var/log 預設會設定 NoCOW 屬性,禁止寫入時複製,從而改進了效能並減少了重複的區塊數量。使用 lsattr 進行驗證:

tux > lsattr -l /var/
/var/log      No_COW

7.1.3 自訂設定

SUSE Linux Enterprise Server 隨附一個合理的預設設定,該設定適合大多數使用案例。不過,您可以根據自己的需求對建立自動快照以及快照保留的方方面面進行設定。

7.1.3.1 停用/啟用快照

三種快照類型 (時間軸、安裝、管理) 均可獨立啟用或停用。

停用/啟用時間軸快照

啟用: snapper-c root set-config "TIMELINE_CREATE=yes"

停用: snapper -c root set-config "TIMELINE_CREATE=no"

預設會啟用時間軸快照,根分割區除外。

停用/啟用安裝快照

啟用: 安裝套件 snapper-zypp-plugin

停用: 解除安裝套件 snapper-zypp-plugin

預設系統會啟用安裝快照。

停用/啟用管理快照

啟用:/etc/sysconfig/yast2 中將 USE_SNAPPER 設定為 yes

停用:/etc/sysconfig/yast2 中將 USE_SNAPPER 設定為 no

預設系統會啟用管理快照。

7.1.3.2 控制安裝快照

使用 YaST 或 Zypper 安裝套件時所建立的快照對由 snapper-zypp-plugin 處理。何時建立快照由 XML 組態檔案 /etc/snapper/zypp-plugin.conf 定義。依預設,該檔案如下所示︰

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <snapper-zypp-plugin-conf>
 3  <solvables>
 4   <solvable match="w"1 important="true"2>kernel-*3</solvable>
 5   <solvable match="w" important="true">dracut</solvable>
 6   <solvable match="w" important="true">glibc</solvable>
 7   <solvable match="w" important="true">systemd*</solvable>
 8   <solvable match="w" important="true">udev</solvable>
 9   <solvable match="w">*</solvable>4
10  </solvables>
11 </snapper-zypp-plugin-conf>

1

match 屬性定義模式是 Unix 外圍程序樣式的萬用字元 (w) 還是 Python正規表示式 (re)。

2

如果符合指定模式且對應的套件標示為 important (例如核心套件),則快照也會標示為 important。

3

用於比對套件名稱的模式。根據 match 屬性的設定,特殊字元也可能會被解譯為外圍程序萬用字元或正規表示式。此模式符合所有以 kernel- 開頭的套件名稱。

4

此行無條件符合所有套件。

使用此組態時,只要安裝套件即會建立快照對 (第 9 行)。如果標示為 important 的核心、dracut、glibc、systemd 或 udev 套件已安裝,快照對也會標示為 important (第 4 行至第 8 行)。系統會評估所有規則。

要停用規則,請使用 XML 備註將其刪除或停用。若想避免系統在每次安裝套件時都建立快照對,可將第 9 行設為備註︰

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <snapper-zypp-plugin-conf>
 3  <solvables>
 4   <solvable match="w" important="true">kernel-*</solvable>
 5   <solvable match="w" important="true">dracut</solvable>
 6   <solvable match="w" important="true">glibc</solvable>
 7   <solvable match="w" important="true">systemd*</solvable>
 8   <solvable match="w" important="true">udev</solvable>
 9   <!-- <solvable match="w">*</solvable> -->
10  </solvables>
11 </snapper-zypp-plugin-conf>

7.1.3.3 建立和掛接新子磁碟區

系統支援在 / 階層下建立新的子磁碟區,並永久掛接該磁碟區。此類子磁碟區將從快照中排除。切勿在現有快照中建立此類子磁碟區,因為在復原之後,您將無法再刪除快照。

SUSE Linux Enterprise Server 上設定了 /@/ 子磁碟區,該子磁碟區用做永久子磁碟區 (例如 /opt/srv/home 等) 的獨立根分割區。您建立和永久掛接的任何新子磁碟區都需要在這個初始根檔案系統中建立。

若要這樣做,請執行以下指令。在此範例中,從 /dev/sda2 建立了一個新子磁碟區 /usr/important

tux > sudo mount /dev/sda2 -o subvol=@ /mnt
tux > sudo btrfs subvolume create /mnt/usr/important
tux > sudo umount /mnt

/etc/fstab 中的相應項目需類似於︰

/dev/sda2 /usr/important btrfs subvol=@/usr/important 0 0
提示
提示:停用寫入時複製 (cow)

子磁碟區可能包含經常變更的檔案,例如虛擬化磁碟影像、資料庫檔案或記錄檔案。如果是這樣,可考慮對此磁碟區停用寫入時複製功能,以免複製磁碟區塊。在 /etc/fstab 中使用 nodatacow 掛接選項可實現此目的︰

/dev/sda2 /usr/important btrfs nodatacow,subvol=@/usr/important 0 0

或者,若要為單個檔案或目錄停用寫入時複製功能,請使用指令 chattr +C 路徑

7.1.3.4 控制快照歸檔

快照會佔用磁碟空間。為了防止磁碟用盡而導致系統中斷,會自動刪除舊快照。預設會保留最多 10 個重要的安裝快照與管理快照,以及最多 10 個普通的安裝快照與管理快照。如果這些快照佔用的空間超過根檔案系統大小的 50%,則會刪除其他快照。永遠會至少保留 4 個重要快照和 2 個普通快照。

如需如何變更這些值的指示,請參閱第 7.5.1 節 「管理現有的組態」

7.1.3.5 對簡易佈建的 LVM 磁碟區使用 Snapper

除了針對 Btrfs 檔案系統建立快照之外,Snapper 還支援針對使用 XFS、Ext4 或 Ext3 格式化之簡易佈建的 LVM 磁碟區建立快照 (但支援對一般 LVM 磁碟區建立快照)。如需 LVM 磁碟區的詳細資訊以及設定指示,請參閱第 12.2 節 「LVM 組態」

若要對簡易佈建的 LVM 磁碟區使用 Snapper,您需要為它建立一個 Snapper 組態。在 LVM 上,需要使用 --fstype=lvm(檔案系統) 指定檔案系統。檔案系統 的有效值有 ext3etx4xfs。範例︰

tux > sudo snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm

您可以依第 7.5.1 節 「管理現有的組態」 中所述根據需求調整此組態。

7.2 使用 Snapper 復原變更

SUSE Linux Enterprise Server 上的 Snapper 已預先設定為充當復原 zypper 和 YaST 所做變更的工具。要充當復原工具,Snapper 設定為在每次執行 zypper 和 YaST 的前後建立一對快照。此外,Snapper 還可讓您還原遭意外刪除或修改的系統檔案。出於此目的需要啟用根分割區的時間軸快照 — 如需詳細資訊,請參閱第 7.1.3.1 節 「停用/啟用快照」

預設會為根分割區及其子磁碟區設定上述的自動快照。為了讓這些快照可供其他分割區 (例如 /home) 使用,您可以建立自訂組態。

重要
重要:復原變更與復原的比較

使用快照還原資料時,您必須知道 Snapper 可以處理兩種完全不同的案例。

復原變更

當如下文所述復原變更時,系統會比較兩個快照,並復原這兩個快照之間的變更。使用此方法還允許明確選取要還原的檔案。

復原

當如第 7.3 節 「透過從快照開機來執行系統復原」中所述執行復原時,系統會重設回建立快照當時的狀態。

復原變更時,還可以將快照與目前系統進行比較。根據此類比較還原全部檔案時,其效果等同於執行復原。但是,還是建議使用第 7.3 節 「透過從快照開機來執行系統復原」中所述的方法復原,因為它的速度更快並且可讓您在執行復原之前複查系統。

警告
警告:資料一致性

在建立快照時,沒有任何一種機制可確保資料的一致性。如果在建立快照的同時寫入某個檔案 (如資料庫),將導致檔案損毀或寫入不完整。還原此類檔案將會導致問題。此外,有些系統檔案 (例如 /etc/mtab) 是絕對不能還原的。因此,強烈建議您始終仔細檢閱已變更檔案及其差異的清單。請只還原真正屬於您要執行回復的檔案。

7.2.1 復原 YaST 和 Zypper 變更

如果您在安裝期間使用 Btrfs 設定根分割區,系統將會自動安裝 Snapper (已預先設定為用於復原 YaST 或 Zypper 所做的變更)。每當您啟動 YaST 模組或 Zypper 交易時,都會建立兩個快照︰擷取啟動模組之前檔案系統狀態的前快照,以及完成模組之後的後快照

您可以使用 YaST Snapper 模組或 snapper 指令行工具,透過從前快照還原檔案來復原 YaST/Zypper 所做的變更。比較兩個快照時,這些工具還可讓您查看哪些檔案已經過變更。此外,您還可以顯示某檔案的兩個版本之間的差異 (diff)。

程序 7.1︰ 使用 YaST Snapper 模組復原變更
  1. 從 YaST 的其他區段或透過輸入 yast2 snapper 啟動Snapper模組。

  2. 請確定目前組態設為。除非您手動新增了自己的 Snapper 組態,否則應始終如此設定。

  3. 從清單中選擇一對前快照和後快照。YaST 與 Zypper 快照對都屬於前與後類型。在描述欄中,YaST 快照標示為 zypp(y2base),Zypper 快照標示為 zypp(zypper)

    Image
  4. 按一下顯示變更以開啟兩個快照之間不同的檔案清單。

    Image
  5. 檢閱檔案清單。若要顯示檔案的前版本與後版本之間的差異,請從清單中選取它。

    Image
  6. 要還原一個或多個檔案,請勾選相應的核取方塊來選取相關的檔案或目錄。按一下還原選定項目,然後按一下確認該動作。

    Image

    要還原單個檔案,請按一下其名稱以啟動差異比對檢視。按一下從第一個還原,然後按一下確認您的選擇。

程序 7.2︰ 使用 snapper 指令復原變更
  1. 執行 snapper list -t pre-post 取得 YaST 和 Zypper 快照的清單。在描述欄中,YaST 快照標示為 yast MODULE_NAME;Zypper 快照標示為 zypp (zypper)

    tux > sudo snapper list -t pre-post
    Pre # | Post # | Pre Date                      | Post Date                     | Description
    ------+--------+-------------------------------+-------------------------------+--------------
    311   | 312    | Tue 06 May 2014 14:05:46 CEST | Tue 06 May 2014 14:05:52 CEST | zypp(y2base)
    340   | 341    | Wed 07 May 2014 16:15:10 CEST | Wed 07 May 2014 16:15:16 CEST | zypp(zypper)
    342   | 343    | Wed 07 May 2014 16:20:38 CEST | Wed 07 May 2014 16:20:42 CEST | zypp(y2base)
    344   | 345    | Wed 07 May 2014 16:21:23 CEST | Wed 07 May 2014 16:21:24 CEST | zypp(zypper)
    346   | 347    | Wed 07 May 2014 16:41:06 CEST | Wed 07 May 2014 16:41:10 CEST | zypp(y2base)
    348   | 349    | Wed 07 May 2014 16:44:50 CEST | Wed 07 May 2014 16:44:53 CEST | zypp(y2base)
    350   | 351    | Wed 07 May 2014 16:46:27 CEST | Wed 07 May 2014 16:46:38 CEST | zypp(y2base)
  2. 使用下列指令取得快照對的已變更檔案清單︰snapper status ..。含有內容變更的檔案以 c 標示,新增的檔案以 + 標示,刪除的檔案以 - 標示。

    tux > sudo snapper status 350..351
    +..... /usr/share/doc/packages/mikachan-fonts
    +..... /usr/share/doc/packages/mikachan-fonts/COPYING
    +..... /usr/share/doc/packages/mikachan-fonts/dl.html
    c..... /usr/share/fonts/truetype/fonts.dir
    c..... /usr/share/fonts/truetype/fonts.scale
    +..... /usr/share/fonts/truetype/みかちゃん-p.ttf
    +..... /usr/share/fonts/truetype/みかちゃん-pb.ttf
    +..... /usr/share/fonts/truetype/みかちゃん-ps.ttf
    +..... /usr/share/fonts/truetype/みかちゃん.ttf
    c..... /var/cache/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-x86_64.cache-4
    c..... /var/lib/rpm/Basenames
    c..... /var/lib/rpm/Dirnames
    c..... /var/lib/rpm/Group
    c..... /var/lib/rpm/Installtid
    c..... /var/lib/rpm/Name
    c..... /var/lib/rpm/Packages
    c..... /var/lib/rpm/Providename
    c..... /var/lib/rpm/Requirename
    c..... /var/lib/rpm/Sha1header
    c..... /var/lib/rpm/Sigmd5
  3. 若要顯示特定檔案的差異,請執行 snapper diff .. 檔案名稱。如果不指定檔案名稱,將會顯示所有檔案的差異。

    tux > sudo snapper diff 350..351 /usr/share/fonts/truetype/fonts.scale
    --- /.snapshots/350/snapshot/usr/share/fonts/truetype/fonts.scale       2014-04-23 15:58:57.000000000 +0200
    +++ /.snapshots/351/snapshot/usr/share/fonts/truetype/fonts.scale       2014-05-07 16:46:31.000000000 +0200
    @@ -1,4 +1,4 @@
    -1174
    +1486
     ds=y:ai=0.2:luximr.ttf -b&h-luxi mono-bold-i-normal--0-0-0-0-c-0-iso10646-1
     ds=y:ai=0.2:luximr.ttf -b&h-luxi mono-bold-i-normal--0-0-0-0-c-0-iso8859-1
    [...]
  4. 若要還原一或多個檔案,請執行 snapper -v undochange .. 檔案名稱。如果不指定檔案名稱,將會還原所有已變更的檔案。

    tux > sudo snapper -v undochange 350..351
         create:0 modify:13 delete:7
         undoing change...
         deleting /usr/share/doc/packages/mikachan-fonts
         deleting /usr/share/doc/packages/mikachan-fonts/COPYING
         deleting /usr/share/doc/packages/mikachan-fonts/dl.html
         deleting /usr/share/fonts/truetype/みかちゃん-p.ttf
         deleting /usr/share/fonts/truetype/みかちゃん-pb.ttf
         deleting /usr/share/fonts/truetype/みかちゃん-ps.ttf
         deleting /usr/share/fonts/truetype/みかちゃん.ttf
         modifying /usr/share/fonts/truetype/fonts.dir
         modifying /usr/share/fonts/truetype/fonts.scale
         modifying /var/cache/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-x86_64.cache-4
         modifying /var/lib/rpm/Basenames
         modifying /var/lib/rpm/Dirnames
         modifying /var/lib/rpm/Group
         modifying /var/lib/rpm/Installtid
         modifying /var/lib/rpm/Name
         modifying /var/lib/rpm/Packages
         modifying /var/lib/rpm/Providename
         modifying /var/lib/rpm/Requirename
         modifying /var/lib/rpm/Sha1header
         modifying /var/lib/rpm/Sigmd5
         undoing change done
警告
警告:回復使用者新增

不建議透過使用 Snapper 回復變更的方式回復使用者新增。因為快照中排除了某些目錄,屬於這些使用者的檔案將保留在檔案系統中。如果使用已刪除使用者的使用者 ID 建立使用者,則此使用者將繼承這些檔案。因此,強烈建議您使用 YaST使用者和群組管理工具來移除使用者。

7.2.2 使用 Snapper 還原檔案

除了安裝與管理快照之外,Snapper 還會建立時間軸快照。您可以使用這些備份快照來還原不小心刪除的檔案或還原舊版檔案。利用 Snapper 的差異比對功能,您還可以瞭解在特定時間點執行了哪些修改。

還原檔案功能對於預設不會建立快照的子磁碟區或分割區上的資料尤其有用。例如,要從主目錄還原檔案,可以為自動建立時間軸快照的 /home 建立單獨的 Snapper 組態。如需指示,請參閱第 7.5 節 「建立和修改 Snapper 組態」

警告
警告:還原檔案與復原的比較

從根檔案系統 (由 Snapper 的根組態定義) 建立的快照可用於執行系統復原。建議您使用從快照開機然後執行復原的方式執行此復原。如需詳細資料,請參閱第 7.3 節 「透過從快照開機來執行系統復原」

也可使用從根檔案系統快照還原所有檔案的方式執行復原 (如下文所述)。但我們不建議採用這種方法。您可以還原單個檔案 (如 /etc 目錄中的組態檔案),但不能從快照還原整份檔案清單中的檔案。

此限制僅影響從根檔案系統建立的快照!

程序 7.3︰ 使用 YaST Snapper 模組還原檔案
  1. 從 YaST 的其他區段或透過輸入 yast2 snapper 啟動Snapper模組。

  2. 選擇要從中選擇快照的目前組態

  3. 選取要從中還原檔案的時間軸快照,並選擇顯示變更。時間軸快照屬於單一類型,以時間軸描述。

  4. 按一下檔案名稱,從文字方塊中選取一個檔案。隨即顯示快照版本與目前系統之間的差異。勾選該核取方塊以選取要還原的檔案。對所有您要還原的檔案執行此操作。

  5. 按一下還原選定項目,然後按一下確認該動作。

程序 7.4︰ 使用 snapper 指令還原檔案
  1. 執行以下指令獲取特定組態之時間軸快照的清單︰

    tux > sudo snapper -c CONFIG list -t single | grep timeline

    CONFIG 需要以現有的 Snapper 組態取代。使用 snapper list-configs 顯示清單。

  2. 執行以下指令獲取指定快照之已變更檔案的清單︰

    tux > sudo snapper -c CONFIG status SNAPSHOT_ID..0

    以您要從中還原檔案之快照的 ID 取代 SNAPSHOT_ID

  3. (選擇性)透過執行以下指令,列出目前檔案版本與快照中之檔案的差異

    tux > sudo snapper -c CONFIG diff SNAPSHOT_ID..0 FILE NAME

    如果您未指定 <檔案名稱>,則會顯示所有檔案的差異。

  4. 要還原一或多個檔案,請執行

    tux > sudo snapper -c CONFIG -v undochange SNAPSHOT_ID..0 FILENAME1 FILENAME2

    如果未指定檔案名稱,將會還原所有已變更的檔案。

7.3 透過從快照開機來執行系統復原

SUSE Linux Enterprise Server 上包含的 GRUB 2 版本能夠從 Btrfs 快照開機。除 Snapper 的復原功能外,它還可復原設定有誤的系統。只有針對預設 Snapper 組態 (root) 建立的快照才可開機。

重要
重要:支援的組態

SUSE Linux Enterprise Server 12 SP5 開始,僅當根分割區的預設子磁碟區組態未變更時,才支援系統復原。

將快照開機時,該快照中包含之檔案系統的部分會以唯讀模式掛接,而從快照中排除的所有其他檔案系統以及該檔案系統的排除部分會以讀寫模式掛接並且可修改。

重要
重要:復原變更與復原的比較

使用快照還原資料時,您必須知道 Snapper 可以處理兩種完全不同的案例。

復原變更

第 7.2 節 「使用 Snapper 復原變更」中所述復原變更時,系統會比較兩個快照並回復這兩個快照之間的變更。使用此方法還可以將選取的檔案明確排除在還原之外。

復原

如下文所述執行復原時,系統會重設回建立快照當時的狀態。

若要從可開機快照執行復原,必須符合以下要求。執行預設安裝時,系統會進行相應設定。

從可開機快照執行復原的要求
  • 根檔案系統必須是 Btrfs。不支援從 LVM 磁碟區快照開機。

  • 根檔案系統必須位於單一裝置、單一分割區以及單一子磁碟區上。如 /srv 之類從快照中排除的目錄 (如需完整的清單,請參閱第 7.1.2 節 「從快照中排除的目錄」) 可以位於單獨的分割區上。

  • 系統必須能透過已安裝的開機載入程式開機。

要從可開機的快照執行復原,請按如下步驟執行︰

  1. 將系統開機。在開機功能表中,選擇可開機快照並選取您要開機的快照。系統會按日期列出快照清單,最近的快照最先列出。

  2. 登入系統。仔細檢查是否一切都如預期般運作。請注意,您無法對快照中包含的任何目錄執行寫入。但無論您接下來執行什麼操作,您寫入到其他目錄的資料都會遺失。

  3. 根據您是否要執行復原操作,選擇下一步動作︰

    1. 如果您不想對目前狀態的系統執行復原,請重新開機進入目前的系統狀態。然後,您便可選擇另一個快照,或是啟動救援系統。

    2. 若要進行復原,請執行

      tux > sudo snapper rollback

      並在之後重新開機。在開機螢幕上,選擇預設開機項目以重新開機到已恢復的系統。系統即會建立復原前檔案系統狀態的快照。一個全新的讀寫快照即會取代根的預設子磁碟區。如需詳細資料,請參閱第 7.3.1 節 「復原後的快照」

      透過 -d 選項新增快照的描述非常實用。例如︰

      New file system root since rollback on DATE TIME
提示
提示:復原至特定的安裝狀態

如果安裝期間未停用快照,將在初始系統安裝結束時建立初始可開機快照。您隨時可以透過將此快照開機,返回到該狀態。安裝後可依描述識別該快照。

開始對 Service Pack 或新的主要版本進行系統升級時,也會建立可開機快照 (前提是快照未停用)。

7.3.1 復原後的快照

在執行復原之前,將會建立一個執行中檔案系統的快照。快照描述會參考復原中所還原快照的 ID。

對於透過復原建立的快照,其 Cleanup 屬性的值會設為 number。因此,復原快照會在達到設定的快照數後自動刪除。如需詳細資訊,請參閱第 7.7 節 「自動快照清理」。如果快照包含重要資料,請在系統移除快照之前從快照中擷取資料。

7.3.1.1 復原快照範例

例如,在全新安裝之後,系統上存在以下可用的快照︰

root # snapper --iso list
Type   | # |     | Cleanup | Description           | Userdata
-------+---+ ... +---------+-----------------------+--------------
single | 0 |     |         | current               |
single | 1 |     |         | first root filesystem |
single | 2 |     | number  | after installation    | important=yes

執行 sudo snapper rollback 之後,將會建立快照 3,它包含執行復原前系統的狀態。快照 4 是新的預設 Btrfs 子磁碟區,因此是重新開機之後的系統。

root # snapper --iso list
Type   | # |     | Cleanup | Description           | Userdata
-------+---+ ... +---------+-----------------------+--------------
single | 0 |     |         | current               |
single | 1 |     | number  | first root filesystem |
single | 2 |     | number  | after installation    | important=yes
single | 3 |     | number  | rollback backup of #1 | important=yes
single | 4 |     |         |                       |

7.3.2 存取和識別快照開機項目

若要從快照開機,請重新開機並選擇從唯讀快照啟動開機載入程式。此時會開啟一個螢幕,其中列出了所有可開機的快照。最近的快照列在最前面,最舊的快照列在最後面。使用 導覽,然後按 Enter 啟動所選的快照。從開機功能表啟動快照不會立即重新開機,而是開啟所選快照的開機載入程式。

開機載入程式︰快照
圖 7.1︰ 開機載入程式︰快照

開機載入程式中的每個快照項目遵循一種可方便您識別快照的命名規劃︰

[*]1OS2 (KERNEL3,DATE4TTIME5,DESCRIPTION6)

1

如果快照標示為重要,該項將帶有 * 標記。

2

作業系統標籤。

4

採用 YYYY-MM-DD 格式的日期。

5

採用 HH:MM 格式的時間。

6

此欄位包含快照的描述。對於手動建立的快照,這是使用選項 --description 建立的字串,或自訂字串 (請參閱提示:為開機載入程式快照項目設定自訂描述)。對於自動建立的快照,這是呼叫的工具,例如 zypp(zypper)yast_sw_single。根據開機螢幕的大小,可能會截斷較長的描述。

提示
提示:為開機載入程式快照項目設定自訂描述

可以用自訂字串來取代快照描述欄位中的預設字串。例如,如果自動建立的描述不能充分描述快照,或者使用者提供的描述太長,則這種做法會很有用。若要為快照編號設定自訂字串字串,請使用以下指令︰

tux > sudo snapper modify --userdata "bootloader=STRING" NUMBER

描述的長度不應超過 25 個字元 - 超過此大小的內容無法在開機畫面上正常顯示。

7.3.3 限制

無法進行完整系統復原,即將整個系統還原到與建立快照時完全相同的狀態。

7.3.3.1 從快照中排除的目錄

根檔案系統快照並不包含所有目錄。如需詳細資料和原因,請參閱第 7.1.2 節 「從快照中排除的目錄」。因此,這些目錄中的資料不會還原,也就形成以下限制。

執行復原之後,附加產品和協力廠商軟體可能回無法使用。

如果從快照中排除的子磁碟區 (如 /opt) 中的應用程式還有其他部分資料安裝在該快照中包含的子磁碟區中,則應用程式及附加產品的安裝資料在復原後可能無法使用。重新安裝應用程式或附加產品可解決此問題。

檔案存取問題

如果應用程式在快照以及目前系統之間變更了檔案許可權和/或擁有權,則復原後該應用程式可能無法存取這些檔案。請在復原之後重設受影響檔案的許可權和/或擁有權。

不相容的資料格式

如果服務或應用程式在快照和目前系統之間建立了新的資料格式,則復原之後該應用程式可能無法讀取受影響的資料檔案。

混合代碼和資料的子磁碟區

/srv 等子磁碟區可能同時包含代碼和資料。復原可能導致代碼不起作用。例如,降級 PHP 版本可能導致該 Web 伺服器之 PHP 程序檔損毀。

使用者資料

如果復原從系統移除了使用者,但這些使用者所擁有的資料存在於快照排除的目錄中,則這些資料不會予以移除。如果使用相同使用者 ID 建立使用者,則此使用者將繼承這些檔案。使用 find 等工具尋找並移除孤立的檔案。

7.3.3.2 不復原開機載入程式資料

無法復原開機載入程式,因為開機載入程式的所有階段必須組合在一起共同作用。而執行 /boot 復原則無法保證這一要求。

7.4 在使用者主目錄中啟用 Snapper

您可以為使用者的 /home 目錄啟用快照,以便為以下多個使用案例提供支援:

  • 個人使用者可以管理自己的快照和復原。

  • 系統使用者,例如要追蹤組態檔案、文件等資料副本的資料庫、系統和網路管理員。

  • Samba 與主目錄和 Btrfs 後端進行共用。

每個使用者的目錄都是 /home 的 Btrfs 子磁碟區。您可以手動設定快照 (請參閱第 7.4.3 節 「手動啟用主目錄中的快照」),但更便捷的方式是使用 pam_snapperpam_snapper 套件用於安裝 pam_snapper.so 模組和輔助程式程序檔,這些模組和程序檔可自動建立使用者和設定 Snapper。

pam_snapper 提供與 useradd 指令、插入式驗證模組 (PAM) 及 Snapper 的整合。依預設,它會在使用者登入和登出時建立快照;當某些使用者在很長一段時間內都處於登入狀態時,它還會建立基於時間的快照。您可以使用標準 Snapper 指令和組態檔案來變更預設值。

7.4.1 安裝 pam_snapper 和建立使用者

最簡單的方法是使用格式化為 Btrfs 的新 /home 目錄,並在沒有現有使用者的情況下開始。安裝 pam_snapper

root # zypper in pam_snapper

將下面一行新增至 /etc/pam.d/common-session 中:

session optional pam_snapper.so

使用 /usr/lib/pam_snapper/pam_snapper_useradd.sh 程序檔建立新使用者和主目錄。該程序檔預設會進行試執行。請編輯程序檔,以將 DRYRUN=1 變更為 DRYRUN=0。現在,您便可以建立新使用者:

root # /usr/lib/pam_snapper/pam_snapper_useradd.sh \
username group passwd=password
Create subvolume '/home/username'
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.

使用者首次登入時,/etc/skel 中的檔案將會複製到使用者主目錄。列出您的 Snapper 組態,以驗證是否已建立使用者的組態:

root # snapper list --all
Config: home_username, subvolume: /home/username
Type   | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+------+------+---------+-------------+---------
single | 0 |       |      | root |         | current     |

一段時間之後,此輸出中將會填入快照清單,使用者可以使用標準 Snapper 指令對其進行管理。

7.4.2 移除使用者

使用 /usr/lib/pam_snapper/pam_snapper_userdel.sh 程序檔移除使用者。該程序檔預設會進行試執行,請編輯程序檔,以將 DRYRUN=1 變更為 DRYRUN=0。此操作將移除使用者、使用者的主子磁碟區、Snapper 組態,並會刪除所有快照。

root # /usr/lib/pam_snapper/pam_snapper_userdel.sh username

7.4.3 手動啟用主目錄中的快照

使用 Snapper 手動設定使用者主目錄的步驟如下。/home 必須已格式化為 Btrfs,並且目前尚未建立使用者。

root # btrfs subvol create /home/username
root # snapper -c home_username create-config /home/username
root # sed -i -e "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"username\"/g" \
/etc/snapper/configs/home_username
root # yast users add username=username home=/home/username password=password
root # chown username.group /home/username
root # chmod 755 /home/username/.snapshots

7.5 建立和修改 Snapper 組態

每個分割區或 Btrfs 子磁碟區都有一個專用的組態檔案用於定義 Snapper 的行為方式。這些組態檔案位於 /etc/snapper/configs/ 下。

如果根檔案系統足夠大 (大約有 12 GB),安裝時將自動對根檔案系統 / 啟用快照。相應的預設組態命名為 root。該組態可建立和管理 YaST 及 Zypper 快照。如需預設值清單,請參閱第 7.5.1.1 節 「組態資料」

注意
注意:啟用快照所需的最小根檔案系統大小

第 7.1 節 「預設設定」中所述,若要啟用快照,根檔案系統中需要有額外的可用空間。所需空間取決於所安裝的套件數量以及快照中包括的磁碟區變更量,另外還取決於快照頻率和歸檔的快照數。

若要在安裝期間自動啟用快照,需要符合最小根檔案系統大小。此大小約為 12 GB。將來,依據基礎系統的架構和大小的不同,此值可能會發生變化。它取決於安裝媒體內 /control.xml 檔案中以下標記的值︰

<root_base_size>
<btrfs_increase_percentage>

該值透過下面的公式計算得出︰ROOT_BASE_SIZE * (1 + BTRFS_INCREASE_PERCENTAGE/100)

請記住,此值是最小大小。請考慮分給根檔案系統更多空間。一般而言,兩倍於未啟用快照時所需的大小即可。

您可以為其他格式為 Btrfs 的分割區或 Btrfs 分割區上的現有子磁碟區建立您自己的組態。在下面的範例中,我們將設定 Snapper 組態以用於備份掛接於 /srv/www 且採用 Btrfs 格式之獨立分割區上的 Web 伺服器資料。

建立組態後,您可以使用 snapper 自身或 YaST Snapper 模組從這些快照中還原檔案。在 YaST 中,您需要選取目前組態,同時還需要使用全域參數 -c 指定 snapper 的組態 (例如 snapper -c myconfig list)。

若要建立新的 Snapper 組態,請執行 snapper create-config

tux > sudo snapper -c www-data1 create-config /srv/www2

1

組態檔案的名稱。

2

要建立快照之分割區或 Btrfs 子磁碟區的掛接點。

此指令將會使用 /etc/snapper/config-templates/default 中的合理預設值建立一個新的組態檔案 /etc/snapper/configs/www-data。如需如何調整這些預設值的指示,請參閱第 7.5.1 節 「管理現有的組態」

提示
提示:組態預設值

新組態的預設值取自 /etc/snapper/config-templates/default。若要使用您自己的一組預設值,請在同一目錄中建立此檔案的副本,然後根據您的需求進行調整。若要使用該副本,請使用 create-config 指令指定 -t 選項︰

tux > sudo snapper -c www-data create-config -t MY_DEFAULTS /srv/www

7.5.1 管理現有的組態

snapper 提供多個用於管理現有組態的子指令。您可以列出、顯示、刪除及修改它們︰

列出組態

使用指令 snapper list-configs 可獲取所有現有組態︰

tux > sudo snapper list-configs
Config | Subvolume
-------+----------
root   | /
usr    | /usr
local  | /local
顯示組態

使用子指令 snapper -c CONFIG get-config 可顯示指定的組態。Config 需要使用 snapper list-configs 所顯示的組態名稱取代。如需有關組態選項的詳細資訊,請參閱第 7.5.1.1 節 「組態資料」

若要顯示預設組態,請執行

tux > sudo snapper -c root get-config
修改組態

使用子指令 snapper -c CONFIG set-config OPTION=VALUE 可修改指定組態中的選項。Config 需要使用 snapper list-configs 所顯示的組態名稱取代。OPTIONVALUE 的可能的值列於第 7.5.1.1 節 「組態資料」中。

刪除組態

使用子指令 snapper -c CONFIG delete-config 可刪除組態。Config 需要使用 snapper list-configs 所顯示的組態名稱取代。

7.5.1.1 組態資料

每個組態都包含可以從指令行修改的選項清單。以下清單提供每個選項的詳細資料。若要變更某個值,請執行 snapper -c 組態 set-config "索引鍵="

ALLOW_GROUPSALLOW_USERS

授予一般使用者快照的使用權限。如需相關資訊,請參閱第 7.5.1.2 節 「以一般使用者身分使用 Snapper」

預設值為 ""

BACKGROUND_COMPARISON

定義建立前後快照後是否應在背景中對它們進行比較。

預設值為 "yes"

EMPTY_*

為包含相同「前」快照和「後」快照的快照組定義清理演算法。如需詳細資料,請參閱第 7.7.3 節 「清理無差異的快照組」

FSTYPE

分割區的檔案系統類型。請勿進行變更。

預設值為 "btrfs"

NUMBER_*

為安裝快照與管理快照定義清理演算法。如需詳細資料,請參閱第 7.7.1 節 「清理編號快照」

QGROUP / SPACE_LIMIT

將定額支援新增至清理演算法。如需詳細資料,請參閱第 7.7.5 節 「新增磁碟定額支援」

SUBVOLUME

要建立快照之分割區或子磁碟區的掛裝點。請勿進行變更。

預設值為 "/".

SYNC_ACL

如果一般使用者要使用 Snapper (請參閱第 7.5.1.2 節 「以一般使用者身分使用 Snapper」),他們必須能存取 .snapshot 目錄,並且能讀取其中的檔案。如果 SYNC_ACL 設定為 yes,Snapper 會使用 ACL 自動允許 ALLOW_USERS 或 ALLOW_GROUPS 項目中的使用者和群組存取該目錄及其中的檔案。

預設值為 "no"

TIMELINE_CREATE

如果設定為 yes,則會每小時建立一個快照。有效值︰yesno.

預設值為 "no"

TIMELINE_CLEANUP / TIMELINE_LIMIT_*

為時間軸快照定義清理演算法。如需詳細資料,請參閱第 7.7.2 節 「清理時間軸快照」

7.5.1.2 以一般使用者身分使用 Snapper

依預設,Snapper 只能由 root 使用者使用。但是,在下列情況中,某些群組或使用者需要能夠建立快照或透過回復至快照來復原變更︰

  • 想要建立 /srv/www 快照的網站管理員

  • 想要建立其主目錄快照的使用者

為了以上這些目的,您可以建立用於授予使用者或/和群組權限的 Snapper 組態。相應的 .snapshots 目錄必須可由指定的使用者讀取和存取。實現這一目的最簡單的方法是將 SYNC_ACL 選項設定為 yes

程序 7.5︰ 讓一般使用者可以使用 Snapper

請注意,此程序中的所有步驟都必須由 root 使用者執行。

  1. 若不存在,請為使用者應該能夠在其上使用 Snapper 的分割區或子磁碟區建立 Snapper 組態。如需指示,請參閱第 7.5 節 「建立和修改 Snapper 組態」。範例︰

    tux > sudo snapper --config web_data create /srv/www
  2. 組態檔案將在 /etc/snapper/configs/CONFIG 下建立,其中 CONFIG 是您在上一步中使用 -c/--config 指定的值 (如 /etc/snapper/configs/web_data)。根據您的需求調整該值;如需詳細資料,請參閱第 7.5.1 節 「管理現有的組態」

  3. 設定 ALLOW_USERS 和/或 ALLOW_GROUPS 的值,以分別向使用者和/或群組授予權限。多個項目需要用 Space 加以分隔。例如,若要向使用者 www_admin 授予權限,請執行︰

    tux > sudo snapper -c web_data set-config "ALLOW_USERS=www_admin" SYNC_ACL="yes"
  4. 現在,指定的使用者和/或群組便可以使用給定的 Snapper 組態。您可以使用 list 指令進行測試,例如︰

    www_admin:~ > snapper -c web_data list

7.6 手動建立和管理快照

Snapper 的功能並不僅限於依照組態自動建立和管理快照;您還可以使用指令行工具或 YaST 模組手動建立快照組 (前快照與後快照) 或單一快照。

所有 Snapper 操作都會對現有組態進行 (如需詳細資料,請參閱第 7.5 節 「建立和修改 Snapper 組態」)。您只能為存在組態的分割區或磁碟區建立快照。預設會使用系統組態 ()。如果您要為您自己的組態建立或管理快照,則必須明確選擇它。使用 YaST 中的目前組態下拉式方塊,或在指令行上指定 -c 選項 (snapper -c MYCONFIG COMMAND)。

7.6.1 快照中繼資料

每個快照都包含快照本身和一些中繼資料。建立快照時,您還需要指定中繼資料。修改快照即表示變更其中繼資料 — 您無法修改其內容。使用 snapper list 顯示現有快照及其中繼資料︰

snapper --config home list

列出組態 home 的快照。若要列出預設組態 (root) 的快照,請使用 snapper -c root listsnapper list

snapper list -a

列出所有現有組態的快照。

snapper list -t pre-post

列出預設 (root) 組態的所有「前」快照與「後」快照組。

snapper list -t single

列出預設 (root) 組態的所有 single 類型快照。

下列中繼資料適用於每個快照︰

  • 類型︰快照類型,請參閱第 7.6.1.1 節 「快照類型」 以取得詳細資料。此資料無法變更。

  • 編號︰快照的唯一編號。此資料無法變更。

  • 前快照編號︰指定相應前快照的編號。僅適用於類型為後的快照。此資料無法變更。

  • 描述︰快照的描述。

  • 使用者資料︰延伸描述,您可在其中以逗號分隔之「鍵=值」清單的形式指定自訂資料︰reason=testing, project=foo。此欄位還用於將快照標示為重要 (important=yes) 並列出建立該快照的使用者 (user=tux)。

  • 清理演算法︰快照的清理演算法,請參閱第 7.7 節 「自動快照清理」 以取得詳細資料。

7.6.1.1 快照類型

Snapper 知道三種不同類型的快照︰前、後與單一。實際上,它們並無差異,但是 Snapper 會以不同的方式處理它們。

修改檔案系統的快照。每個快照都對應一個快照。例如,用於自動建立 YaST/Zypper 快照。

修改檔案系統的快照。每個快照都對應一個快照。例如,用於自動建立 YaST/Zypper 快照。

單一

獨立快照。例如,用於自動按小時建立快照。這是建立快照時的預設類型。

7.6.1.2 清理演算法

Snapper 提供了三種用於清理舊快照的演算法。cron 日常工作中會執行這些演算法。可以定義要在 Snapper 組態中保留的不同類型的快照數量 (如需詳細資料,請參閱第 7.5.1 節 「管理現有的組態」)。

數量

當達到特定的快照計數時刪除舊快照。

時間軸

刪除經過特定期限的舊快照,但會保留若干每小時、每日、每月和每年快照。

空-前-後

刪除無差異的前/後快照對。

7.6.2 建立快照

可透過執行 snapper create 或在 YaST 模組 Snapper 中按一下建立建立快照。下列範例說明如何從指令行建立快照。透過 YaST 介面可便於採用這兩種建立方法。

提示
提示:快照描述

您應始終指定有意義的描述,以便日後能夠識別其用途。透過使用者資料選項可以指定更多資訊。

snappercreate --description "2014 年第 2 週的快照"

為預設 () 組態建立獨立快照 (類型為單一) 並提供描述。因為未指定清理演算法,所以一律不自動刪除快照。

snapper --config home create --description "在 ~tux 中清理"

為名為 home 的自訂組態建立獨立快照 (類型為單一) 並提供描述。因為未指定清理演算法,所以一律不自動刪除快照。

snapper --config home create --description "每日資料備份" --cleanup-algorithm timeline>

為名為 home 的自訂組態建立獨立快照 (類型為單一) 並提供描述。當檔案符合特定於組態中時間軸清理演算法的準則時,將會自動刪除該檔案。

snapper create --type pre--print-number--description "在 Apache 組態清理之前"--userdata "important=yes"

建立類型為的快照並列印快照編號。需要第一個指令才能建立用於儲存狀態的快照對。快照會標示為重要。

snapper create --type post--pre-number 30--description "在 Apache 組態清理之前"--userdata "important=yes"

建立類型為並與快照編號 30 配對的快照。需要第二個指令才能建立用於儲存狀態的快照對。快照會標示為重要。

snapper create --command COMMAND--description "在指令前後"

在執行指令前後自動建立快照對。僅當在指令行上使用 snapper 時,此選項才可用。

7.6.3 修改快照中繼資料

Snapper 可讓您修改快照的描述、清理演算法和使用者資料,所有其他中繼資料則無法變更。下列範例說明如何從指令行修改快照。透過 YaST 介面可便於採用這兩種建立方法。

若要透過指令行修改快照,您需要知道其編號。使用 snapper list 可以顯示所有快照及其編號。

YaST Snapper 模組已列出所有快照。從清單中選擇一個快照,然後按一下修改

snapper modify --cleanup-algorithm "時間軸" 10

修改預設 () 組態之快照 10 的中繼資料。清理演算法設為時間軸

snapper --config home modify --description "每日備份" -cleanup-algorithm "時間軸"120

修改名為 home 的自訂組態之快照 120 的中繼資料。將會設定新的描述並取消設定清理演算法。

7.6.4 刪除快照

若要使用 YaST Snapper 模組刪除快照,請從清單中選擇快照,然後按一下刪除

若要使用指令行工具刪除快照,您需要知道其編號。請透過執行 snapper list 來取得該編號。若要刪除快照,請執行 snapper delete 編號

不允許刪除目前的預設子磁碟區快照。

使用 Snapper 刪除快照時,在背景中執行的 Btrfs 程序將會回收已釋放的空間。因此,可用空間的可見度與可用性將會延遲。如果您希望在刪除快照後立即可以使用釋放的空間,請結合選項 --sync 使用 delete 指令。

提示
提示:刪除快照對

刪除快照時,您應一律刪除其對應的快照 (反之亦然)。

snapper delete 65

刪除預設 () 組態的快照 65。

snapper -c home delete 89 90

刪除名為 home 之自訂組態的快照 89 和 90。

snapper delete --sync 23

刪除預設 () 組態的快照 23,並使釋放的空間立即可用。

提示
提示:刪除未參考的快照

有時,雖然 Btrfs 快照存在,但卻缺少包含 Snapper 中繼資料的 XML 檔案。這種情況表示快照對 Snapper 不可見,需要手動刪除該快照︰

btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot
rm -rf /.snapshots/SNAPSHOTNUMBER
提示
提示:舊快照佔用較多磁碟空間

如果您要刪除快照以釋放硬碟上的空間,請確定先刪除舊快照。快照越舊,它佔用的磁碟空間就越多。

也可以透過 cron 日常工作自動刪除快照。如需詳細資訊,請參閱第 7.6.1.2 節 「清理演算法」

7.7 自動快照清理

一段時間之後,快照大小將變大,佔用的磁碟空間不斷增加。為了防止磁碟上的空間耗盡,Snapper 提供了演算法用於自動刪除舊快照。這些演算法依據時間軸快照和編號快照 (管理快照與安裝快照組) 而異。您可以指定要為每種類型保留的快照數量。

除此之外,您可以指定一個快照空間定額,用於定義快照可佔用的最大磁碟空間量。系統還可以自動刪除無相異的「前」快照與「後」快照組。

清理演算法一律系繫結到單一 Snapper 組態,因此您需要為每個組態指定演算法。若要防止自動刪除特定的快照,請參閱 如何永久保留快照?

預設設定 (root) 設定為清理編號快照以及空的「前」快照與「後」快照組。預設設定中會啟用定額支援,並且快照必須在根分割區上至少留出 20% 的可用磁碟空間。時間軸快照預設為停用,因此,時間軸清理演算法亦已停用。

注意
注意:改進的清理演算法

之前實作的清理演算法僅可確保快照使用的磁碟空間未超過指定數量的磁碟空間 (預設值為 50%)。在某些情況下,這無法防止系統耗盡磁碟空間。自 SUSE Linux Enterprise Server 12 SP1 起,Snapper 的清理演算法進行了改進,在任何情況下都可保留 20% 的可用磁碟空間。

7.7.1 清理編號快照

Snapper 組態的以下參數控制編號快照 (管理快照與安裝快照組) 的清理。

NUMBER_CLEANUP

啟用或停用安裝快照與管理快照組的清理。如果已啟用,則在快照總數超過 NUMBER_LIMIT 和/或 NUMBER_LIMIT_IMPORTANT 指定的數字,以及 NUMBER_MIN_AGE 指定的時限時,會刪除快照組。有效值︰yes (啟用)、no (停用)。

預設值為 "yes"

用於變更或設定值的範例指令︰

tux > sudo snapper -c CONFIG set-config "NUMBER_CLEANUP=no"
NUMBER_LIMIT / NUMBER_LIMIT_IMPORTANT

定義要保留多少個普通和/或重要安裝快照與管理快照組。只會保留最新的快照。如果 NUMBER_CLEANUP 設定為 "no",則忽略此參數。

NUMBER_LIMIT 的預設值為 "2-10"NUMBER_LIMIT_IMPORTANT 的預設值為 "4-10"

用於變更或設定值的範例指令︰

tux > sudo snapper -c CONFIG set-config "NUMBER_LIMIT=10"
重要
重要:範圍值與常數值的比較

如果已啟用定額支援 (請參閱第 7.7.5 節 「新增磁碟定額支援」),則需要將限制指定為最小值-最大值範圍,例如 2-10。如果已停用定額支援,則需要提供常數值,例如 10,否則清理將會失敗並出現錯誤。

NUMBER_MIN_AGE

定義快照在可供自動刪除之前的最短保留期限 (秒)。期限小於此處指定值的快照不會刪除,不論存在多少個這樣的快照。

預設值為 "1800"

用於變更或設定值的範例指令︰

tux > sudo snapper -c CONFIG set-config "NUMBER_MIN_AGE=864000"
注意
注意:限制和期限

NUMBER_LIMITNUMBER_LIMIT_IMPORTANTNUMBER_MIN_AGE 始終會予以評估。只有在滿足全部條件時,才會刪除快照。

如果您希望總是保留 NUMBER_LIMIT* 所定義數量的快照而不考慮其期限,請將 NUMBER_MIN_AGE 設定為 0

下面的範例顯示了保留最近 10 個重要和 10 個普通快照 (不論保留期限) 的組態︰

NUMBER_CLEANUP=yes
NUMBER_LIMIT_IMPORTANT=10
NUMBER_LIMIT=10
NUMBER_MIN_AGE=0

不過,如果您不想保留超過特定期限的快照,請將 NUMBER_LIMIT* 設定為 0,並使用 NUMBER_MIN_AGE 提供期限。

下面的範例顯示了只保留十天以內的快照的組態︰

NUMBER_CLEANUP=yes
NUMBER_LIMIT_IMPORTANT=0
NUMBER_LIMIT=0
NUMBER_MIN_AGE=864000

7.7.2 清理時間軸快照

Snapper 組態的以下參數控制時間軸快照的清理。

TIMELINE_CLEANUP

啟用或停用時間軸快照的清理。如果已啟用,則在快照總數超過 TIMELINE_LIMIT_* 指定的數量以及 TIMELINE_MIN_AGE 指定的期限時,會刪除快照。有效值︰yesno.

預設值為 "yes"

用於變更或設定值的範例指令︰

tux > sudo snapper -c CONFIG set-config "TIMELINE_CLEANUP=yes"
TIMELINE_LIMIT_DAILYTIMELINE_LIMIT_HOURLYTIMELINE_LIMIT_MONTHLYTIMELINE_LIMIT_WEEKLYTIMELINE_LIMIT_YEARLY

要以小時、天、月、週和年保留的快照數量。

每個項目的預設值為 "10",但 TIMELINE_LIMIT_WEEKLY 除外 (預設為 "0")。

TIMELINE_MIN_AGE

定義快照在可供自動刪除之前的最短保留期限 (秒)。

預設值為 "1800"

範例 7.1︰ 時間軸組態範例
TIMELINE_CLEANUP="yes"
TIMELINE_CREATE="yes"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_HOURLY="24"
TIMELINE_LIMIT_MONTHLY="12"
TIMELINE_LIMIT_WEEKLY="4"
TIMELINE_LIMIT_YEARLY="2"
TIMELINE_MIN_AGE="1800"

此組態範例啟用了會自動清理的每小時快照。系統始終會同時評估 TIMELINE_MIN_AGETIMELINE_LIMIT_*。在此範例中,快照在可供刪除之前的最短期限設定為 30 分鐘 (1800 秒)。因為我們建立了每小時快照,所以這可確保僅保留最新的快照。如果將 TIMELINE_LIMIT_DAILY 設為非零值,這表示同時會保留當天的第一個快照。

要保留的快照
  • 每小時︰已建立的最後 24 個快照。

  • 每日︰保留最近 7 天內建立的第一個每日快照。

  • 每月︰保留最近 12 個月內當月最後一天建立的第一個快照。

  • 每週︰保留最近 4 週內當週最後一天建立的第一個快照。

  • 每年︰保留最近 2 年內當年最後一天建立的第一個快照。

7.7.3 清理無差異的快照組

第 7.1.1 節 「快照類型」中所述,每當您執行 YaST 模組或執行 Zypper 時,會在啟動時建立一個「前」快照,在結束時建立一個「後」快照。如果您做出任何變更,則「前」快照與「後」快照沒有差異。在 Snapper 組態中設定以下參數可自動刪除此類空白快照組︰

EMPTY_PRE_POST_CLEANUP

如果設定為 yes,將會刪除前後快照相同的快照對。

預設值為 "yes"

EMPTY_PRE_POST_MIN_AGE

定義前後快照相同的快照對在自動刪除之前必須保留的最短期限 (以秒為單位)。

預設值為 "1800"

7.7.4 清理手動建立的快照

Snapper 未針對手動建立的快照提供自訂清理演算法。但是,您可以向手動建立的快照指定 number 或 timeline 清理演算法。如果您這麼做,該快照會加入所指定演算法的清理佇列。可以在建立快照時,或者透過修改現有快照來指定清理演算法︰

snapper create --description "Test" --cleanup-algorithm number

為預設 (root) 組態建立獨立快照 (單一類型) 並指定 number 清理演算法。

snapper modify --cleanup-algorithm "時間軸" 25

使用數字 25 修改快照,並指定清理演算法 timeline

7.7.5 新增磁碟定額支援

除了上述 number 和/或 timeline 清理演算法之外,Snapper 還支援定額。您可以定義允許快照佔用的可用空間百分比。此百分比值一律套用至相應 Snapper 組態中定義的 Btrfs 子磁碟區。

如果在安裝期間啟用了 Snapper,則會自動啟用定額支援。如果在安裝後的某個時間手動啟用 Snapper,則可以透過執行 snapper setup-quota 來啟用定額支援。這需要提供有效的組態 (如需詳細資訊,請參閱第 7.5 節 「建立和修改 Snapper 組態」)。

定額支援由 Snapper 組態的以下參數控制。

QGROUP

Snapper 使用的 Btrfs 定額群組。如果未設定,請執行 snapper setup-quota。如果已設定,則僅當您熟悉 man 8 btrfs-qgroup 時方可對其進行變更。此值是使用 snapper setup-quota 設定的,請勿變更。

SPACE_LIMIT

允許快照使用的空間限制,以 1 (100%) 的分數表示。有效值範圍為 0 到 1 (0.1 = 10%,0.2 = 20%...)。

需遵循以下限制和指導方針︰

  • 只能在已啟用現有 number 和/或 timeline 清理演算法的前提下才能啟用定額。如果未啟用任何清理演算法,則無法套用定額限制。

  • 啟用定額支援後,Snapper 會視需要執行兩輪清理。第一輪清理套用針對編號快照和時間軸快照指定的規則。僅當完成這一輪清理後超出定額時,才會在第二輪清理中套用定額特定的規則。

  • 即使已啟用定額支援,Snapper 也永遠會保留 NUMBER_LIMIT*TIMELINE_LIMIT* 值指定的快照數量,而不論是否超出了定額。因此,建議為 NUMBER_LIMIT*TIMELINE_LIMIT* 指定範圍值 (MIN-MAX),以確定可以套用定額。

    例如,如果設定了 NUMBER_LIMIT=5-20,Snapper 將執行第一輪清理,並將普通的編號快照數量減至 20 個。如果這 20 個快照超出定額,Snapper 將在第二輪清理中刪除最舊的快照,直到符合定額限制。永遠會保留最少五個快照,不論這些快照佔用了多少空間。

7.8 常見問題解答

問: 為何 Snapper 從不顯示 /var/log/tmp 及其他目錄中的變更?

對於我們確定要從快照中排除的某些目錄,請參閱第 7.1.2 節 「從快照中排除的目錄」獲取清單及排除原因。為了將某路徑從快照中排除,我們為該路徑建立了子磁碟區。

問: 快照使用了多少磁碟空間?如何釋放磁碟空間?

目前,Btrfs 工具無法顯示快照配置的磁碟空間量。但是,如果您啟用了定額,則可以判斷在刪除所有快照後可以釋放多少空間︰

  1. 取得定額群組 ID (在以下範例中為 1/0)︰

    tux > sudo snapper -c root get-config | grep QGROUP
    QGROUP                 | 1/0
  2. 重新掃描子磁碟區定額︰

    tux > sudo btrfs quota rescan -w /
  3. 顯示定額群組 (在以下範例中為 1/0) 的資料︰

    tux > sudo btrfs qgroup show / | grep "1/0"
    1/0           4.80GiB    108.82MiB

    第三欄顯示刪除所有快照時可釋放的空間數量 (108.82MiB)。

為了釋放包含快照之 Btrfs 分割區上的空間,您需要刪除不需要的快照,而不是檔案。與新快照相比,較舊的快照佔用的空間更多。如需詳細資料,請參閱第 7.1.3.4 節 「控制快照歸檔」

從一個 Service Pack 升級到另一個 Service Pack 會導致快照佔用系統子磁碟區上的大量磁碟空間,這是因為有許多資料進行了變更 (套件更新)。對於不再需要的快照,建議您手動將其刪除。如需詳細資料,請參閱第 7.6.4 節 「刪除快照」

問: 能否從開機載入程式將快照開機?

能,請參閱第 7.3 節 「透過從快照開機來執行系統復原」獲取詳細資訊。

問: 如何永久保留快照?

目前,Snapper 無法防止手動刪除快照。但是,您可以防止清理演算法自動刪除快照。除非您使用 第 7.6.2 節 「建立快照」--cleanup-algorithm 指定清理演算法,否則不會為手動建立的快照 (請參閱) 指定清理演算法。總是為自動建立的快照指定 numbertimeline 演算法。若要從一或多個快照中移除此類指定,請執行以下步驟︰

  1. 列出所有可用的快照︰

    tux > sudo snapper list -a
  2. 記住您要防止刪除的快照數。

  3. 執行以下指令,並用您記住的數字取代數字預留位置︰

    tux > sudo snapper modify --cleanup-algorithm "" #1 #2 #n
  4. 再次執行 snapper list -a 來檢查結果。在 Cleanup 欄中,與修改的快照相對應的項目現在應該為空白。

問: 何處可以取得有關 Snapper 的詳細資訊?

請造訪 Snapper 首頁,網址為 http://snapper.io/