創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2021年5月22日 星期六

restic命令行備份程式

概要

本文簡單介紹restic備份程式,及其安裝方式與簡單使用例,展示環境為Ubuntu MATE 20.04。

restic簡介

restic是以Go語言開發的備份程式,採BSD授權的開放源碼軟體,支援Linux, BSD, macOS與Windows作業系統。備份儲存的目的位置可以在本機,或者是遠端的自建或線上服務,像Amazon S3、Alibaba OSS、Microsoft Azure Blob Storage、Google Cloud Storage。備份過程加密。

restic開發工作已歷數年,看來相當活躍,目前版號是0.12.0,已經有相當不錯的功能,使用上並不複雜,提供清楚的官方說明文件,可挑自己有需求的方面查閱即可。為避免文章過長,以下僅挑個簡單的使用情境——備份儲存在本機——做示例說明,其他情境的詳細情形可查閱說明文件。

安裝

單一執行檔,可以在專案的release頁下載二進制執行檔的壓縮檔下來,或者下載源碼自行編譯。Ubuntu可以用apt安裝,但這裡採用snap安裝,因版本會較新:


$ sudo snap install restic --classic

restic有提供自我升級版本的功能,故安裝好後,往後若想升級新版本可以執行restic self-update,不過因為snap會自動檢查並升級軟體版本,所以這工作就交給snap處理即可。

裝好後執行 restic 會顯示簡介與使用方法,其中的簡介文字如下:


restic is a backup program which allows saving multiple revisions of files and
directories in an encrypted repository stored on different backends.

使用方法的文字這裡就不錄了,自行執行一次就看到了。看到上面repository這字是不是也聯想到 git ?是的,使用restic時在某些方面會有點像git的用法,譬如這兩者都可以加tag,不過兩者的工作性質並不同,只是某些工作方式在觀念上有些雷同。上述簡介文字中提到different backends即前述的備份儲存,這裡以本機為例,所以先準備個本機用的儲存倉庫以存放備份。

準備本機倉庫

假定備份要放到 /media/MyDisk/backup/ ,在此目錄做初始化工作,有點類似 git init 的做法:


$ restic init --repo /media/MyDisk/backup/

要輸入兩次密碼,然後顯示執行結果:


enter password for new repository: 
enter password again: 
created restic repository 7bf75a00ee at /media/MyDisk/backup

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

密碼務必記好,否則往後就沒戲唱了。完成後在 /media/MyDisk/backup/ 中會出現一些子目錄與檔案,這些是restic記錄資料用的,別去動它。

也可以用參數來指定密碼檔,記得密碼檔要保護好。

以上是儲存在本機的作法,如果備份是儲存到遠端機器,請查閱說明文件以了解如何在遠端機器初始存放備份用的倉庫。

備份、還原等工作

備份

假定要備份 ~/dotfiles/ :


$ restic backup ~/dotfiles -r /media/MyDisk/backup --verbose

輸入正確的密碼後顯示執行結果:


open repository
enter password for repository: 
repository 7bf75a00 opened successfully, password is correct
created new cache in /home/fygul/.cache/restic
lock repository
load index files
no parent snapshot found, will read all files
start scan on [/home/fygul/dotfiles/]
start backup on [/home/fygul/dotfiles/]
scan finished in 0.530s: 3 files, 4.761 KiB

Files:           3 new,     0 changed,     0 unmodified
Dirs:            3 new,     0 changed,     0 unmodified
Data Blobs:      3 new
Tree Blobs:      4 new
Added to the repo: 6.876 KiB

processed 3 files, 4.761 KiB in 0:00
snapshot 73813906 saved

restic的備份作法是採用儲存快照snapshot(即資料夾中在某特定個時間點的內容)的方式,上述是全新的快照會擷取所有檔案,最後一行顯示編號 73813906 的快照已儲存。

有提供包含 include 與排除 exclude 的功能,這方面請見說明文件。

列示快照


$ restic snapshots -r /media/MyDisk/backup/

