rsync – Linux常用指令#03

通常進行伺服器或任何資料備份的規劃,一定會依據資料儲存時間劃分出近期的備份以及較為遠期的備份,近期的備份可能就可以幾小時前或是昨天的完整備份,而遠期則可以是一天前、兩天前甚至本週的第一個完整備份。
藉由區分距今時間長短來決定備份本身的重要性算是最簡單的策略,畢竟使用運行中伺服器的資源存放價值較低的資料還真的蠻浪費的。另一個重點是,伺服器備份規劃都要有異地備援的機制會更可靠,不過,災難還原的 SOP、技術又是另一個更深的學問了。在這篇就著眼於實作 Linux 備份資料到家用型 Synology NAS 吧。

由於直接說明這個指令的各種功能好像太無聊,所以我想到一個例子:就是如何將 Linux 的備份檔儲存到 NAS,如果剛好手邊有 Synology NAS 的話,就可以用來存放來自 Linux 的備份檔。如果你只是打算要在同一台 Linux 上建立備份資料夾,可以從本文的 rsync 章節開始閱讀即可。

 

Synology NAS 設定

建立、複製 SSH Key 至 NAS

假設要從 Linux 使用 rsync 傳輸資料至 NAS,那就必須要在 Linux 上執行下列第 1 行指令,產生 SSH key 的公私鑰,並命名為 NAS_KEY。第 2 行指令則是使用 ssh-copy-id 將剛產生的 SSH Key 的公鑰複製到你的 NAS 上。(第 2 行指令也是在 Linux 上執行)

此範例假設 NAS 的資訊如下:
IP:127.0.0.50
SSH 使用者名稱為:NAS_USER
SSH 服務port:12800

 

修改NAS SSH 資料夾權限

記得把路徑改成 NAS SSH 使用者家目錄的名稱。當然,首先你必須在 NAS 上建立可使用 SSH 遠端登入的帳號,這邊就以 NAS_USER 代表此帳號。如此一來,SSH 服務才有足夠的權限讀取此帳號允許使用 SSH key 登入的白名單。

 

SSH 設定檔

修改 NAS 的 SSH 設定檔,讓它允許使用 SSH Key 遠端登入。下列是使用 SSH 登入 NAS 後,用此指令編輯 SSH 設定檔。

接著,找到設定檔中的下列屬性,並且將這些屬性改成右手邊的設定值:

重啟 NAS 的 SSH 服務

如果重啟指令下達之後無法使用 SSH 登入 NAS,請使用 NAS 以瀏覽器登入至 Synology NAS GUI,進入控制台修改 SSH 設定。取消勾選 SSH 服務後,存檔。隨後再將 SSH 功能勾起,最後再儲存設定一次。

 

此時,應該要能使用 Linux 的使用者(andy) 使用 SSH key 免密碼登入 NAS,而且對應到 NAS 的使用者則是叫做 NAS_USER

 

rsync

RSYNC 指令

Linux 可以透過 rsync 在不同的伺服器之間同步資料或傳輸檔案的需求,對於這個軟體的詳細介紹可以參考許多大神寫的文章深入了解。本文只針對會用到的功能加以說明。rsync的操作方法可以被區分為三大區塊,分別是rsync指令本地路徑遠端路徑,下方示範指令被我切分成4大區塊是多出 -e 指令此區塊,這是用來設定 SSH 連線遠端主機的憑證和 port 號,就是因為很重要又很常用,所以被我特別獨立出來。

 

RSYNC 常用指令

贊助廣告

-a:封存的意思(archive),這個指令會以遞迴的方式保存所有檔案的資訊,包含權限、擁有者資訊等,此指令等於同時使用 -rlptgoD 7種功能。但請注意由於此指令帶有 -r 遞迴功能,所以不能與指令 --files-from 一起使用。

-z:傳輸檔案時壓縮後再傳輸,可以降低傳輸量,節省傳輸時間,降低中途出錯的機會。

-e:設定 SSH 遠端連線的相關資訊,包含 SSH Key、Port 等重要資訊。記得要用單引號包起來。(-p port號、-i 表示ssh key的檔案路徑)

-v:顯示詳細執行情況(verbose)

--dry-run:僅測試指令執行結果,不真正執行,建議搭配 -v 一起使用才能獲得更詳細的情況。

--checksum:此指令會用來確認傳輸前後檔案是否有發生變更,而非用來確認傳輸是否有無發生錯誤的。這是會用 checksum 亦可用簡寫 -c 來替代完整指令。(rsync 在傳輸後都會自動確認檔案是否傳輸完整,不需要另外加這個指令)

如果你只是在同一台 Linux 上建立備份資料夾,將下列控制 SSH 連線相關資訊的指令 -e 移除,並且將遠端目錄改為本機,如下列所示:

RSYNC 傳輸資料至NAS

結合上述常用指令,如下範例代表的使用情境是:
/home/andy/MY_FILE 檔案透過 rsync 傳輸到遠端 NAS(IP:127.0.0.50) 的路徑 /volume1/ServerBackup/ 中,並且透過 NAS 主機上的 SSH 帳號 NAS_USER 連線至 12800 port 號完成此傳輸任務,傳輸的過程中需要保留權限等重要設定以及壓縮傳輸資料容量。

上述提到要把資料傳輸至 Synology NAS 上的目錄 /volume1/ServerBackup/ 是我另外建立的資料夾,如果想要快速地達成這項任務,可以直接傳輸到家目錄下的資料夾即可,其絕對路徑是:/var/services/homes/使用者名稱

 

RSYNC 刪除遠端主機的資料

無法做到單純地刪除遠端主機的檔案。僅有可能靠著 rsync 同步將本地端已經被移除的檔案同步於遠端一併移除。基於安全理由 rsync 預設只會做出新增檔案至遠端主機的動作,而不會主動在遠端主機移除本地端已經被刪除的檔案。但是可以透過加上指令 --delete 用來做整個資料夾內檔案的同步刪除的動作。如下指令:

除了 --delete 之外還有許多其他更詳細指定 delete 施作過程的指令:
--delete-before:在傳輸檔案開始前,先從遠端目錄中刪除本地端已不存在的檔案。
--delete-after:在檔案傳輸結束之後,才開始清除遠端目錄中對應至本地端已不存在的檔案。
--delete-during:在檔案傳輸的過程中,一檢查到遠端目錄存在本地端以移除的檔案就進行刪除。
--delete:在 rsync v3.0.0或更新版本,是執行 --delete-during 演算法。而舊版的話則是執行 --delete-before 指令。

強烈建議在還不熟悉 --delete 相關語法或影響範圍之前,最好加入 --dry-run 指令進一步確認。

Reference
  1. rsync – Linux man page
  2. Cheatsheet: Passwordless SSH authentication on Synology DSM v6.1.3
  3. [教學][NAS] Synology NAS SSH 免密碼登入
 

Andy Wang

站在巨人的肩膀上仍須戰戰兢兢!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料