Linux 筆記 - 第十三章 Linux 系統日常管理之(四)Linux 數據備份工具 rsync 和網絡配置
博客地址:http://www.moonxy.com
一、前言
sync 命令是一個遠程數據同步工具,可通過 LAN/WAN 快速同步多臺主機間的文件,可以理解為 remote sync(遠程同步)。rsync 使用所謂的 "rsync算法" 來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。rsync 不僅可以遠程同步數據(類似於 scp),還可以本地同步數據(類似於 cp),但不同於 cp 或 scp 的一點是,rsync 不會覆蓋以前的數據(如果數據已經存在),而是先判斷已經存在的數據和新數據的差異,只有當源數據或目標數據出現不一致時,才會把不相同的部分覆蓋。rsync 是一個功能非常強大的工具,其命令也有很多功能特色選項。如果沒有安裝 rsync 命令,可以使用 "yum install -y rsync" 安裝。
二、rsync 的命令格式
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
其中 SRC 表示源文件,DEST 表示目標文件。
對應於以上六種命令格式,rsync 有六種不同的工作模式:
1)拷貝本地文件。當SRC和DES路徑信息都不包含有單個冒號":"分隔符時就啟動這種工作模式。如:rsync -a /data /backup
2)使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號":"分隔符時啟動該模式。如:rsync -avz *.c foo:src
3)使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號":"分隔符時啟動該模式。如:rsync -avz foo:src/bar /data
4)從遠程rsync服務器中拷貝文件到本地機。當SRC路徑信息包含"::"分隔符時啟動該模式。如:rsync -av [email protected]::www /databack
5)從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含"::"分隔符時啟動該模式。如:rsync -av /databack [email protected]::www
6)列遠程機的文件列表。這類似於rsync傳輸,不過只要在命令中省略掉本地機信息即可。如:rsync -v rsync://192.168.78.192/www
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD。 -r, --recursive 對子目錄以遞歸模式處理。 -v, --verbose 詳細模式輸出。 -u, --update 僅僅進行更新,也就是跳過所有已經存在於DST,並且文件時間晚於要備份的文件,不覆蓋更新的文件。 -l, --links 保留軟鏈接。 -L, --copy-links 想對待常規文件一樣處理軟鏈結。 -p, --perms 保持文件權限。 -o, --owner 保持文件屬主信息。 -g, --group 保持文件屬組信息。 -D, --devices 保持設備文件信息。 -t, --times 保持文件時間信息。 -e, --rsh=command 指定使用rsh、ssh方式進行數據同步。 -C, --cvs-exclude 使用和CVS一樣的方法自動忽略文件,用來排除那些不希望傳輸的文件。 --existing 僅僅更新那些已經存在於DST的文件,而不備份那些新創建的文件。 --delete 刪除那些DST中有,SRC沒有的文件。 -P 等同於 --partial。 --progress 顯示備份過程。 -z, --compress 對備份的文件在傳輸時進行壓縮處理。 --exclude=PATTERN 指定排除不需要傳輸的文件模式。 --include=PATTERN 指定不排除而需要傳輸的文件模式。 --exclude-from=FILE 排除FILE中指定模式的文件。 --include-from=FILE 不排除FILE指定模式匹配的文件。 --config=FILE 指定其他的配置文件,不使用默認的rsyncd.conf文件。 --port=PORT 指定其他的rsync服務端口。 --progress 在傳輸時現實傳輸過程。 --password-file=FILE 從FILE中得到密碼。
這些還只是 rsync 的一部分選項,其中常用的有 a、v、L、--delete 和 --exclude 這幾個,其中 -a 選項等同於 -rlptgoD,-a 選項後面可以跟一個 --no-OPTION,表示關閉 -rlptgoD 中的某一個,比如 -a--no-l 等同於 -rptgoD。
三、rsync 應用實例
3.1 將本地的 test1 目錄直接復制成 test2 目錄
單機模式,直接將一個目錄的文件備份到另外一個目錄下,如下:
# rsync -avL test1/ test2/
以下為遠程模式,將源端看做客戶端,遠端看做服務器。
3.2 通過 ssh 的方式備份
首先啟動服務端的ssh服務:
# service sshd start
接下來就可以在客戶端使用rsync命令來備份服務端上的數據了,SSH方式是通過系統用戶來進行備份的,如下:
rsync -avL --progress -e ssh [email protected]:/www/* /databack/experiment/rsync [email protected]‘s password: receiving file list ... 5 files to consider test/ a 0 100% 0.00kB/s 527:35:41 (1, 20.0% of 5) b 67 100% 65.43kB/s 0:00:00 (2, 40.0% of 5) c 0 100% 0.00kB/s 527:35:41 (3, 60.0% of 5) dd 100663296 100% 42.22MB/s 0:00:02 (4, 80.0% of 5) sent 96 bytes received 98190 bytes 11563.06 bytes/sec total size is 100663363 speedup is 1024.19
上面的信息描述了整個的備份過程,以及總共備份數據的大小。
這個實例表示 pull(拉取),從服務器拉取文件到本地目錄,同樣也可以 push(推送),表示將本地文件推送到服務器上面來備份。如果不通過密鑰,則像上面一樣還要輸入密碼來交互。可以設置 ssh 密鑰,生成公鑰和私鑰,這樣在同步時,就不需要輸入密碼了,適合於 shell 腳本。
3.3 通過後臺服務的方式
默認安裝好rsync程序後,並不會自動創建rsync的主配置文件,需要手工來創建,其主配置文件為 "/etc/rsyncd.conf"。
配置文件 rsyncd.conf 由全局配置和若幹模塊配置組成。配置文件的語法為:
1)模塊以 [模塊名] 開始
2)參數配置行的格式是 name = value ,其中 value 可以有兩種數據類型:
字符串(可以不用引號定界字符串)
布爾值(1/0 或 yes/no 或 true/false)
3)以 # 或 ; 開始的行為註釋
4)\ 為續行符
全局參數
在文件中 [module] 之外的所有配置行都是全局參數。當然也可以在全局參數部分定義模塊參數,這時該參數的值就是所有模塊的默認值。
模塊參數
模塊參數主要用於定義 rsync 服務器哪個目錄要被同步。模塊聲明的格式必須為 [module] 形式,這個名字就是在 rsync 客戶端看到的名字,類似於 Samba 服務器提供的共享名。而服務器真正同步的數據是通過 path 來指定的。可以根據自己的需要,來指定多個模塊,模塊中可以定義以下參數:
a. 基本模塊參數
b. 模塊控制參數
c. 模塊文件篩選參數
d. 模塊用戶認證參數
rsync 認證口令文件的權限一定是 600,否則客戶端將不能連接服務器。
rsync 認證口令文件中每一行指定一個 用戶名:口令 對,格式為:username:passwd
一般來說口令最好不要超過8個字符。若您只配置匿名訪問的 rsync 服務器,則無需設置上述參數。
e. 模塊訪問控制參數
客戶主機列表定義可以是以下形式:
單個IP地址。例如:192.168.0.1
整個網段。例如:192.168.0.0/24,192.168.0.0/255.255.255.0
可解析的單個主機名。例如:centos,centos.bsmart.cn
域內的所有主機。例如:*.bsmart.cn
"*"則表示所有。
多個列表項要用空格間隔。
f. 模塊日誌參數
設置了"log file"參數時,在日誌每行的開始會添加"%t [%p]"。
可以使用的日誌格式定義符如下所示:
%a - 遠程IP地址
%h - 遠程主機名
%l - 文件長度字符數
%p - 該次 rsync 會話的 PID
%o - 操作類型:”send” 或 “recv”
%f - 文件名
%P - 模塊路徑
%m - 模塊名
%t - 當前時間
%u - 認證的用戶名(匿名時是 null)
%b - 實際傳輸的字節數
%c - 當發送文件時,記錄該文件的校驗碼
創建該文件並添加如下內容:
vi /etc/rsyncd.conf uid=root gid=root max connections=4 log file=/var/log/rsyncd.log pid file=/var/run/rsyncd.pid lock file=/var/run/rsyncd.lock secrets file=/etc/rsyncd.passwd hosts allow=192.168.1.0/24 [www] comment= backup web path=/www read only = no exclude=test auth users=work
創建密碼文件,采用這種方式不能使用系統用戶對客戶端進行認證,所以需要創建一個密碼文件,其格式為 "username:password",用戶名可以和密碼可以隨便定義,最好不要和系統帳戶一致,同時要把創建的密碼文件權限設置為600,這在前面的模塊參數做了詳細介紹。
編輯 secrets file 並保存後賦予 600 權限,如果權限不對,則不能完成同步,如下:
echo "work:abc123" > /etc/rsyncd.passwd chmod 600 /etc/rsyncd.passwd
啟動 rsyncd 服務,如下:
# rsync --daemon --config=/etc/rsyncd.conf
啟動後查看873端口是否啟動,如下:
# netstat-lnp |grep 873
完成以上工作,現在就可以對數據進行同步了,如下:
rsync -avz --progress work@192.168.1.121::www /databack/experiment/rsync Password: receiving file list ... 6 files to consider ./ files... a 0 100% 0.00kB/s 528:20:41 (1, 50.0% of 6) b 67 100% 65.43kB/s 0:00:00 (2, 66.7% of 6) c 0 100% 0.00kB/s 528:20:41 (3, 83.3% of 6) dd 100663296 100% 37.49MB/s 0:00:02 (4, 100.0% of 6) sent 172 bytes received 98276 bytes 17899.64 bytes/sec total size is 150995011 speedup is 1533.75
發現此時也要輸入密碼才能進行數據同步,這次我們添加一個選項 --password-file=/tmp/rsync.password ,這時當我們以work用戶登錄 rsync 服務器同步數據時,密碼將讀取 /tmp/rsync.password 這個文件。這個文件內容只是work用戶的密碼。
# touch /tmp/rsync.password # chmod 600 /tmp/rsync.password # echo "123456" > /tmp/rsync.password
然後執行如下同步命令時就不再需要輸入密碼了,適合於 shell 腳本:
# rsync -avzP --password-file=/tmp/rsync.password work@172.16.1.135::www /databack/experiment/rsync
附錄:
參考如下:
rsync配置
Linux 筆記 - 第十三章 Linux 系統日常管理之(四)Linux 數據備份工具 rsync 和網絡配置