顯示目前有一個快照:


enter password for repository: 
repository 7bf75a00 opened successfully, password is correct
ID        Time                 Host        Tags        Paths
---------------------------------------------------------------------------
73813906  2021-05-16 22:56:57  LH532                   /home/fygul/dotfiles
---------------------------------------------------------------------------
1 snapshots

此時如果在此資料夾中做了些修改,比如新增一個檔案,再次以restic備份時,新的快照就只加入新內容,而不加入與前一快照重複的東西:


$ restic backup ~/dotfiles/ -r /media/MyDisk/backup/ -v

這回顯示發現有既有的快照 73813906 ,只存新增的東西到新的快照中:


open repository
enter password for repository: 
repository 7bf75a00 opened successfully, password is correct
lock repository
load index files
using parent snapshot 73813906
start scan on [/home/fygul/dotfiles/]
start backup on [/home/fygul/dotfiles/]
scan finished in 0.529s: 4 files, 4.761 KiB

Files:           1 new,     0 changed,     3 unmodified
Dirs:            0 new,     3 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      4 new
Added to the repo: 2.421 KiB

processed 4 files, 4.761 KiB in 0:00
snapshot 2ff53254 saved

再次列示快照:


$ restic snapshots -r /media/MyDisk/backup/

顯示有二個快照:


enter password for repository: 
repository 7bf75a00 opened successfully, password is correct
ID        Time                 Host        Tags        Paths
---------------------------------------------------------------------------
73813906  2021-05-16 22:56:57  LH532                   /home/fygul/dotfiles
2ff53254  2021-05-16 23:10:23  LH532                   /home/fygul/dotfiles
---------------------------------------------------------------------------
2 snapshots

還原資料

想把備份中的資料還原時,有二種作法:一是直接自備份的快照中還原;二是透過掛載點的方式,自行從掛載點把資料複製出來。

自快照中還原

比如想把上述 ID 2ff53254的快照內容還原到 ~/newdotfiles/ 。


$ restic -r /media/MyDisk/backup/ restore 2ff53254 --target ~/newdotfiles/

enter password for repository: 
repository 7bf75a00 opened successfully, password is correct
restoring <Snapshot 2ff53254 of [/home/fygul/dotfiles] at 2021-05-16 23:10:23.091840909 +0800 CST by fygul@LH532> to /home/fygul/newdotfiles/

這樣還原的資料路徑會包含上層目錄。

以mount來還原

先準備好一個掛載點,比如:


$ mkdir -p ~/mnt/restic

再用 restic mount 命令把倉庫掛載到前述掛載點:


$ restic -r /media/MyDisk/backup/ mount ~/mnt/restic/

enter password for repository: 
repository 7bf75a00 opened successfully, password is correct
Now serving the repository at /home/fygul/mnt/restic/
When finished, quit with Ctrl-c or umount the mountpoint.```

掛載好後,可用檔案總管之類的GUI程式開啟掛載點,自行複製所要的檔案出來。完成後在上述命令行按 Ctrl-C 來卸載掛載點。

刪除快照

例如想刪除前述的 73813906 :


$ restic -r /media/MyDisk/backup/ forget 73813906 -n

此例加了 -n--dry-run 並不會真的刪除,而只會列示出將要刪除的快照:


enter password for repository: 
repository 7bf75a00 opened successfully, password is correct
Would have removed the following snapshots:
{73813906}

真要刪除時, forget 做完還要再 prune 才會真正刪除資料;或者 forget 加上 --prune 就會自動做 prune

上述是手動刪除單一快照的作法,另外也可依某個原則來刪快照,如只留最後3個 --keep-last 3

結語

本文僅簡單介紹 restic 的使用,官方文件有較詳細的說明,其中有些細節建議還是要了解一下,例如倉庫在遠端機器時,刪除快照時可能會涉及 repacking ,此工作會較耗時。

restic體積小巧,功能不差,是 tar 或是其他備份工具程式之外的好選擇。

沒有留言:

張貼留言