使用rsync每天自動進行遠程增量備份的shell腳本

rsync-incremental-backup

可配置的bash腳本,使用rsync將數據的增量備份發送到本地或遠程目標。

譯者理解

這裏只針對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:備份超時時間,如果超時備份進程沒有響應,備份將被取消。
  • pathBak0dst存儲最新備份的目錄。
  • partialFolderNamedst存儲部分文件的目錄。
  • rotationLockFileName:鎖定文件的名稱,用於檢測先前的備份失敗。
  • pathBakNdst存放其餘備份的目錄。
  • nameBakN:增量備份目錄的名稱。最後會添加一個索引來顯示文件的新舊。
  • logName:給備份時生成的日誌文件的名稱。
  • exclusionFileName:排除模式的文本文件的名稱。 你必須在ownFolderName定義的目錄中創建它。
  • ownFolderName:用於在備份進行時保存配置文件和日誌的文件夾。
  • logFolderNamedst存儲日誌文件的目錄。
  • dateCmd:爲GNU運行的命令date
  • interactiveMode:當設置爲yes時,標誌允許密碼登錄(僅用於遠程版本)。

備份中的所有文件和文件夾(僅本地和遠程)對所有用戶具有讀權限,因爲不可讀的備份是無用的。如果你擔心權限問題,可以在備份訪問級別上添加一個安全層(例如,使用密碼保護的FTP帳戶)。你還可以保留原始文件和文件夾的權限,從腳本中刪除--chmod=+r標誌。在系統備份中,默認情況下保留原始權限。

三、用法

(一)設置ssh_config(對於遠程版本)

這個腳本是在沒有用戶干預的情況下運行的,因此需要授權源機器訪問遠程機器。要做到這一點,你應該使用ssh密鑰來識別你,並設置一個ssh主機來正確地使用它們。

有很多教程專門介紹這些主題,你可以遵循其中之一。我不會對此做更詳細的解釋,但這裏有一些很好的參考資料:

之後,應該使用ssh配置文件中的Host值作爲腳本中的remote值。

如果你確實需要在沒有SSH密鑰身份驗證的情況下使用這個腳本,請不要擔心。可以將interactiveMode配置變量設置爲yes,如果需要,將提示輸入密碼(僅一次)。當遠程服務器需要通過密碼進行身份驗證時,這對於手動備份非常有用。

(二)自定義配置值

你至少需要配置srcdst(遠程版本中還必須要配置remote)的值,可以在腳本里配置或者在運行時傳參:

  • $ ./rsync-incremental-backup-local /new/path/to/source /new/path/to/target(srcand dst).
  • $ ./rsync-incremental-backup-remote /new/path/to/source /new/path/to/target new_ssh_remote(src, dstand remote).
  • $ ./rsync-incremental-backup-system /mnt/new/path/to/target(only dst, srcis always root on this case).

如果要從備份中排除某些文件或目錄,請將其路徑(相對於備份根目錄)添加到引用的文本文件中exclusionFileName

配置好自己的變量值後,您只需運行腳本即可開始備份過程。

此外,所有的配置變量,除了那些是由參數重寫(srcdstremote),都可以從外部通過腳本執行之前設置變量(或導出爲環境變量)改變。例如,在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,並使用子文件夾etcspool
$ 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:發送方刪除同步文件(非目錄)。

五、參考文獻

靈感來自於:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章