最近需求想定期備份內(nèi)部重要的服務(wù)器數(shù)據(jù)到存儲里面,順便做個(gè)筆記
以前整過一個(gè)win下的cwrsync(客戶端)+rsync(服務(wù)端:存儲)的bat腳本
這次整一個(gè)Linux下的腳本sh,執(zhí)行定期自動備份數(shù)據(jù)

客戶端:192.168.0.100(rsync-Linux)
服務(wù)端:192.168.0.252(存儲)
rsync簡介:
rsync是linux系統(tǒng)下的數(shù)據(jù)鏡像備份工具。使用快速增量備份工具Remote Sync可以遠(yuǎn)程同步,支持本地復(fù)制,或者與其他SSH、rsync主機(jī)同步。
1.服務(wù)端配置:
rsync的服務(wù)端主要是群輝的存儲,所以直接有界面式的配置,所以這邊就不詳細(xì)講解,如下圖:

2.客戶端配置:
創(chuàng)建密碼文件,/etc/rsyncd/rsyncd.pass,并修改為 600 權(quán)限
[root@localhost ~]# mkdir rsyncd
[root@localhost ~]# vim /rsyncd/rsyncd.pass
[root@localhost ~]# chmod 600 /rsyncd/rsyncd.pass
▲說明:/rsyncd/rsyncd.pass其內(nèi)密碼需要和服務(wù)端內(nèi)/etc/rsyncd/rsyncd.pass或存儲rsync指定用戶的密碼保持一致
客戶端向服務(wù)端傳輸文件,如果是 873 端口,可以把 --port 去掉
rsync -arvz --progress /data rsync@192.168.0.252::log --password-file=/rsyncd/rsyncd.pass
若有需要也可以從服務(wù)端拉取文件,需要把服務(wù)器的 /etc/rsyncd/rsyncd.conf 中的 write only = yes 給去掉
#拉取整個(gè)目錄
rsync -arvz --progress --password-file=/rsyncd/rsyncd.pass --port=873 rsync@192.168.0.252::log /var/log
#拉取單個(gè)文件
rsync -arvz --progress --password-file=/rsyncd/rsyncd.pass --port=873 rsync@192.168.0.252::log/a.log /var/log
rsync服務(wù)端配置參數(shù):
全局參數(shù)
在文件中[module]之前的所有參數(shù)都是全局參數(shù),當(dāng)然也可以在全局參數(shù)部分定義模塊參數(shù),這時(shí)候該參數(shù)的值就是所有模塊的默認(rèn)值。
port
指定后臺程序使用的端口號,默認(rèn)為873。
motd file
"motd file"參數(shù)用來指定一個(gè)消息文件,當(dāng)客戶連接服務(wù)器時(shí)該文件的內(nèi)容顯示給客戶,默認(rèn)是沒有motd文件的。
log file
"log file"指定rsync的日志文件,而不將日志發(fā)送給syslog。比如可指定為“/var/log/rsyncd.log”。
pid file
指定rsync的pid文件,通常指定為“/var/run/rsyncd.pid”。
syslog facility
指定rsync發(fā)送日志消息給syslog時(shí)的消息級別,常見的消息級別是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默認(rèn)值是daemon。
模塊參數(shù)
主要是定義服務(wù)器哪個(gè)目錄要被同步。其格式必須為“[module]”形式,這個(gè)名字就是在rsync 客戶端看到的名字,其實(shí)有點(diǎn)象Samba服務(wù)器提供的共享名。而服務(wù)器真正同步的數(shù)據(jù)是通過 path 來指定的。我們可以根據(jù)自己的需要,來指定多個(gè)模塊,模塊中可以定義以下參數(shù):
comment
給模塊指定一個(gè)描述,該描述連同模塊名在客戶連接得到模塊列表時(shí)顯示給客戶。默認(rèn)沒有描述定義。
path
指定該模塊的供備份的目錄樹路徑,該參數(shù)是必須指定的。
use chroot
如 果"use chroot"指定為true,那么rsync在傳輸文件以前首先chroot到path參數(shù)所指定的目錄下。這樣做的原因是實(shí)現(xiàn)額外的安全防護(hù),但是缺 點(diǎn)是需要以roots權(quán)限,并且不能備份指向外部的符號連接所指向的目錄文件。默認(rèn)情況下chroot值為true。
uid
該選項(xiàng)指定當(dāng)該模塊傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的uid,配合gid選項(xiàng)使用可以確定哪些可以訪問怎么樣的文件權(quán)限,默認(rèn)值是"nobody"。
gid
該選項(xiàng)指定當(dāng)該模塊傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的gid。默認(rèn)值為"nobody"。
max connections
指定該模塊的最大并發(fā)連接數(shù)量以保護(hù)服務(wù)器,超過限制的連接請求將被告知隨后再試。默認(rèn)值是0,也就是沒有限制。
list
該選項(xiàng)設(shè)定當(dāng)客戶請求可以使用的模塊列表時(shí),該模塊是否應(yīng)該被列出。如果設(shè)置該選項(xiàng)為false,可以創(chuàng)建隱藏的模塊。默認(rèn)值是true。
read only
該選項(xiàng)設(shè)定是否允許客戶上載文件。如果為true那么任何上載請求都會失敗,如果為false并且服務(wù)器目錄讀寫權(quán)限允許那么上載是允許的。默認(rèn)值為true。
exclude
用來指定多個(gè)由空格隔開的多個(gè)文件或目錄(相對路徑),并將其添加到exclude列表中。這等同于在客戶端命令中使用--exclude來指定模式,一個(gè) 模塊只能指定一個(gè)exclude選項(xiàng)。但是需要注意的一點(diǎn)是該選項(xiàng)有一定的安全性問題,客戶很有可能繞過exclude列表,如果希望確保特定的文件不能 被訪問,那就最好結(jié)合uid/gid選項(xiàng)一起使用。
exclude from
指定一個(gè)包含exclude模式的定義的文件名,服務(wù)器從該文件中讀取exclude列表定義。
include
用來指定不排除符合要求的文件或目錄。這等同于在客戶端命令中使用--include來指定模式,結(jié)合include和exclude可以定義復(fù)雜的exclude/include規(guī)則。
include from
指定一個(gè)包含include模式的定義的文件名,服務(wù)器從該文件中讀取include列表定義。
auth users
該選項(xiàng)指定由空格或逗號分隔的用戶名列表,只有這些用戶才允許連接該模塊。這里的用戶和系統(tǒng)用戶沒有任何關(guān)系。如果"auth users"被設(shè)置,那么客戶端發(fā)出對該模塊的連接請求以后會被rsync請求challenged進(jìn)行驗(yàn)證身份這里使用的 challenge/response認(rèn)證協(xié)議。用戶的名和密碼以明文方式存放在"secrets file"選項(xiàng)指定的文件中。默認(rèn)情況下無需密碼就可以連接模塊(也就是匿名方式)。
secrets file
該選項(xiàng)指定一個(gè)包含定義用戶名:密碼對的文件。只有在"auth users"被定義時(shí),該文件才有作用。文件每行包含一個(gè)username:passwd對。一般來說密碼最好不要超過8個(gè)字符。沒有默認(rèn)的 secures file名,需要限式指定一個(gè)(例如:/etc/rsyncd.passwd)。注意:該文件的權(quán)限一定要是600,否則客戶端將不能連接服務(wù)器。
strict modes
該選項(xiàng)指定是否監(jiān)測密碼文件的權(quán)限,如果該選項(xiàng)值為true那么密碼文件只能被rsync服務(wù)器運(yùn)行身份的用戶訪問,其他任何用戶不可以訪問該文件。默認(rèn)值為true。
hosts allow
該選項(xiàng)指定哪些IP的客戶允許連接該模塊??蛻裟J蕉x可以是以下形式:
單個(gè)IP地址,例如:192.167.0.1
整個(gè)網(wǎng)段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多個(gè)IP或網(wǎng)段需要用空格隔開,“*”則表示所有,默認(rèn)是允許所有主機(jī)連接。
hosts deny
指定不允許連接rsync服務(wù)器的機(jī)器,可以使用hosts allow的定義方式來進(jìn)行定義。默認(rèn)是沒有hosts deny定義。
ignore errors
指定rsyncd在判斷是否運(yùn)行傳輸時(shí)的刪除操作時(shí)忽略server上的IO錯(cuò)誤,一般來說rsync在出現(xiàn)IO錯(cuò)誤時(shí)將將跳過--delete操作,以防止因?yàn)闀簳r(shí)的資源不足或其它IO錯(cuò)誤導(dǎo)致的嚴(yán)重問題。
ignore nonreadable
指定rysnc服務(wù)器完全忽略那些用戶沒有訪問權(quán)限的文件。這對于在需要備份的目錄中有些文件是不應(yīng)該被備份者得到的情況是有意義的。
lock file
指定支持max connections參數(shù)的鎖文件,默認(rèn)值是/var/run/rsyncd.lock。
transfer logging
使rsync服務(wù)器使用ftp格式的文件來記錄下載和上載操作在自己單獨(dú)的日志中。
log format
通過該選項(xiàng)用戶在使用transfer logging可以自己定制日志文件的字段。其格式是一個(gè)包含格式定義符的字符串,可以使用的格式定義符如下所示:
%h 遠(yuǎn)程主機(jī)名
%a 遠(yuǎn)程IP地址
%l 文件長度字符數(shù)
%p 該次rsync會話的進(jìn)程id
%o 操作類型:"send"或"recv"
%f 文件名
%P 模塊路徑
%m 模塊名
%t 當(dāng)前時(shí)間
%u 認(rèn)證的用戶名(匿名時(shí)是null)
%b 實(shí)際傳輸?shù)淖止?jié)數(shù)
%c 當(dāng)發(fā)送文件時(shí),該字段記錄該文件的校驗(yàn)碼
默認(rèn)log格式為:"%o %h [%a] %m (%u) %f %l",一般來說,在每行的頭上會添加"%t [%p] "。在源代碼中同時(shí)發(fā)布有一個(gè)叫rsyncstats的perl腳本程序來統(tǒng)計(jì)這種格式的日志文件。
timeout
通過該選項(xiàng)可以覆蓋客戶指定的IP超時(shí)時(shí)間。通過該選項(xiàng)可以確保rsync服務(wù)器不會永遠(yuǎn)等待一個(gè)崩潰的客戶端。超時(shí)單位為秒鐘,0表示沒有超時(shí)定義,這也是默認(rèn)值。對于匿名rsync服務(wù)器來說,一個(gè)理想的數(shù)字是600。
refuse options
通過該選項(xiàng)可以定義一些不允許客戶對該模塊使用的命令參數(shù)列表。這里必須使用命令全名,而不能是簡稱。但發(fā)生拒絕某個(gè)命令的情況時(shí)服務(wù)器將報(bào)告錯(cuò)誤信息然后退出。如果要防止使用壓縮,應(yīng)該是:"dont compress = *"。
dont compress
用來指定那些不進(jìn)行壓縮處理再傳輸?shù)奈募?,默認(rèn)值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
rsync常用命令:
-v, --verbose 詳細(xì)模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 打開校驗(yàn)開關(guān),強(qiáng)制對文件傳輸進(jìn)行校驗(yàn)
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等于-rlptgoD
-r, --recursive 對子目錄以遞歸模式處理
-R, --relative 使用相對路徑信息
-b, --backup 創(chuàng)建備份,也就是對于目的已經(jīng)存在有同樣的文件名時(shí),將老的文件重新命名為~filename。可以使用--suffix選項(xiàng)來指定不同的備份文件前綴。
--backup-dir 將備份文件(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份文件前綴
-u, --update 僅僅進(jìn)行更新,也就是跳過所有已經(jīng)存在于DST,并且文件時(shí)間晚于要備份的文件。(不覆蓋更新的文件)
-l, --links 保留軟鏈結(jié)
-L, --copy-links 想對待常規(guī)文件一樣處理軟鏈結(jié)
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹以外的鏈結(jié)
--safe-links 忽略指向SRC路徑目錄樹以外的鏈結(jié)
-H, --hard-links 保留硬鏈結(jié)
-p, --perms 保持文件權(quán)限
-o, --owner 保持文件屬主信息
-g, --group 保持文件屬組信息
-D, --devices 保持設(shè)備文件信息
-t, --times 保持文件時(shí)間信息
-S, --sparse 對稀疏文件進(jìn)行特殊處理以節(jié)省DST的空間
-n, --dry-run現(xiàn)實(shí)哪些文件將被傳輸
-W, --whole-file 拷貝文件,不進(jìn)行增量檢測
-x, --one-file-system 不要跨越文件系統(tǒng)邊界
-B, --block-size=SIZE 檢驗(yàn)算法使用的塊尺寸,默認(rèn)是700字節(jié)
-e, --rsh=COMMAND 指定使用rsh、ssh方式進(jìn)行數(shù)據(jù)同步
--rsync-path=PATH 指定遠(yuǎn)程服務(wù)器上的rsync命令所在路徑信息
-C, --cvs-exclude 使用和CVS一樣的方法自動忽略文件,用來排除那些不希望傳輸?shù)奈募?
--existing 僅僅更新那些已經(jīng)存在于DST的文件,而不備份那些新創(chuàng)建的文件
--delete 刪除那些DST中SRC沒有的文件
--delete-excluded 同樣刪除接收端那些被該選項(xiàng)指定排除的文件
--delete-after 傳輸結(jié)束以后再刪除
--ignore-errors 及時(shí)出現(xiàn)IO錯(cuò)誤也進(jìn)行刪除
--max-delete=NUM 最多刪除NUM個(gè)文件
--partial 保留那些因故沒有完全傳輸?shù)奈募允羌涌祀S后的再次傳輸
--force 強(qiáng)制刪除目錄,即使不為空
--numeric-ids 不將數(shù)字的用戶和組ID匹配為用戶名和組名
--timeout=TIME IP超時(shí)時(shí)間,單位為秒
-I, --ignore-times 不跳過那些有同樣的時(shí)間和長度的文件
--size-only 當(dāng)決定是否要備份文件時(shí),僅僅察看文件大小而不考慮文件時(shí)間
--modify-window=NUM 決定文件是否時(shí)間相同時(shí)使用的時(shí)間戳窗口,默認(rèn)為0
-T --temp-dir=DIR 在DIR中創(chuàng)建臨時(shí)文件
--compare-dest=DIR 同樣比較DIR中的文件來決定是否需要備份
-P 等同于 --partial
--progress 顯示備份過程
-z, --compress 對備份的文件在傳輸時(shí)進(jìn)行壓縮處理
--exclude=PATTERN 指定排除不需要傳輸?shù)奈募J?
--include=PATTERN 指定不排除而需要傳輸?shù)奈募J?
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 綁定到特定的地址
--config=FILE 指定其他的配置文件,不使用默認(rèn)的rsyncd.conf文件
--port=PORT 指定其他的rsync服務(wù)端口
--blocking-io 對遠(yuǎn)程shell使用阻塞IO
-stats 給出某些文件的傳輸狀態(tài)
--progress 在傳輸時(shí)現(xiàn)實(shí)傳輸過程
--log-format=formAT 指定日志文件格式
--password-file=FILE 從FILE中得到密碼
--bwlimit=KBPS 限制I/O帶寬,KBytes per second
-h, --help 顯示幫助信息
crontab簡介:
crond是linux下用來周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,與windows下的計(jì)劃任務(wù)類似,當(dāng)安裝完成操作系統(tǒng)后,默認(rèn)會安裝此服務(wù)工具,并且會自動啟動crond進(jìn)程,crond進(jìn)程每分鐘會定期檢查是否有要執(zhí)行的任務(wù),如果有要執(zhí)行的任務(wù),則自動執(zhí)行該任務(wù)。
Linux下的任務(wù)調(diào)度分為兩類:系統(tǒng)任務(wù)調(diào)度和用戶任務(wù)調(diào)度。
系統(tǒng)任務(wù)調(diào)度:系統(tǒng)周期性所要執(zhí)行的工作,比如寫緩存數(shù)據(jù)到硬盤、日志清理等。在/etc目錄下有一個(gè)crontab文件,這個(gè)就是系統(tǒng)任務(wù)調(diào)度的配置文件。
/etc/crontab文件包括下面幾行:
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行是用來配置crond任務(wù)運(yùn)行的環(huán)境變量,第一行SHELL變量指定了系統(tǒng)要使用哪個(gè)shell,這里是bash,第二行PATH變量指定了系統(tǒng)執(zhí)行命令的路徑,第三行MAILTO變量指定了crond的任務(wù)執(zhí)行信息將通過電子郵件發(fā)送給root用戶,如果MAILTO變量的值為空,則表示不發(fā)送任務(wù)執(zhí)行信息給用戶,第四行的HOME變量指定了在執(zhí)行命令或者腳本時(shí)使用的主目錄。
用戶任務(wù)調(diào)度:用戶定期要執(zhí)行的工作,比如用戶數(shù)據(jù)備份、定時(shí)郵件提醒等。用戶可以使用 crontab 工具來定制自己的計(jì)劃任務(wù)。所有用戶定義的crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。
crontab文件的含義:
用戶所建立的crontab文件中,每一行都代表一項(xiàng)任務(wù),每行的每個(gè)字段代表一項(xiàng)設(shè)置,它的格式共分為六個(gè)字段,前五段是時(shí)間設(shè)定段,第六段是要執(zhí)行的命令段,格式如下:
minute hour day month week command
其中:
minute: 表示分鐘,可以是從0到59之間的任何整數(shù)。
hour:表示小時(shí),可以是從0到23之間的任何整數(shù)。
day:表示日期,可以是從1到31之間的任何整數(shù)。
month:表示月份,可以是從1到12之間的任何整數(shù)。
week:表示星期幾,可以是從0到7之間的任何整數(shù),這里的0或7代表星期日。
command:要執(zhí)行的命令,可以是系統(tǒng)命令,也可以是自己編寫的腳本文件。

