rsync-incremental-backup
可配置的bash腳本,使用rsync將數據的增量備份發送到本地或遠程目標。
- 項目地址:https://github.com/pedroetb/rsync-incremental-backup
- 碼雲fork: https://gitee.com/shangyexin/rsync-incremental-backup
譯者理解
這裏只針對rsync-incremental-backup-remote
遠程備份腳本談一下自己的理解。
1.使用說明
- 需求
我想把A機器的/personal
文件夾備份到B機器的/store
文件夾。
- 複製腳本
首先將rsync-incremental-backup-remote
腳本複製到A機器的/usr/bin
目錄。
- 配置免密登入
如果不想每次備份時都輸入密碼,需要配置A機器免密登入到B機器,這裏不展開說明,主要步驟就是將A機器用戶的id_rsa.pub
添加到B機器用戶的authorized_keys
中。
- 執行備份
可以輸入下面的命令:
rsync-incremental-backup-remote /software /store user@ip_of_machineB
- 文件列表
這時候B機器的文件結構如下:
/store
|--backup
|--backup.1
|--backup.2
|--backup.3
|--backup.N
|--log
|--data
data
文件夾中是文件的最新版本,對應下面配置中的pathBak0
。
backup
文件夾裏是文件的歷史備份版本,對應下面配置中的pathBakN
。
backup.1
是具體的版本,每一個文件中都是完整備份,不需要額外合成操作,數字越小,版本越新,對應下面配置中的nameBakN
。
log
文件夾存放的是備份的日誌。
2.增量備份的含義
該腳本使用rsync
進行增量備份,只傳輸文件改變的部分,目標目錄裏面的相同文件採用硬鏈接
,相同的文件只有保存一份,以節省空間。
但是如果變化的是一個很大的文件,雖然每次備份傳輸的都是增量部分,但是目標端會根據增量變化和之前的文件版本合成文件的最新版本。
如果一直變化的都是這個很大的文件,雖然傳輸節省了流量,但是目標端並不會節省太多空間。
3.定時任務
因爲我這邊的機器是24小時開機,所以沒有使用anacron
,直接使用的crontab
。
step1:
我們將需要備份的多條命令都寫在backup.sh
腳本中:
#!/bin/bash
# gerrit
rsync-incremental-backup-remote /software/gerrit /workspace/backup/1_gerrit [email protected]
# gitlab
rsync-incremental-backup-remote /software/gitlab /workspace/backup/2_gitlab [email protected]
# openldap
rsync-incremental-backup-remote /software/openldap /workspace/backup/3_openldap [email protected]
# self-service-password
rsync-incremental-backup-remote /software/self-service-password /workspace/backup/4_self-service-password [email protected]
step2:
使用crontab -e
創建定時任務:
0 3 * * * /root/backup.sh
意思每天凌晨3點執行一次backup.sh
。
添加完成後可以使用crontab -l
查看創建的任務。
下面是完整的翻譯:
一、描述
這些腳本執行目標目錄到另一個本地或遠程目錄的增量備份(數量不限)。第一個目錄充當主目錄(不進行修改),在第二個目錄(從目錄)中複製自己。然後,你可以瀏覽從目錄並將任何文件包含到任何以前的備份中。
僅存儲新的或修改的數據(因爲它們是增量數據),因此備份的大小不會增加太多。
如果備份過程被中斷,請不要擔心。你可以在腳本的下一次運行中繼續執行此操作,而不會丟失數據,也不會重新發送以前傳輸的數據。
此外,還有一個具有特殊配置的本地備份腳本,用於爲GNU/Linux
文件系統進行備份。例如,它已經省略了臨時路徑,可移動路徑和其他有問題的路徑,並且打算備份到外部掛載點(位於/mnt
)。
二、配置
你可以設置一些配置變量來自定義腳本:
src
:源目錄的路徑。將對目錄裏內容進行備份。可以是相對或絕對路徑。可被參數覆蓋。dst
:目標目錄的路徑。備份將放置在這裏。必須是絕對路徑。可被參數覆蓋。remote
:ssh_config連接到遠程主機的主機名(僅適用於遠程版本)。可被參數覆蓋。backupDepth
:要保留的備份數量。當達到限制時,最早的備份將被刪除。timeout
:備份超時時間,如果超時備份進程沒有響應,備份將被取消。pathBak0
:dst
存儲最新備份的目錄。partialFolderName
:dst
存儲部分文件的目錄。rotationLockFileName
:鎖定文件的名稱,用於檢測先前的備份失敗。pathBakN
:dst
存放其餘備份的目錄。nameBakN
:增量備份目錄的名稱。最後會添加一個索引來顯示文件的新舊。logName
:給備份時生成的日誌文件的名稱。exclusionFileName
:排除模式的文本文件的名稱。 你必須在ownFolderName
定義的目錄中創建它。ownFolderName
:用於在備份進行時保存配置文件和日誌的文件夾。logFolderName
:dst
存儲日誌文件的目錄。dateCmd
:爲GNU運行的命令date
interactiveMode
:當設置爲yes時,標誌允許密碼登錄(僅用於遠程版本)。
備份中的所有文件和文件夾(僅本地和遠程)對所有用戶具有讀權限,因爲不可讀的備份是無用的。如果你擔心權限問題,可以在備份訪問級別上添加一個安全層(例如,使用密碼保護的FTP帳戶)。你還可以保留原始文件和文件夾的權限,從腳本中刪除--chmod=+r
標誌。在系統備份中,默認情況下保留原始權限。
三、用法
(一)設置ssh_config(對於遠程版本)
這個腳本是在沒有用戶干預的情況下運行的,因此需要授權源機器訪問遠程機器。要做到這一點,你應該使用ssh密鑰來識別你,並設置一個ssh主機來正確地使用它們。
有很多教程專門介紹這些主題,你可以遵循其中之一。我不會對此做更詳細的解釋,但這裏有一些很好的參考資料:
之後,應該使用ssh配置文件中的Host
值作爲腳本中的remote
值。
如果你確實需要在沒有SSH密鑰身份驗證的情況下使用這個腳本,請不要擔心。可以將interactiveMode
配置變量設置爲yes
,如果需要,將提示輸入密碼(僅一次)。當遠程服務器需要通過密碼進行身份驗證時,這對於手動備份非常有用。
(二)自定義配置值
你至少需要配置src
和dst
(遠程版本中還必須要配置remote
)的值,可以在腳本里配置或者在運行時傳參:
$ ./rsync-incremental-backup-local /new/path/to/source /new/path/to/target
(src
anddst
).$ ./rsync-incremental-backup-remote /new/path/to/source /new/path/to/target new_ssh_remote
(src
,dst
andremote
).$ ./rsync-incremental-backup-system /mnt/new/path/to/target
(onlydst
,src
is always root on this case).
如果要從備份中排除某些文件或目錄,請將其路徑(相對於備份根目錄)添加到引用的文本文件中exclusionFileName
。
配置好自己的變量值後,您只需運行腳本即可開始備份過程。
此外,所有的配置變量,除了那些是由參數重寫(src
,dst
和remote
),都可以從外部通過腳本執行之前設置變量(或導出爲環境變量)改變。例如,在ownFolderName
不編輯腳本的情況下更改變量:
$ ownFolderName=".backup" rsync-incremental-backup-remote /path/to/src /path/to/dst user@remote
# Or using an environment variable (maybe set at user session startup)
$ export ownFolderName=".backup"
$ rsync-incremental-backup-remote /path/to/src /path/to/dst user@remote
(三)自動備份
就我個人而言,我將它安排爲每週在anacron的用戶模式下運行。這樣,我就不需要記得運行它了。
要在用戶模式下使用anacron,必須遵循以下步驟:
- 在home目錄創建
.anacron
,並使用子文件夾etc
和spool
。
$ mkdir -p ~/.anacron/etc ~/.anacron/spool
使用以下內容在~/.anacron/etc
創建anacrontab
文件。(或等效文件,請確保指定正確的腳本路徑):
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
START_HOURS_RANGE=8-22
# period delay job-identifier command
7 5 weekly_backup ~/bin/rsync-incremental-backup-remote
- 讓你的anacron在登錄時開始。將以下內容添加到
~/.profile
文件的末尾:
# User anacron
/usr/sbin/anacron -s -t ${HOME}/.anacron/etc/anacrontab -S ${HOME}/.anacron/spool
(四)檢查備份內容
如果使用默認文件夾名稱,則最新的數據備份將位於<dst>/data
中。 第二個最新備份位於<dst>/backup/backup.1
內部,下一個位於<dst> /backup/backup.2
中,依此類推。每個備份操作的日誌文件將存儲在<dst>/log
中。
四、rsync參數說明
-
-a
:存檔模式;等於-rlptgoD(無-H,-A,-X)。強制使用備份。 -
-c
:根據校驗和而不是修改時間和大小跳過。更可信,但速度較慢。如果要更快地備份,請忽略此標誌,但是不會檢測到未更改修改時間或大小的文件是否包含在備份中。 -
-h
:以易於閱讀的格式輸出數字。 -
-v
:增加日誌記錄的詳細程度。 -
-z
:在傳輸過程中壓縮文件數據。傳輸的數據較少,但速度較慢。當備份目標是本地設備或本地網絡中的計算機(或遠程計算機的帶寬較高)時,請忽略此標誌。 -
--progress
:顯示傳輸過程中每個文件的進度。僅用於交互式使用。 -
--timeout
:以秒爲單位設置I/O超時。如果在指定時間內未傳輸任何數據,則備份將中止。 -
--delete
:從目標目錄中刪除無關的文件。強制使用主從備份。 -
--link-dest
:在未更改的情況下硬鏈接到指定目錄中的文件,以減少備份之間重複文件的存儲使用量。 -
--log-file
:將我們正在執行的操作記錄到指定的文件中。 -
--chmod
:影響文件和/或目錄權限。 -
--exclude
:排除文件匹配模式。 -
--exclude-from
:同--exclude
,但從指定的文件獲取模式。 -
僅用於遠程備份:
--no-W
:確保使用rsync的增量傳輸算法,因此如果目標處存在整個文件,則永遠不會傳輸整個文件。僅當您具有高帶寬目標時才省略,備份可能會更快。--partial-dir
:將部分傳輸的文件放入指定目錄,而不是在傳輸文件的原始路徑中使用隱藏文件。強制允許部分傳輸以避免文件不完整或者文件損壞造成的誤導。
-
僅用於本地備份:
-W
:忽略rsync的增量傳輸算法,因此它始終傳輸整個文件。當目標帶寬較高(本地文件系統或LAN)時,備份可能會更快。
-
僅用於系統備份:
-A
:保留ACL(表示-p)。
-
僅用於日誌發送:
-r
:遞歸到目錄中。--remove-source-files
:發送方刪除同步文件(非目錄)。
五、參考文獻
靈感來自於: