linux rsync檔案備份
阿新 • • 發佈:2022-04-20
第1章 Rsync本地模式和遠端模式
1.命令說明
純通過rsync的命令,來實現,資料目錄A 拷貝到資料目錄B
也就是模擬cp的用法 很簡單
1,安裝 yum install rsync -y [root@rsync-41 ~]#yum install rsync -y 語法命令,分為幾個模式 本地模式 rsync 引數 源路徑 目標路徑 rsync -avzP /var/log /tmp 遠端模式,推送方式,把自己的資料推送到另一臺機器上(上傳) 語法1,rsync預設走ssh協議 rsync 引數 源路徑 root@ip:目標路徑 rsync -avzP /var/log/ [email protected]:/opt 語法2 rsync 引數 源路徑 root@ip::目標路徑 遠端模式,拉取方式,拉取別人機器的資料到自己機器上(下載) rsync 引數 root@ip:源路徑 目標路徑 rsync 引數 root@ip::源路徑目標路徑 rsync -avzP [email protected]:/var/log/ /tmp/ 引數解釋 -v 詳細模式輸出 -a 歸檔模式,遞迴的方式傳輸檔案,並保持檔案的屬性,等同於 -rlptgoD -r 遞迴拷貝目錄 -l 保留軟連結 -p 保留原有許可權 -t 保留原有時間(修改) -g 保留屬組許可權 -o 保留屬主許可權 -D 等於--devices --specials 表示支援b,c,s,p型別的檔案 -R 保留相對路徑 -H 保留硬連結 -A 保留ACL策略 -e 指定要執行的遠端shell命令 -E 保留可執行許可權 -X 保留擴充套件屬性資訊 a屬性 比較常用的組合引數 rsync -avzP -a 保持檔案原有屬性 -v 顯示傳輸細節情況 -z 對傳輸資料壓縮傳輸 -P 顯示檔案傳輸的進度資訊 你在命令列裡,執行命令,喜歡看到命令的執行過程 -avzP 腳本里面? bash xxx.sh rsync -az
2.本地模式
linux機器本身,資料來回傳送
以後cp命令可以放一邊了,用rsync當cp使用就行 建立兩個測試資料夾 [root@rsync-41 ~]#mkdir /666 [root@rsync-41 ~]#mkdir /777 在測試資料夾裡寫入測試資料 1G的檔案的小 [root@rsync-41 ~]#dd bs=100M count=10 if=/dev/zero of=/666/1G.log 10+0 records in 10+0 records out 1048576000 bytes (1.0 GB) copied, 4.37126 s, 240 MB/s [root@rsync-41 ~]#ll -h /666/ total 1000M -rw-r--r-- 1 root root 1000M Apr 20 15:25 1G.log # 用rsync,支援增量備份 [root@rsync-41 ~]#rsync -avzP /666/ /777 sending incremental file list ./ 1G.log 1,048,576,000 100% 117.57MB/s 0:00:08 (xfr#1, to-chk=0/2) sent 1,019,848 bytes received 38 bytes 119,986.59 bytes/sec total size is 1,048,576,000 speedup is 1,028.13 [root@rsync-41 ~]#ls /777/ 1G.log [root@rsync-41 ~]#touch /666/12.log [root@rsync-41 ~]#rsync -avzP /666/ /777 sending incremental file list ./ 12.log 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=1/3) sent 127 bytes received 38 bytes 330.00 bytes/sec total size is 1,048,576,000 speedup is 6,355,006.06
對檔案同步 [root@rsync-41 ~]#yum install rsync -y 把本地的/777/1G.log 檔案 拷貝到/777下 拷貝單個檔案 [root@rsync-41 ~]#rsync -avzP /666/1G.log /777 sending incremental file list 1G.log 1,048,576,000 100% 121.58MB/s 0:00:08 (xfr#1, to-chk=0/1) sent 1,019,826 bytes received 35 bytes 107,353.79 bytes/sec total size is 1,048,576,000 speedup is 1,028.16 拷貝單個大檔案,拷貝大檔案時,要注意限速,否則佔用磁碟IO太多 --bwlimit=10 就是限制速度為10M每秒 生成一個2G的檔案 [root@rsync-41 ~]#dd bs=100M count=20 if=/dev/zero of=/666/2G.log 20+0 records in 20+0 records out 2097152000 bytes (2.1 GB) copied, 2.31622 s, 905 MB/s iotop檢視磁碟的讀寫IO情況 限制單個大檔案的傳輸,速度只給他20M每秒 [root@rsync-41 ~]#rsync -avzP --bwlimit=20 /666/2G.log /777 sending incremental file list 2G.log 659,816,448 31% 20.16MB/s 0:01:09 對目錄同步(注意語法的區別) 拷貝都得資料,是否攜帶該目錄本身 [root@rsync-41 ~]#rsync -avzP /var/log /opt 不拷貝目錄本身,拷貝目錄下的資料 [root@rsync-41 ~]#rsync -avzP /var/log/ /opt 測試資料夾的增量拷貝 [root@rsync-41 ~]#rsync -avzP /666/ /777 sending incremental file list sent 108 bytes received 12 bytes 240.00 bytes/sec total size is 3,145,728,000 speedup is 26,214,400.00 [root@rsync-41 ~]#echo "123" >/666/12.log [root@rsync-41 ~]#rsync -avzP /666/ /777 sending incremental file list 12.log 4 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=2/4) sent 157 bytes received 35 bytes 384.00 bytes/sec total size is 3,145,728,004 speedup is 16,384,000.02 無差異化拷貝 使用--delete引數,將目標目錄資料清空,保證完全和源目錄資料一致 rsync -avzP --delete /666/ /777/ [root@rsync-41 ~]#ls /666 12.log 1G.log 2G.log 作業1.log 作業2.log [root@rsync-41 ~]#ls /777/ 12.log 1G.log 2G.log [root@rsync-41 ~]#rsync -avzP --delete /666/ /777/ sending incremental file list ./ 作業1.log 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=1/6) 作業2.log 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=0/6) sent 234 bytes received 57 bytes 582.00 bytes/sec total size is 3,145,728,004 speedup is 10,810,061.87 [root@rsync-41 ~]#ls /666/ 12.log 1G.log 2G.log 作業1.log 作業2.log [root@rsync-41 ~]#ls /777/ 12.log 1G.log 2G.log 作業1.log 作業2.log rsync拷貝資料夾,攜帶目錄本身 把666目錄本身,連帶這資料,都拷貝到777下 [root@rsync-41 ~]#rsync -avzP /666 /777/ 最終會生成 /777/666/ 該資料夾的資料,和源資料目錄/666是一樣的 [root@rsync-41 ~]#ls /777 12.log 1G.log 2G.log 666 作業1.log 作業2.log 對rsync限速,因為rsync在傳輸資料時,會佔用大量的磁碟IO,以及如果時網路傳輸的話,佔用網路寬頻,會導致其他程式受影響 所以rsync這樣的備份服務,都是在夜裡,凌晨操作,別影響其他程式 --delete 實現/666 和 /777 完全一樣 [root@rsync-41 ~]#rsync -avzP --delete /666/ /777 [root@rsync-41 ~]#ls /666 /777 /666: 12.log 1G.log 2G.log 作業1.log 作業2.log /777: 12.log 1G.log 2G.log 作業1.log 作業2.log
3.遠端模式
把/666下的資料,拷貝到 /999下
把rsync-41 /666下的資料
拷貝到 nfs-31 /888下
實現如scp的作用
PUSH 推送模式 上傳模式
把rsync-41 /666下的資料,拷貝到 nfs-31 /888下
登入rsync-41
用ip的形式,再用主機名的形式
新增無差異化引數,該引數,慎用!,搞清楚了你在幹什麼!
[root@rsync-41 ~]#rsync -avzP --delete /666/ [email protected]:/888/
輸入nfs-31的密碼
[root@nfs-31 ~]#ls /888/
12.log 2G.log 作業1.log 作業2.log
PULL 拉取模式(要琢磨,資料最終放在了哪裡)
把rsync-41 /666下的資料,拷貝到nfs-31 /888下
[root@nfs-31 ~]#rsync -avzP [email protected]:/666/ /888/
[root@nfs-31 ~]#ls /888
12.log 2G.log 作業1.log 作業2.log
拉取rsync-41的/etc/passwd檔案到 nfs-31的 /888下,使用主機名通訊
[root@nfs-31 ~]#rsync -avzP root@rsync-41:/etc/passwd /888/
[root@nfs-31 ~]#ls /888
12.log 2G.log passwd 作業1.log 作業2.log
傳輸整個目錄,包含目錄本身
[root@nfs-31 ~]#rsync -avzP [email protected]:/666 /888/
只傳輸目錄下的檔案,不包含目錄本身
[root@nfs-31 ~]#rsync -avzP [email protected]:/666/ /888/
不同主機之間同步資料 --delete
rsync -avzP --delete [email protected]:/root /tmp/
坑:如果和一個空目錄進行完全同步,那麼效果和刪庫,刪根一樣
坑:傳輸過程不限速導致寬頻被佔滿,--bwlimit=30
遠端傳輸 nfs-31下的/888/2G.log 備份到rsync-41的/777下
[root@nfs-31 ~]#rsync -avzP --bwlimit=30 /888/2G.log [email protected]:/777
[email protected]'s password:
sending incremental file list
2G.log
2,097,152,000 100% 30.81MB/s 0:01:04 (xfr#1, to-chk=0/1)
sent 2,039,554 bytes received 35 bytes 28,930.34 bytes/sec
total size is 2,097,152,000 speedup is 1,028.22
[root@rsync-41 ~]#ls /777
2G.log
-a 保持檔案原有屬性
-v 顯示傳輸過程
-z 壓縮傳輸資料
-P 顯示傳輸進度
遠端備份檔案,且改名
[root@nfs-31 ~]#rsync -avzP /888/作業1.log [email protected]:/777/420作業
[root@rsync-41 ~]#ls /777
2G.log 420作業
遠端傳輸 nfs-31下的 /888/ 備份到 rsync-41的 /777下,且是無差異化備份
等於清空原有的 /777 下的資料
原有資料
[root@rsync-41 ~]#ls /777
2G.log 420作業
[root@nfs-31 ~]#ls /888
12.log 2G.log passwd 作業1.log 作業2.log
[root@nfs-31 ~]#rsync -avzP --delete /888/ [email protected]:/777
[root@rsync-41 ~]#ls /777
12.log 2G.log passwd 作業1.log 作業2.log
第2章 Rsync服務模式-服務端配置
0.為什麼需要服務模式
Rsync 藉助 SSH 協議同步資料存在的缺陷:
1.使用系統使用者(不安全) /etc/passwd
2.使用普通使用者(會導致許可權不足情況)
3.守護程序傳輸方式: rsync 自身非常重要的功能(不使用系統使用者,更加安全)
1.安裝rsync
yum install rsync -y
2.修改配置檔案
複製貼上如下程式碼即可
[root@rsync-41 ~]#cat > /etc/rsyncd.conf << 'EOF'
> uid = www
> gid = www
> port = 873
> fake super = yes
> use chroot = no
> max connections = 200
> timeout = 600
> ignore errors
> read only = false
> list = false
> auth users = rsync_backup
> secrets file = /etc/rsync.passwd
> log file = /var/log/rsyncd.log
> #####################################
> [backup]
> comment = yuchaoit.cn about rsync
> path = /backup
>
> [data]
> comment = this is secord backup dir,to website data..
> path = /data
> EOF
3.建立使用者以及資料目錄
根據你的配置檔案中定義的資訊,建立對應的使用者,備份的目錄
該無法登入的使用者,只是用於執行程序的賬戶
[root@rsync-41 ~]#useradd -u 1000 -M -s /sbin/nologin www
建立配置檔案中定義的2個備份目錄
[root@rsync-41 ~]#mkdir -p /data/ /backup
修改備份目錄的許可權
[root@rsync-41 ~]#chown -R www:www /data/
[root@rsync-41 ~]#chown -R www:www /backup/
[root@rsync-41 ~]#ll -d /data /backup/
drwxr-xr-x 2 www www 6 Apr 20 16:53 /backup/
drwxr-xr-x 2 www www 6 Apr 20 16:53 /data
4.建立rsync專用的賬戶密碼(這一步很重要,有錯基本也是來這裡排查)
1.建立密碼檔案,寫入賬戶和密碼,用於和客戶端連線時候的認證
[root@rsync-41 ~]#vim /etc/rsync.passwd
2.寫入賬戶密碼
[root@rsync-41 ~]#cat /etc/rsync.passwd
rsync_backup:123456
3.待會客戶端向rsync伺服器推送資料,就得用這個賬號密碼!!!
4.這一步,非常重要,rsync要求降低密碼檔案的許可權,且必須是600
[root@rsync-41 ~]#chmod 600 /etc/rsync.passwd
[root@rsync-41 ~]#ll /etc/rsync.passwd
-rw------- 1 root root 20 Apr 20 16:58 /etc/rsync.passwd
5.加入開機自啟
設定rsyncd服務,執行,且開機自啟
[root@rsync-41 ~]#systemctl start rsyncd 啟動
[root@rsync-41 ~]#systemctl enable rsyncd 開機自啟
檢查rsyncd服務是否執行,以及該服務的執行日誌
先備份
[root@rsync-41 ~]#cp /etc/rsync.passwd{,.ori}
[root@rsync-41 ~]#ls /etc/rsync.passwd*
/etc/rsync.passwd /etc/rsync.passwd.ori
[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
Main PID: 2364 (rsync)
CGroup: /system.slice/rsyncd.service
└─2364 /usr/bin/rsync --daemon --no-detach
Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.
6.檢查服務是否執行
[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
Main PID: 2364 (rsync)
CGroup: /system.slice/rsyncd.service
└─2364 /usr/bin/rsync --daemon --no-detach
Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.
無論是學習期間還是上班了,都養成好習慣
給別人啟動了某程式後,給自己啟動某程式
務必去檢查,驗證是否正確
[root@rsync-41 ~]#ps -ef |grep 'rsync' |grep -v 'grep'
root 2364 1 0 17:06 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@rsync-41 ~]#netstat -tunlp |grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 2364/rsync
tcp6 0 0 :::873 :::* LISTEN 2364/rsync
第3章 Rsync服務模式-客戶端配置
1.安裝rsynv
yum install rsync -y
2.配置密碼檔案以及授權
此時rsync客戶端,需要把資料推送到rsync服務端
但是需要賬戶認證,這個賬戶密碼,是服務端指定好的
賬號:rsync_backup
密碼:123456
客戶端需要做的操作有2個,提供密碼認證
1.生成密碼檔案,每次連線都指定這個密碼檔案
2.生成密碼變數,讓當前系統中存在叫做 RSYNC_PASSWORD 這個變數,以及變數的指,是配置檔案中的密碼即可
進行客戶端資料傳送
下載,服務端rsync-41的資料
賬號:rsync_backup
密碼:123456
推送,備份,傳送nfs-31的資料到rsync-41
把客戶端的資料,傳送給服務端的backup備份模組下
語法,不一樣了,注意語法的寫法!!!
把客戶端的 /tmp/200M.log 備份,傳送到rsync-41機器上的backup模組下
rsync -avzP /tmp/200M.log 賬戶@主機名::模組名
預設無密碼變數,也無密碼檔案,需要你自己輸入該rsync_backup虛擬使用者的密碼
需要互動式的輸入密碼,無法在指令碼中使用rsync同步命令
rsync基本都是和指令碼結合使用
[root@nfs-31 ~]#rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup
[root@rsync-41 ~]#ls /backup/
200M.log
非互動式密碼的操作,如下2個方法
1.生成密碼檔案,每次連線都指定這個密碼檔案(在客戶端生成)
[root@nfs-31 ~]#echo '123456' > /etc/my_rsync.pwd
還必須降低密碼檔案的許可權才行,必須是600
[root@nfs-31 ~]#chmod 600 /etc/my_rsync.pwd
[root@nfs-31 ~]#ll /etc/my_rsync.pwd
-rw------- 1 root root 7 Apr 20 17:47 /etc/my_rsync.pwd
此時可以傳輸資料了,往data模組下傳輸
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data
[root@rsync-41 ~]#ls /data
200M.log
如果是指令碼中的話,去掉vP顯示過程的引數去掉
[root@nfs-31 ~]#rsync -az --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data
2.生成密碼變數,讓當前系統中存在叫做 RSYNC_PASSWORD 這個變數 ,以及變數的值,是配置檔案中的密碼即可
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'
[root@nfs-31 ~]#rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup
[root@rsync-41 ~]#ls /backup/
200M.log
下載備份伺服器的資料
[root@nfs-31 ~]#rsync -avzP rsync_backup@rsync-41::backup /888/
receiving incremental file list
./
200M.log
200 100% 195.31kB/s 0:00:00 (xfr#1, to-chk=0/2)
sent 50 bytes received 141 bytes 382.00 bytes/sec
total size is 200 speedup is 1.05
[root@nfs-31 ~]#ls /888
200M.log
要輸入密碼
1.的確沒指定密碼檔案
2.是否有密碼變數呢?
如何需要輸入密碼呢
撤銷這個密碼變數
[root@nfs-31 ~]#unset RSYNC_PASSWORD
或者重新登入,只要密碼變數失效,就必須輸入密碼了,或者使用密碼檔案
rsync -avzP rsync_backup@rsync-41::backup /tmp/
非互動式的密碼認證方式
1.使用密碼變數
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'
2.指定密碼檔案
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup /tmp/
[root@nfs-31 ~]#ls /tmp/
200M.log ks-script-U3fLGb vmware-root yum.log
錯誤,檔名不對,示範
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup/200M.logggggggggg /tmp/
receiving incremental file list
rsync: link_stat "200M.logggggggggg" (in backup) failed: No such file or directory (2)
sent 8 bytes received 106 bytes 228.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1651) [Receiver=3.1.2]
關於rsync的常見錯誤
rsync由於配置步驟比較細節,比較坑多,較多,可能會遇見各種錯誤
遇見問題,遇見錯誤
看日誌
看日誌
看日誌
看日誌
看日誌
思路一:看服務指定的日誌檔案在哪
思路二:檢查是否運行了,以及它的執行日誌部分資訊
檢查是否開機執行
systemctl is-enabled
systemctl restart 重啟服務
systemctl status 檢視服務狀態
systemctl start 啟動服務
systemctl enable 設定服務開機自啟
systemctl disable 禁止開機自啟