Restic 與 BorgBackup 怎麼選?S3、SSH 備份比較
Restic 可直接連接 S3 與物件儲存,不需遠端安裝程式;Borg 需透過 SSH 在遠端執行 Borg,換來更快速度。本文用實際指令比較兩者。
Restic 與 BorgBackup,一段話說明
Restic 與 BorgBackup 都能執行相同的核心工作:對 Linux 伺服器進行去重、加密及增量備份。決定選擇的差異在於備份的存放位置。Restic 原生支援 S3 及其他物件儲存 API,因此儲存貯體可直接作為目標,遠端不需要安裝任何程式。Borg 則需要在存放儲存庫的機器上安裝 borg 程式,因為 Borg 儲存庫是由程序提供服務,而不是由檔案系統或 API 提供。如果目標是物件儲存,答案已經很明確。如果目標是由你管理的另一台 Linux 主機,則可以使用 Borg,而且通常速度更快。
其他差異都較小。兩者都會使用內容定義分塊來切割檔案,因此 40 GB 的目錄若只有 200 MB 變更,上傳量約為 200 MB。兩者都會在用戶端加密。兩者都能使用 FUSE(使用者空間檔案系統)掛載快照,讓你複製出單一檔案。截至 2026 年 7 月,restic 版本為 0.19.1,而 Borg 的穩定系列為 1.4,目前版本為 1.4.5。Borg 2.0 已經測試多年,但仍標示為僅供測試,因此目前應部署 1.4。
儲存庫模型才是真正的差異
restic 儲存庫是由檔案組成的目錄:config、keys/、snapshots/、index/ 和 data/,其中包含許多封裝檔案。讀取儲存庫不需要其他內容。因此,restic 能支援許多後端。任何能夠放置、取得、列出及刪除 blob 的儲存區,都可以存放 restic 儲存庫。這使單一二進位檔能支援本機路徑、SFTP、自有的 REST 伺服器、S3、Backblaze B2、Azure、Google Cloud Storage,以及 rclone 能存取的任何位置。
Borg 儲存庫同樣是磁碟上的檔案,但 Borg 不會透過簡單傳輸方式與其通訊。對於遠端儲存庫,Borg 會透過 SSH 在遠端啟動 borg serve,並與該程序使用自有通訊協定。伺服器端會執行實際工作:保存儲存庫、套用交易,以及回應索引查詢。因此 Borg 沒有 S3 後端,專案也未新增此功能。因為儲存貯體中沒有可執行的程序。
這項單一設計差異造成了下列大部分的實務差異。
# restic: the repository is a URL, and the backend is part of it
restic -r /srv/restic-repo init
restic -r sftp:backup@198.51.100.20:/srv/restic-repo init
restic -r s3:s3.us-east-1.amazonaws.com/my-backup-bucket init# borg: a local path, or user@host:path, with borg installed on that host
borg init --encryption=repokey-blake2 /srv/borg/vps1
borg init --encryption=repokey-blake2 backup@198.51.100.20:/srv/borg/vps1加密:其中一者可以關閉
Restic 一律使用加密。它沒有未加密模式。restic init 會要求輸入密碼,並使用 scrypt 從密碼衍生金鑰;之後寫入的每個 pack 檔案都會經過加密與驗證。密碼遺失後,資料也會遺失,因為設計上不存在復原途徑。
Borg 會在建立儲存庫時決定是否加密,而且此選擇無法變更。borg init --encryption=repokey 會將加密金鑰保存在儲存庫內,因此只要有通行片語即可還原。--encryption=keyfile 會將金鑰保存在用戶端的 ~/.config/borg/keys/ 中,因此即使有人竊取整個儲存庫,也無法取得任何資料;但你必須另外備份該金鑰檔案,否則將無法讀取封存檔。每種模式都有使用 BLAKE2b 而非 HMAC-SHA256 進行驗證的 -blake2 變體;在不支援 SHA 硬體加速的硬體上,這種變體速度較快。--encryption=none 也存在;當儲存庫位於你擁有的加密磁碟上時,這是實際可用的選擇。
實務規則如下:一般伺服器備份使用 repokey-blake2;儲存庫位於你無法完全信任的位置時使用 keyfile;在租用的機器上絕不使用 none。
壓縮,以及 restic 為何較晚支援壓縮
Borg 從一開始就支援壓縮。預設值為 lz4,因為速度足夠快,適合在所有情況下啟用。zstd 接受 1 到 22 的等級,預設值為 3;zlib 和 lzma 適用於更重視位元組數而非耗時的情況;auto 會針對每個區塊套用啟發式判斷,因此不會對已壓縮的資料重複壓縮。
borg create --compression zstd,3 --stats --progress \
/srv/borg/vps1::'{hostname}-{now}' /etc /home /srv直到 repository format 2,restic 才開始支援壓縮;這需要 restic 0.14.0 或更新版本。目前新建立的 repository 預設使用 format 2,並可透過 --compression 設定壓縮值為 auto、off 或 max。舊的 format 1 repository 在遷移前會維持未壓縮狀態。因此,如果您的 restic repository 早於 0.14,且從未進行遷移,文字、日誌和資料庫傾印仍會以完整大小儲存。
遠端目標:S3 與 SSH
這通常是做出選擇的關鍵。
restic 連線至 S3 時,只需要在環境中設定憑證,不需要在其他地方執行任何服務。同樣的模式也適用於自行代管的 bucket,這是常見的搭配方式:執行 在自己的 VPS 上使用 MinIO 提供 S3 API,再將 restic 指向該服務。
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export RESTIC_REPOSITORY=s3:https://objects.example.com/backups
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic init
restic backup /etc /home /srv --exclude-cachesBorg 連線至遠端 repository 時,需要 SSH,且遠端必須安裝 Borg。遠端的版本也必須與用戶端相容。如果遠端不是由你管理,這會增加維運負擔。如果遠端是你已在管理的第二台伺服器,則不會造成問題。此外,這種方式還能提供兩者中最強的勒索軟體防護控制:只能追加的 SSH key。強制該 key 執行 borg serve 後,用戶端可以新增 archive,但無法刪除 archive。因此,即使機器遭到入侵,也無法清除自身的歷程記錄。
command="borg serve --append-only --restrict-to-path /srv/borg/vps1",restrict ssh-ed25519 AAAA...只有在執行 restic 自有的 REST server 時,restic 才具備等效功能;該 server 支援只能追加模式。使用一般 S3 時,則可透過 bucket policy 或 object lock 達到相同效果。這是 provider 的職責,不是 restic 的功能。也要限制傳輸通道,因為 SSH 端同樣需要像其他登入方式一樣妥善保護:對備份帳戶套用 僅限 key 的 SSH 與受限制的 authorized_keys 設定。
速度:各種設計代表的意義
兩個專案都沒有發布可供您信賴、且適用於自身資料的基準測試,因此應改從運作機制推論。
Borg over SSH 在高延遲連線上仍具備良好速度,因為伺服器端具有智慧處理能力。用戶端提出查詢,遠端的 borg serve 程序會從儲存庫索引中回應,交易則在單一位置完成提交。區塊查找不會讓每個小檔案都產生網路往返。
Restic on object storage 沒有伺服器端處理能力,因此必須透過 HTTP 取得索引檔和 pack 檔,再建立對儲存庫狀態的判斷。為了控制請求數量,它會在上傳前將許多小區塊封裝到較大的 pack 檔中,並在 ~/.cache/restic 保留本機快取,讓下次執行時不必重新取得完整索引。刪除該快取後,下次備份會因重建快取而變慢。在具有高延遲、且包含數百萬個小檔案的連線上,restic 在相同資料上的體感速度會比 Borg 慢。
在本機磁碟或高速 LAN 上,兩者的差距大多會縮小,最後都會受限於讀取及雜湊來源資料的速度。
鎖定及備份多台機器
Borg 1.4 會在整個作業期間對 repository 取得獨佔鎖定。兩個 client 同時寫入同一個 repository 無法正常運作:第二個 client 會等待,之後因鎖定逾時而失敗。支援的模式是每個 client 使用一個 repository。這也表示去重只會在單一機器的 repository 內進行,因此 10 台幾乎相同的伺服器會儲存 10 份相同的基礎系統。
Restic 允許多個 client 同時備份到同一個 repository,因為備份會取得共用鎖定,只有 prune 等維護作業才會取得獨佔鎖定。將 10 台相似的伺服器指向同一個 restic repository 時,伺服器之間也會進行去重,第二台伺服器之後通常只需儲存很少資料。代價是影響範圍較大:一組密碼和一個 repository 包含所有資料,因此遺失密碼就會遺失全部 10 台伺服器的備份。
保留政策:先忘記再清理,或先清理再壓縮
兩種工具都會將「決定保留哪些內容」與「回收空間」分開處理,而且都需要執行第二個步驟。
restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune
restic checkborg prune --list --glob-archives '{hostname}-*' \
--keep-daily=7 --keep-weekly=4 --keep-monthly=6 /srv/borg/vps1
borg compact /srv/borg/vps1兩種工具都有相同的陷阱,這點值得直接說明。在 Borg 中,borg prune 會移除封存檔,但不會自行釋放磁碟空間。必須執行 borg compact 才會回收空間。因此,只執行清理而不進行壓縮的 cron 工作,會讓儲存庫持續增長,即使封存檔清單仍然很短。在 restic 中,只執行 forget 而不執行 --prune,只會移除快照參照;資料仍會保留,直到執行清理為止。
清理後執行 restic check。這會驗證儲存庫結構,並告知您是否有資料損壞。這比在還原期間才發現問題好得多。
還原才是唯一重要的測試
兩種工具都會掛載快照,讓您能夠瀏覽其中的內容。這是取回單一檔案最快的方法。
restic snapshots
restic restore latest --target /tmp/restore --include /etc/nginx
restic mount /mnt/restoreborg list /srv/borg/vps1
borg extract --list /srv/borg/vps1::vps1-2026-07-30T02:00:00 etc/nginx
borg mount /srv/borg/vps1::vps1-2026-07-30T02:00:00 /mnt/restore請注意 borg extract 中的路徑格式。封存檔內的路徑儲存時不含開頭的斜線,因此 etc/nginx 才是正確寫法;/etc/nginx 不會比對到任何內容,也不會擷取任何檔案,且不會顯示錯誤來說明原因。擷取作業也會寫入目前的工作目錄,因此請先切換至暫存目錄,否則舊檔案會覆寫運作中的檔案。
無論選用哪種工具,排程都只完成了一半的工作。請使用實際會監看的計時器,定期將內容還原至暫存目錄,就像 VPS 的 restic 備份指南完整操作說明中使用 systemd timer 一樣。
哪一個工具適合哪種工作
當目標是物件儲存、需要單一二進位檔且遠端不安裝任何軟體、需要讓多台機器彼此進行重複資料刪除,或執行還原的人可能不是您時,請選擇 restic。它是單一靜態二進位檔,只需提供儲存庫的 URL。在操作管理上,這種方式很難被超越。
當目標是您能控制的 Linux 主機、連線具有延遲且資料集包含數百萬個小檔案、需要使用僅可附加的 SSH key 作為防範勒索軟體的控制措施,或需要依工作調整壓縮設定時,請選擇 Borg。它是較早期的工具,其穩定系列更新速度緩慢;對備份軟體而言,這反而是優點。
兩者都是正確的選擇。錯誤的選擇,是從未測試過的那一個。如果您已經執行應用程式層級的傾印,請繼續保留這些傾印:Nextcloud on Docker 設定搭配資料庫傾印中的模式適用於這兩種工具,因為在隨機時間點複製使用中的資料庫檔案,並不等於備份資料庫。
FAQ
restic 或 BorgBackup 哪個速度較快?
在本機磁碟或高速 LAN 上,兩者速度相近,最後都受來源端的讀取與雜湊速度限制。透過高延遲 SSH 連線處理大量小檔案時,Borg 通常較快,因為遠端的 borg serve 程序可回應索引查詢,不必針對每個區塊各執行一次網路往返。目標為物件儲存時,restic 通常較快,因為 Borg 完全無法直接使用物件儲存。
BorgBackup 可以備份到 S3 或 Backblaze B2 嗎?
不能直接備份。Borg 儲存庫由 SSH 上的 borg serve 程序提供服務,而儲存貯體內不會執行這類程序。使用者通常會以 rclone 將物件儲存掛載為檔案系統來繞過限制,但 Borg 專案不建議這麼做,因為掛載點若在交易中途中斷,可能使儲存庫損毀。如果需要物件儲存,請使用 restic。
我可以讓兩個工具處理相同的資料嗎?
可以,部分使用者確實這麼做:使用 Borg 備份到第二部伺服器,以便快速從本機還原;使用 restic 備份到物件儲存,以保留異地副本。兩者不共用任何資料,因此讀取與雜湊成本會支付兩次,且必須安全保存兩組密碼。只有在測試過兩者的還原程序後,才應採用這種做法。
如果遺失儲存庫密碼,會發生什麼事?
兩個工具中的資料都無法復原。restic 使用 scrypt 從密碼導出金鑰,沒有繞過機制。Borg 在 repokey 模式中會將加密金鑰儲存在儲存庫內,因此只要通行片語即可還原;在 keyfile 模式中,還需要 ~/.config/borg/keys/ 中的金鑰檔案。如果使用 keyfile,請以 borg key export 匯出 Borg 金鑰,並將密碼保存在不位於備份目標伺服器上的密碼管理器中。
我應該等 Borg 2.0 嗎?
不用。截至 July 2026,Borg 2.0 仍處於 beta 階段,版本為 2.0.0b22,專案也標示僅供測試使用。目前的穩定系列是 1.4,最新版本為 1.4.5。現在即可開始使用 1.4。Borg 2 會變更儲存庫格式,並提供有文件說明的升級路徑,因此現在開始使用不會讓你日後無法升級。