在以上各個(gè)字段中,還可以使用以下特殊字符:
星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件后每月都執(zhí)行該命令操作。
逗號(,):可以用逗號隔開的值指定一個(gè)列表范圍,例如,“1,2,5,7,8,9”
中杠(-):可以用整數(shù)之間的中杠表示一個(gè)整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時(shí)間的間隔頻率,例如“0-23/2”表示每兩小時(shí)執(zhí)行一次。同時(shí)正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執(zhí)行一次。
crontab常用命令:
1.列出crontab文件
為了列出crontab文件,可以用:
[root@localhost ~]# crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty
你將會看到和上面類似的內(nèi)容??梢允褂眠@種方法在$HOME目錄中對crontab文件做一備份:
[root@localhost ~]# crontab -l > $HOME/mycron
這樣,一旦不小心誤刪了crontab文件,可以用上一節(jié)所講述的方法迅速恢復(fù)。
2.編輯crontab文件
如果希望添加、刪除或編輯crontab文件中的條目,而編輯環(huán)境變量又設(shè)置為v i,那么就可以用vi來編輯crontab文件,相應(yīng)的命令為:
[root@localhost ~]# crontab -e
可以像使用vi編輯其他任何文件那樣修改crontab文件并退出。如果修改了某些條目或添加了新的條目,那么在保存該文件時(shí), c r o n會對其進(jìn)行必要的完整性檢查。如果其中的某個(gè)域出現(xiàn)了超出允許范圍的值,它會提示你。
我們在編輯crontab文件時(shí),沒準(zhǔn)會加入新的條目。例如,加入下面的一條:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month(注釋說明)
30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;
現(xiàn)在保存并退出。最好在crontab文件的每一個(gè)條目之上加入一條注釋,這樣就可以知道它的功能、運(yùn)行時(shí)間,更為重要的是,知道這是哪位用戶的作業(yè)。
現(xiàn)在讓我們使用前面講過的crontab -l命令列出它的全部信息:
[root@localhost ~]# crontab -l
# (crondave installed on Tue May 4 13:07:43 1999)
# DT:ech the date to the console every 30 minites
0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;
3.刪除crontab文件
要?jiǎng)h除crontab文件,可以用:
[root@localhost ~]# crontab -r
crontab使用實(shí)例
實(shí)例1:每1分鐘執(zhí)行一次command
命令:
* * * * * command
實(shí)例2:每星期日的晚上00 : 00執(zhí)行rsync-sh腳本
命令:
[root@localhost ~]# crontab -e
# DT:Execute rsync-sh script every Sunday at 00: 00(注釋說明)
0 0 * * 7 sh /root/rsyncd/rsync-gitbak.sh
rsync客戶端自動與rsync服務(wù)器端同步:
首先,我們來做一個(gè)shell腳本
[root@localhost rsyncd]# vim rsyncd.sh
#!/bin/bash
rsync -arvz --progress /data rsync@192.168.0.252::log --password-file=/rsyncd/rsyncd.pass
命令:crontab -e來編輯加入計(jì)劃任務(wù)
[root@localhost ~]# crontab -e
# DT:Execute rsync-sh script every Sunday at 00: 00(注釋說明)
0 0 * * 7 sh /root/rsyncd/rsyncd.sh
使用crontab -l查看加入的計(jì)劃任務(wù)
[root@localhost ~]# crontab -l
0 0 * * 7 sh /root/rsyncd/rsyncd.sh
注意:
1. 當(dāng)程式在你所指定的時(shí)間執(zhí)行后,系統(tǒng)會寄一封信給你,顯示該程式執(zhí)行的內(nèi)容,若是你不希望收到這樣的信,請?jiān)诿恳恍锌找桓裰蠹由?> /dev/null 2>&1 即可。
2. %在crontab中被認(rèn)為是newline,要用\來escape才行。比如crontab執(zhí)行行中,如果有"date +%Y%m%d",必須替換為:"date +\%Y\%m\%d"
遇到的問題和解決方法:
在Windows上面編輯了sh腳本上傳到Linux上面,執(zhí)行報(bào)錯(cuò):
bad interpreter:No such file or directory
vim rsyncd.sh用命令:set ff?查看是doc還是unix格式,如果是dos格式,用命令:set ff=unix轉(zhuǎn)化為unix格式