作為一個系統管理員,數據備份是非常重要的。阿銘有一次沒有做好備份策略,結果磁盤壞了,數據全部丟失。所以在以后的系統維護工作中,你一定要時刻牢記給數據做備份。
在Linux系統下數據備份的工具很多,但阿銘只用一種,那就是rsync,從字面意思上可以理解為remote sync(遠程同步)。rsync不僅可以遠程同步數據(類似于scp),而且可以本地同步數據(類似于cp),但不同于cp或scp的一點是,它不會覆蓋以前的數據(如果數據已經存在),而是先判斷已經存在的數據和新數據的差異,只有數據不同時才會把不相同的部分覆蓋。如果你的Linux沒有rsync命令,請使用命令yum install -yrsync安裝。下面阿銘先舉一個例子,然后再詳細講解rsync的用法。
#rsync-av/etc/passwd/tmp/1.txt
sendingincrementalfilelist
passwd
sent1,205bytesreceived35bytes2,480.00bytes/sec
totalsizeis1,113speedupis0.90
上例將會把/etc/passwd同步到/tmp/目錄下,并改名為1.txt。如果是遠程復制,數據備份就是這樣的形式——IP:path,比如192.168.72.128:/root/。具體用法如下:
#rsync-av/etc/passwd192.168.72.128:/tmp/1.txt
Theauthenticityofhost'192.168.72.128(192.168.72.128)'can'tbeestablished.
ECDSAkeyfingerprintisSHA256:gFHUJnoZAjOcnG95pt7Zg9iaPZGDiOrbZyssZtRoQhA.
Areyousureyouwanttocontinueconnecting(yes/no/[fingerprint])?yes
Warning:Permanentlyadded'192.168.72.128'(ECDSA)tothelistofknownhosts.
root@192.168.72.128'spassword:
sendingincrementalfilelist
sent45bytesreceived12bytes8.77bytes/sec
totalsizeis1,113speedupis19.53
首次連接時會提示是否要繼續連接,我們輸入yes繼續。當建立連接后,需要輸入密碼。如果手動執行這些操作比較簡單,但若是寫在腳本中該怎么辦呢?這就涉及添加信任關系了,該部分內容稍后會詳細介紹。14.7.1rsync的命令格式
rsync[OPTION]...SRCDEST
rsync[OPTION]...SRC[USER@]HOST:DEST
rsync[OPTION]...[USER@]HOST:SRCDEST
rsync[OPTION]...[USER@]HOST::SRCDEST
rsync[OPTION]...SRC[USER@]HOST::DEST
在阿銘前面舉的兩個例子中,第一個例子為第一種格式,第二個例子為第二種格式。但不同的是,阿銘并沒有加user@host,如果不加默認指的是root。第三種格式是從遠程目錄同步數據到本地。第四種和第五種格式使用了兩個冒號,這種格式和其他格式的驗證方式不同。14.7.2rsync常用選項rsync命令各選項的含義如下。- -a:這是歸檔模式,表示以遞歸方式傳輸文件,并保持所有屬性,它等同于-rlptgoD。-a選項后面可以跟一個--no-OPTION,表示關閉-rlptgoD中的某一個,比如-a--no-l等同于-rptgoD。
- -r:表示以遞歸模式處理子目錄。它主要是針對目錄來說的,如果單獨傳一個文件不需要加-r選項,但是傳輸目錄時必須加。
- -v:表示打印一些信息,比如文件列表、文件數量等。
- -l:表示保留軟連接。
- -L:表示像對待常規文件一樣處理軟連接。如果是SRC中有軟連接文件,則加上該選項后,將會把軟連接指向的目標文件復制到DST。
- -p:表示保持文件權限。
- -o:表示保持文件屬主信息。
- -g:表示保持文件屬組信息。
- -D:表示保持設備文件信息。
- -t:表示保持文件時間信息。
- --delete:表示刪除DST中SRC沒有的文件。
- --exclude=PATTERN:表示指定排除不需要傳輸的文件,等號后面跟文件名,可以是萬用字符模式(如*.txt)。
- --progress:表示在同步的過程中可以看到同步的過程狀態,比如統計要同步的文件數量、同步的文件傳輸速度等。
- -u:表示把DST中比SRC還新的文件排除掉,不會覆蓋。
- -z:加上該選項,將會在傳輸過程中壓縮
#mkdirrsync
# cd rsync
# mkdir test1
# cd test1
# touch 1 2 3
/root/123.txt
# ln -s
/root/123.txt ./123.txt
# ls -l
總用量 0
-rw-r--r-- 1 root
root 0 6月 26 17:30 1
lrwxrwxrwx 1 root
root 13 6月 26 17:30 123.txt ->
/root/123.txt
-rw-r--r-- 1 root
root 0 6月 26 17:30 2
-rw-r--r-- 1 root
root 0 6月 26 17:30 3
#cd..
阿銘建立這些文件的目的就是為后續試驗做一些準備工作。2. 使用-a選項首先來看看-a選項的用法,如下所示:
#rsync-atest1test2
#lstest2
test1
# ls test2/test1/
1123.txt23
這里有一個問題,就是本來想把test1目錄直接復制成test2目錄,可結果rsync卻新建了test2目錄,然后把test1放到test2當中。為了避免這樣的情況發生,可以這樣做:
# rm -rf test2
#rsync-atest1/test2/
# ls -l test2/
總用量 0
-rw-r--r-- 1 root
root 0 6月 26 17:30 1
lrwxrwxrwx 1 root
root136月2617:30123.txt->/root/123.txt
-rw-r--r--1rootroot06月2617:302
-rw-r--r--1rootroot06月2617:303
這里加一個斜杠就好了,所以阿銘建議你在使用rsync備份目錄時,要養成加斜杠的習慣。前面已經講了-a選項等同于-rlptgoD,且-a還可以和--no-OPTIN一并使用。下面再來看看-l選項的作用,如下所示:
# rm -rf test2
#rsync-av--no-ltest1/test2/
sendingincrementalfilelist
createddirectorytest2
skippingnon-regularfile"123.txt"
./
1
2
3
sent234bytesreceived144bytes756.00bytes/sec
total size is 13 speedup is 0.03
上例中使用了-v選項,跳過了非普通文件123.txt。其實123.txt是一個軟連接文件,如果不使用-l選項,系統則不理會軟連接文件。雖然加-l選項能復制軟連接文件,但軟連接的目標文件卻沒有復制。有時我們需要復制軟連接文件所指向的目標文件,這又該怎么辦呢?3. 使用-L選項具體用法如下:
# rm -rf test2
#rsync-avLtest1/test2/
sendingincrementalfilelist
createddirectorytest2
./
1
123.txt
2
3
sent265bytesreceived123bytes776.00bytes/sec
totalsizeis0speedupis0.00
# ls -l test2/
總用量 0
-rw-r--r--1rootroot06月2617:301
-rw-r--r--1rootroot06月2617:30123.txt
-rw-r--r--1rootroot06月2617:302
-rw-r--r--1rootroot06月2617:303
上例加上-L選項就可以把SRC中軟連接的目標文件復制到DST。4. 使用-u選項首先查看一下test1/1和test2/1的創建時間(肯定是一樣的),然后使用touch修改一下test2/1的創建時間(此時test2/1要比test1/1的創建時間晚一些)。如果不加-u選項,會把test2/1的創建時間變成和test1/1一樣,如下所示:
# ll test1/1 test2/1
-rw-r--r-- 1 root root 0 6月 26 17:30 test1/1
-rw-r--r-- 1 root root 0 6月 26 17:30 test2/1
從上例可以看出二者的創建時間是一樣的。下面修改test2/1的創建時間,然后不加-u同步,如下所示:
#echo"1111">test2/1
# ll test2/1
-rw-r--r--1rootroot56月2617:33test2/1
#rsync-atest1/1test2/
# ll test2/1
-rw-r--r-- 1 root root 0 6月 26 17:30 test2/1
這里test2/1的創建時間還是和test1/1一樣。下面加上-u選項,如下所示:
#echo"1111">test2/1
# ll test2/1
-rw-r--r--1rootroot56月2617:34test2/1
#rsync-avutest1/test2/
sendingincrementalfilelist
./
123.txt->/root/123.txt
sent134bytesreceived22bytes312.00bytes/sec
total size is 13 speedup is 0.08
# ll test1/1 test2/1
-rw-r--r-- 1 root root 0 6月 26 17:30 test1/1
-rw-r--r-- 1 root root 5 6月 26 17:34 test2/1
加上-u選項后,不會再把test1/1同步為test2/1了。5. 使用--delete選項首先刪除test1/123.txt,如下所示:
#rm-ftest1/123.txt
# ls test1/
1 2 3
然后把test1/目錄同步到test2/目錄下,如下所示:
#rsync-avtest1/test2/
sendingincrementalfilelist
./
1
sent130bytesreceived38bytes336.00bytes/sec
totalsizeis0speedupis0.00
# ls test2/
1 123.txt 2 3
上例中,test2/目錄并沒有刪除123.txt。下面加上--delete選項,示例如下:
#rsync-av--deletetest1/test2/
sendingincrementalfilelist
deleting 123.txt
sent84bytesreceived23bytes214.00bytes/sec
totalsizeis0speedupis0.00
# ls test2/
1 2 3
這里test2/目錄下的123.txt也被刪除了。另外還有一種情況,就是如果在DST中增加文件了,而SRC當中沒有這些文件,同步時加上--delete選項后同樣會刪除新增的文件。如下所示:
# touch test2/4
# ls test1/
1 2 3
# ls test2/
1 2 3 4
#rsync-a--deletetest1/test2/
# ls test1/
1 2 3
# ls test2/
1 2 3
6. 使用--exclude選項具體用法如下:
# touch test1/4
#rsync-a--exclude="4"test1/test2/
# ls test1/
1 2 3 4
# ls test2/
1 2 3
該選項還可以與匹配字符*一起使用,如下所示:
#touchtest1/1.txttest1/2.txt
# ls test1/
1 1.txt 2 2.txt 3 4
#rsync-a--progress--exclude="*.txt"test1/test2/
sendingincrementalfilelist
./
4
0 100% 0.00kB/s 000 (xfr#1, to-chk=0/5)
# ls test2/
1 2 3 4
上例中,阿銘也使用了--progress選項,它主要是用來觀察rsync同步過程狀態的。總而言之,平時你使用rsync同步數據時,使用-a選項基本上就可以達到想要的效果了。當有個別需求時,也會用到--no-OPTION、-u、 -L、--delete、--exclude以及--progress等選項。其他選項阿銘都沒有介紹,如果在以后的工作中遇到特殊需求,可以查一下rsync的man文檔。14.7.3rsync應用實例上面列舉了許多小案例,都是為了讓大家熟悉rsync各個選項的基本用法。本節正式介紹rsync的實際應用,請大家認真學習。在正式試驗前,你需要準備兩臺Linux機器,因為下面的小案例都是從一臺機器復制文件到另一臺機器。前面阿銘也帶著大家克隆過一臺虛擬機,所以把那臺克隆的虛擬機打開即可,阿銘的兩臺機器IP地址分別為192.168.72.128和192.168.72.129。1. 通過ssh的方式在之前介紹的rsync的5種命令格式中,第二種和第三種(一個冒號)就屬于通過ssh的方式備份數據。這種方式其實就是讓用戶登錄到遠程機器,然后執行rsync的任務:
#rsync-avLtest1/192.168.72.129:/tmp/test2/
Theauthenticityofhost'192.168.72.129(192.168.72.129)'can'tbeestablished.
ECDSAkeyfingerprintisSHA256:gFHUJnoZAjOcnG95pt7Zg9iaPZGDiOrbZyssZtRoQhA.
Areyousureyouwanttocontinueconnecting(yes/no/[fingerprint])?yes
Warning:
Permanently added '192.168.72.129' (ECDSA) to the list of known hosts.
root@192.168.72.129'spassword:
sendingincrementalfilelist
createddirectory/tmp/test2
./
1
1.txt
2
2.txt
3
4
sent377bytesreceived166bytes98.73bytes/sec
total size is 0speedup is 0.00
這種方式就是前面介紹的第二種方式了,是通過ssh復制的數據,需要輸入192.168.72.129那臺機器root賬戶的密碼。當然也可以使用第三種方式復制,如下所示:
#rsync-avL192.168.72.129:/tmp/test2/./test3/
root@192.168.72.129'spassword:
receivingincrementalfilelist
created directory
./test3
./
1
1.txt
2
2.txt
3
4
sent141bytesreceived389bytes117.78bytes/sec
total size is 0speedup is 0.00
以上兩種方式如果寫入腳本,做備份麻煩,要輸入密碼,但我們可以通過密鑰(不設立密碼)驗證。下面阿銘具體介紹一下通過密鑰登錄遠程主機的方法。你可以根據3.33節,把128機器上的公鑰內容放到129機器下的authorized_keys里面,這樣128機器登錄129機器時不再輸入密碼,如下所示:
# ssh 192.168.72.129
Last login: Fri Jun 26 1533 2020 from 192.168.72.1
現在不用輸入密碼也可以登錄主機129了。下面先從129主機退出來,再從主機128上執行一下rsync命令試試吧:
#rsync-avLtest1/192.168.72.129:/tmp/test4/
sendingincrementalfilelist
createddirectory/tmp/test4
./
1
1.txt
2
2.txt
3
4
sent377bytesreceived166bytes362.00bytes/sec
total size is 0 speedup is 0.00
2. 通過后臺服務的方式這種方式可以理解為:在遠程主機上建立一個rsync的服務器,在服務器上配置好rsync的各種應用,然后將本機作為rsync的一個客戶端連接遠程的rsync服務器。下面阿銘就介紹一下如何配置一臺rsync服務器。在128主機上建立并配置rsync的配置文件/etc/rsyncd.conf,如下所示(請把你的rsyncd.conf編輯成如下內容):
#vim/etc/rsyncd.conf
port=873
logfile=/var/log/rsync.log
pidfile=/var/run/rsyncd.pid
address=192.168.72.128
[test]
path=/root/rsync
use chroot=true
max connections=4
read only=no
list=true
uid=root
gid=root
auth users=test
secretsfile=/etc/rsyncd.passwd
hosts allow=192.168.72.0/24
其中配置文件分為兩部分:全局配置部分和模塊配置部分。全局部分就是幾個參數,比如阿銘的rsyncd.conf中的port、log file、pidfile和address都屬于全局配置;而[test]以下部分就是模塊配置部分了。一個配置文件中可以有多個模塊,模塊名可自定義,格式就像阿銘的rsyncd.conf中的這樣。其實模塊中的一些參數(如use chroot、maxconnections、udi、gid、authusers、secretsfile以及hostsallow都可以配置成全局參數。當然阿銘并未給出所有的參數,你可以通過命令manrsyncd.conf獲得更多信息。下面就簡單解釋一下這些參數的作用。-
port:指定在哪個端口啟動rsyncd服務,默認是873端口。
-
log file:指定日志文件。
-
pid file:指定pid文件,這個文件的作用涉及服務的啟動、停止等進程管理操作。
-
address:指定啟動rsyncd服務的IP。假如你的機器有多個IP,就可以指定由其中一個啟動rsyncd服務,如果不指定該參數,默認是在全部IP上啟動。
-
[]:指定模塊名,里面內容自定義。
-
path:指定數據存放的路徑。
-
use chroot true|false:表示在傳輸文件前,首先chroot到path參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但缺點是需要roots權限,并且不能備份指向外部的符號連接所指向的目錄文件。默認情況下chroot值為true,如果你的數據當中有軟連接文件,阿銘建議你設置成false。
-
max connections:指定最大的連接數,默認是0,即沒有限制。
-
read only ture|false:如果為true,則不能上傳到該模塊指定的路徑下。
-
list:表示當用戶查詢該服務器上的可用模塊時,該模塊是否被列出,設定為true則列出,設定為false則隱藏。
-
uid/gid:指定傳輸文件時以哪個用戶/組的身份傳輸。
-
auth users:指定傳輸時要使用的用戶名。
-
secrets file:指定密碼文件,該參數連同上面的參數如果不指定,則不使用密碼驗證。注意,該密碼文件的權限一定要是600。
-
hosts allow:表示被允許連接該模塊的主機,可以是IP或者網段,如果是多個,中間用空格隔開。
編輯secretsfile并保存后要賦予600權限,如果權限不對,則不能完成同步,如下所示:
#vi/etc/rsyncd.passwd//寫入如下內容
test:test123
#chmod600/etc/rsyncd.passwd
啟動rsyncd服務,如下所示:
#rsync--daemon--config=/etc/rsyncd.conf
啟動后可以查看一下日志,并查看端口是否啟動,如下所示:
2020/06/2617:43:11[4680]rsyncdversion3.1.3starting,listeningonport873
tcp 0 0 192.168.72.128:873 0.0.0.0:* LISTEN 4680/rsync
如果想開機啟動rsyncd服務,請把/usr/bin/rsync --daemon --confg=/etc/rsyncd.conf寫入/etc/rc.d/rc.local文件。為了不影響實驗過程,還需要把兩臺機器的firewalld服務關閉,并設置為不開機啟動,操作過程如下所示:
#systemctlstopfirewalld;systemctldisablefirewalld//兩臺機器都執行
Removed/etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
#rsync-avLtest@192.168.72.128::test/test1//tmp/test5/
Password:
receivingincrementalfilelist
createddirectory/tmp/test5
./
1
1.txt
2
2.txt
3
4
sent141bytesreceived377bytes8.56bytes/sec
total size is 0 speedup is 0.00
阿銘剛剛提到了選項usechroot,默認為true。首先在主機128的/root/rsync/test1/目錄下創建一個軟連接文件,如下所示:
#ln-s/etc/passwd/root/rsync/test1/test.txt
#ls-l/root/rsync/test1/test.txt
47/root/rsync/test1/test.txt->/etc/passwd :
然后再到主機129上執行同步,如下所示:
# rsync -avL
:test/test1/ /tmp/test6/
:Password:
receivingincrementalfilelist
"/test1/test.txt"(intest)
:createddirectory/tmp/test6
./
1
1.txt
2
2.txt
3
4
sent141bytesreceived436bytes42.74bytes/sec
totalsizeis0speedupis0.00
somefiles/attrswerenottransferred(seepreviouserrors)(code23)at
:[generator=3.1.3]
從上例可以看出,如果設置usechroot為true,則同步軟連接文件會有問題。下面阿銘把主機128的rsync配置文件修改一下,把true改為false,如下所示:
#sed-i's/usechroot=true/usechroot=false/'/etc/rsyncd.conf
#grep'usechroot'/etc/rsyncd.conf
use chroot=false
然后再到主機129上再次執行同步,如下所示:
#rsync-avLtest@192.168.72.128::test/test1//tmp/test7/
Password:
receivingincrementalfilelist
created directory
/tmp/test7
./
1
1.txt
2
2.txt
3
4
test.txt
sent160bytesreceived1,556bytes137.28bytes/sec
totalsizeis1,113speedupis0.65
這樣問題就解決了。另外,修改完rsyncd.conf配置文件后不需要重啟rsyncd服務,這是rsync的一個特定機制,配置文件是即時生效的。上面的例子中,阿銘都有輸入密碼,這意味著我們還是不能寫入腳本中自動執行。其實這種方式可以不用手動輸入密碼,它有兩種實現方式。(1) 指定密碼文件在客戶端(即主機129)上編輯一個密碼文件:/etc/pass,加入test用戶的密碼:
test123
修改密碼文件的權限:
# chmod 600 /etc/pass
在同步時指定密碼文件,就可以省去輸入密碼的步驟,如下所示:
#rsync-avLtest@192.168.72.128::test/test1//tmp/test8/--password-file=/etc/pass
receivingincrementalfilelist
createddirectory/tmp/test8
./
1
1.txt
2
2.txt
3
4
test.txt
sent160bytesreceived1,556bytes149.22bytes/sec
totalsizeis1,113speedupis0.65
(2) 在rsync服務端不指定用戶在服務端(即主機128)上修改配置文件rsyncd.conf,刪除關于認證賬戶的配置項(authuser和secretsfile這兩行),如下所示:
#sed-i's/authusers/#authusers/;s/secretsfile/#secretsfile/'/etc/rsyncd.conf
上例是在auth users和secretsfile這兩行的最前面加一個#,這表示將這兩行作為注釋,使其失去意義。在前面阿銘未曾講過sed的這種用法,它是用分號把兩個替換的子命令塊替換了。然后我們再到客戶端主機129上進行測試,如下所示:
#rsync-avLtest@192.168.72.128::test/test1//tmp/test9/
receivingincrementalfilelist
createddirectory/tmp/test9
./
1
1.txt
2
2.txt
3
4
test.txt
sent 160 bytes received 1,556 bytes 163.43 bytes/sec
totalsizeis1,113speedupis0.65
注意,這里不用再加test這個用戶了,默認是以root的身份復制的。現在登錄時已經不需要輸入密碼了。
審核編輯 :李倩
-
Linux
+關注
關注
87文章
11229瀏覽量
208928 -
數據備份
+關注
關注
0文章
57瀏覽量
11838
原文標題:一篇文章學會數據備份利器rsync
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論