一、rsync數據同步服務
1、介紹
Rsync是一款開源的,快速的,多功能的,可實現全量及增量的本地或遠程數據同步備份的優秀工具。Rsync軟件適用於多種操作系統平台。
Rsync具有使本地和遠程兩台主機之間的數據快速復制同步鏡像,遠程備份的功能。相對於同類產品,Rsync的同步數據的性能和效率更省一籌。
(1)一個rsync相當於scp、cp、rm,但是還優於這些命令。傳統的拷貝工具每次只能進行全部的拷貝,rsync工具除了進行完全拷貝之外,還可以進行增量拷貝。
(2)在同步備份數據時,默認情況下,rsync通過“quick check”算法:僅同步大小或者最后修改時間發生變化的文件或者目錄;也可以根據權限、屬主等屬性的變化同步(需指定參數)。
2、數據同步原理
rsync2.x的對比方法:把所有文件比對一遍之后進行數據同步。
rsync3.x的比對方法:一邊對比差異,一邊對差異的部分進行同步。
3、Rsync的特性
- 支持拷貝特殊文件如鏈接文件、設備等。
- 可以又排除指定文件或目錄同步的功能,相當於打包命令tar的排除功能。
- 可以做到保持源文件或目錄的權限,時間,軟硬鏈接,屬主屬性均不改變 (-p)
- 可以實現增量同步,既只同步發生變化的數據。
- 可以實現rcp、rsh、ssh等方式來配合傳輸文件。
- 可以通過socket(進程)方式傳輸文件和數據
- 只是匿名的或認證(無需系統用戶)的進程模式傳輸,可實現方便安全的進行數據傳輸。
4、Rsync的工作場景
(1)兩台服務器之間進行數據同步(定時任務cron+rsync備份數據)
(2)實時同步(解決存儲服務器等的單點問題)
使用rsync和inotify的功能做實時的數據同步。利用inotify的用戶程序空間文件系統的變化通知,根據存儲服務器上目錄的變化,把變化的數據使用rsync命令實時同步到備份服務器。
小貼士:inotify是一個Linux特性。它監控文件系統操作,比如讀寫、寫入和創建。也可以通過inotify實現數據的同步,所需要的應用軟件inotify-tools。
小貼士二:雙機數據同步還可以通過drbd方案(該方案由內核模塊和相關腳本構成,用以構建高可用性的集群。其實現方法是通過網絡來鏡像整個設備。DRBD負責接受數據,把數據寫到本地磁盤,然后發送給另一個主機,另一個主機再將數據存到自己的磁盤中。)以及雙寫的方案實現雙機數據同步。
5、Rsync的工作方式
Rsync的數據傳輸大概有以下幾種方式。分別為:
(1)單個主機本地的數據傳輸
(2)結束rcp、ssh等通道來傳輸數據
(3)以守護進程(socket)的方式傳輸數據
#以下為三種方式的幫助文檔。查看方式:man rsync 如果沒有該命令,可使用yum install rsync -y (centos)
Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
(1)單個主機本地的數據傳輸
rsync本地傳輸模式的語法是:
rsync [option] SRC [dest] / rsync 選項 源文件 目的文件
#本地文件復制 [root@localhost ~]# rsync new.sh /opt/ [root@localhost ~]# ll /opt/ 總用量 4 -rw-r--r--. 1 root root 92 12月 29 23:01 new.sh [root@localhost ~]# ll 總用量 8 -rw-------. 1 root root 1259 4月 30 2021 anaconda-ks.cfg -rw-r--r--. 1 root root 92 12月 29 22:12 new.sh #拷貝一個目錄 [root@localhost ~]# mkdir test [root@localhost ~]# rsync -avz /opt/ /root/test sending incremental file list ./ new.sh sent 187 bytes received 38 bytes 450.00 bytes/sec total size is 92 speedup is 0.41 [root@localhost ~]# ll /opt/ 總用量 4 -rw-r--r--. 1 root root 92 12月 29 23:01 new.sh [root@localhost ~]# ll /root/test/ 總用量 4 -rw-r--r--. 1 root root 92 12月 29 23:01 new.sh #刪除功能 [root@localhost ~]# mkdir /abc [root@localhost ~]# rsync -avz --delete /abc/ /root/test/ #delete的意思是讓源目錄和目標目錄保持一致,所以需要創建一個新的空文件夾 sending incremental file list deleting new.sh deleting abc03 deleting abc02 deleting abc01 ./ sent 43 bytes received 56 bytes 198.00 bytes/sec total size is 0 speedup is 0.00 [root@localhost ~]# tree /root/test /root/test 0 directories, 0 files
rsync的一些常用參數選項:
| 選項 | 具體作用 |
| -v,--version | 詳細模式輸出,傳輸時進度等信息。 |
| -z,--compress | 傳輸時進行壓縮以提高效率。 --compose-level=NUM可按級別壓縮。 |
| -a,--archive | 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性。 |
| -r,--recursive | 對子目錄以遞歸模式,即目錄下的所有目錄都同樣傳輸。 |
| -t,--times | 保持文件的時間信息 |
| -o,--owner | 保持文件的屬主信息 |
| -p,--perms | 保持文件權限 |
| -g,--group | 保持文件的屬組信息 |
| -P,--progress | 顯示同步過程中及傳輸時的進度等信息 |
| -D,--devices | 保持設備文件的信息 |
| -l,--links | 保留軟鏈接 |
| --bwlimit=RATE | 對傳輸文件的帶寬進行限制 |
| --delete | 讓源目錄和目標目錄的文件保持一致 |
#帶寬限制 [root@localhost ~]# rsync -avz new.sh 192.168.10.12:/root --bwlimit=10 #兩台服務器都需要以及安裝rsync root@192.168.10.12's password: sending incremental file list new.sh sent 167 bytes received 35 bytes 57.71 bytes/sec total size is 92 speedup is 0.46 #保持同步目錄及文件屬性 參數:-avz 或者 -vzrtopg
一些使用實例
#測試本地rsync同步,並同步權限
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir anliu
[root@localhost opt]# touch anliu/test.txt
[root@localhost opt]# chmod -R 700 anliu
[root@localhost opt]# ls -l
總用量 0
drwx------. 2 root root 22 2月 11 21:44 anliu[root@localhost opt]# tree /tmp/
/tmp/0 directories, 0 files
[root@localhost opt]# rsync /opt/ /tmp/
skipping directory .
[root@localhost opt]# rsync -avz /opt/ /tmp/
sending incremental file list
./
anliu/
anliu/test.txtsent 149 bytes received 46 bytes 390.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost opt]# ll /tmp/
總用量 0
drwx------. 2 root root 22 2月 11 21:44 anliu
[root@localhost opt]# ll /tmp/anliu/
總用量 0
-rwx------. 1 root root 0 2月 11 21:44 test.txt#目錄復制區別
①、rsync -avz /opt/ /tmp/ 僅復制opt目錄內的內容,opt目錄本身不同步。
②、rsync -avz /opt /tmp/ 表示將opt目錄下的所有以及opt目錄本身全部同步
(2)借助ssh通道在兩台主機之間來傳輸數據
兩台主機之間推送
#兩台主機之間拉取數據
[root@localhost ~]# rsync -avzP -e 'ssh -p 22' /tmp root@192.168.10.11:tmp/ #-e 'ssh -p 22' :該選項表示已ssh的方式通過22端口推送,如果不寫,默認為22端口
root@192.168.10.11's password:
sending incremental file list
created directory tmp
tmp/
tmp/.ICE-unix/
tmp/.Test-unix/
tmp/.X11-unix/
tmp/.XIM-unix/
tmp/.font-unix/
tmp/anliu/
tmp/anliu/test.txt
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/8)
sent 297 bytes received 93 bytes 60.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost ~]# ssh root@192.168.10.11 "ls -l tmp"
root@192.168.10.11's password:
總用量 0
drwxr-xr-x. 8 root root 106 2月 11 21:44 tmp
兩台主機之間推送數據
[root@localhost ~]# rsync -avzP root@192.168.10.11:/root/abc* /root
root@192.168.10.11's password:
receiving incremental file list
abc01.txt
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=2/3)
abc02.txt
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=1/3)
abc03.txt
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=0/3)
sent 81 bytes received 194 bytes 78.57 bytes/sec
total size is 0 speedup is 0.00
[root@localhost ~]# ls
abc01.txt abc02.txt abc03.txt anaconda-ks.cfg new.sh
可以使用映射好的主機名進行數據傳輸:
[root@localhost ~]# rsync -avzP root@rsync:/tmp /root
root@rsync's password:
receiving incremental file list
tmp/
tmp/123
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=5/7)
tmp/.ICE-unix/
tmp/.Test-unix/
tmp/.X11-unix/
tmp/.XIM-unix/
tmp/.font-unix/
sent 71 bytes received 257 bytes 59.64 bytes/sec
total size is 0 speedup is 0.00
[root@localhost ~]# ls
abc01.txt abc02.txt abc03.txt anaconda-ks.cfg new.sh tmp
[root@localhost ~]# tail -1 /etc/hosts
192.168.10.11 rsync
(3)以守護進程(socket)的方式傳輸數據
1、為什么使用守護進程模式?
①、rsync傳輸時,使用的是系統用戶和系統用戶的密碼,不安全。
②、使用普通用戶會因為權限問題導致數據傳輸失敗
2、守護進程模式搭建
| 主機名 | IP | 用途 |
| a-server | 192.168.10.11 | rsync服務端 |
| b-server | 192.168.10.12 | rsync客戶端 |
①、准備工作 (服務端與客戶端均需操作)
#修改主機名 [root@localhost ~]# hostnamectl set-hostname a-server [root@localhost ~]# su -l 上一次登錄:三 12月 29 21:22:51 CST 2021從 192.168.10.1pts/0 上 #關閉防火牆或者打開端口873 [root@a-server ~]# systemctl stop firewalld [root@a-server ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. #安裝常用軟件包以及時間同步 [root@a-server ~]# yum install vim wget tree lsof ntpdate net-tools rsync -y [root@a-server ~]# ntpdate cn.pool.ntp.org 14 Feb 11:21:38 ntpdate[7873]: step time server 84.16.73.33 offset 4024336.128826 sec [root@a-server ~]# hwclock -w [root@a-server ~]# date 2022年 02月 14日 星期一 11:21:47 CST
②、服務端操作
#確認rsync已經安裝
[root@a-server ~]# rpm -qa | grep rsync
rsync-3.1.2-10.el7.x86_64
#修改配置文件
[root@a-server ~]# cp -p /etc/rsyncd.conf{,.bak}
[root@a-server ~]# vim /etc/rsyncd.conf
[root@a-server ~]# grep -vE "^#|^$" /etc/rsyncd.conf
uid = root #用戶
gid = root #組
use chroot = no #程序安全設置
max conections = 200 #客戶端連接數
timeout = 300 #超時時間
pid file = /var/run/rsyncd.pid #進程號文件位置
lock file = /var/run/rsync.lock #進程鎖
log file = /var/run/rsyncd.log #日志文件位置
[backup]
path = /backup/ #使用目錄
ignore errors #有錯誤時忽略
read only = false #可讀可寫
list = false #阻止遠程列表(不讓遠程方式查看服務端有什么)
hosts allow = 192.168.10.0/24 #允許IP
hosts deny = 0.0.0.0/32 #阻止IP
auth users = rsync_backup #虛擬用戶
secrets file = /etc/rsync.password #存放用戶和密碼的文件
#創建共享目錄以及添加rsync程序用戶
[root@a-server ~]# useradd -M -s /sbin/nologin rsync
[root@a-server ~]# cat /etc/passwd | grep rsync
rsync:x:1000:1000::/home/rsync:/sbin/nologin
[root@a-server ~]# cat /etc/group | grep rsync
rsync:x:1000:
[root@a-server ~]# mkdir /backup
#啟動服務並查看
[root@a-server ~]# rsync --daemon
[root@a-server ~]# netstat -antup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7897/rsync
tcp6 0 0 :::873 :::* LISTEN 7897/rsync
3修改共享目錄的屬主以及權限
[root@a-server ~]# chown -R rsync:rsync /backup/
[root@a-server ~]# chmod -R 755 /backup/
[root@a-server ~]# ll -d /backup/
drwxr-xr-x. 2 rsync rsync 6 2月 14 11:35 /backup/
#創建rsync虛擬賬戶和密碼
[root@a-server ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@a-server ~]# cat /etc/rsync.password
rsync_backup:123456
#將賬戶密碼文件權限設置為600(重要),並將rsync啟動作為開機自啟
[root@a-server ~]# chmod 600 /etc/rsync.password
[root@a-server ~]# ll /etc/rsync.password
-rw-------. 1 root root 20 2月 14 11:38 /etc/rsync.password
[root@a-server ~]# echo "rsync --daemon" > /etc/rc.local
[root@a-server ~]# tail -1 /etc/rc.local
rsync --daemon
③、客戶端操作
#創建密碼文件 [root@b-server ~]# rpm -qa | grep rsync rsync-3.1.2-10.el7.x86_64 [root@b-server ~]# echo "123456" > /etc/rsync.password #將密碼文件的權限設置為600 [root@b-server ~]# chmod -R 600 /etc/rsync.password [root@b-server ~]# ll /etc/rsync.password -rw-------. 1 root root 7 12月 29 22:04 /etc/rsync.password
④、測試
推送測試一:將客戶端指定目錄內容推送到服務端rsync指定目錄下
[root@b-server ~]# mkdir /backup
[root@b-server ~]# ll /backup/
總用量 36796
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
[root@b-server ~]# rsync -avzP /backup/ rsync_backup@192.168.10.11::backup --password-file=/etc/rsync.password
sending incremental file list
./
zookeeper-3.4.14.tar.gz
37,676,320 100% 3.61MB/s 0:00:09 (xfr#1, to-chk=0/2)
sent 37,604,425 bytes received 46 bytes 3,269,954.00 bytes/sec
total size is 37,676,320 speedup is 1.00
[root@b-server ~]# ssh root@192.168.10.11 "ls -l /backup"
root@192.168.10.11's password:
總用量 36796
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
#選項說明:
-avzP :各項屬性不變,-P顯示具體同步過程。
/backup/ :要推送的內容所在的目錄
rsync_backup:服務端rsync服務的同步的用戶名(/etc/rsyncd.conf中配置)
192.168.10.11 :rsync服務端的IP
backup:rsync服務器配置文件里的模塊名
--password-file=/etc/rsync.password :免密碼的操作。指定密碼文件位置,如果不寫,就會使用交互式輸入密碼。
推送測試二:將客戶端任意目錄推送到rsync服務端的指定目錄下
[root@b-server ~]# rsync -avzP /root/ rsync_backup@192.168.10.11::backup --password-file=/etc/rsync.password
sending incremental file list
./
.bash_history
250 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=8/10)
.bash_logout
18 100% 17.58kB/s 0:00:00 (xfr#2, to-chk=7/10)
.bash_profile
176 100% 171.88kB/s 0:00:00 (xfr#3, to-chk=6/10)
.bashrc
176 100% 171.88kB/s 0:00:00 (xfr#4, to-chk=5/10)
.cshrc
100 100% 5.14kB/s 0:00:00 (xfr#5, to-chk=4/10)
.tcshrc
129 100% 6.30kB/s 0:00:00 (xfr#6, to-chk=3/10)
anaconda-ks.cfg
1,259 100% 39.66kB/s 0:00:00 (xfr#7, to-chk=2/10)
.ssh/
.ssh/known_hosts
175 100% 2.80kB/s 0:00:00 (xfr#8, to-chk=0/10)sent 2,025 bytes received 187 bytes 1,474.67 bytes/sec
total size is 2,283 speedup is 1.03
[root@b-server ~]# ssh root@192.168.10.11 "ls -l /backup"
root@192.168.10.11's password:
總用量 36800
-rw-------. 1 root root 1259 4月 30 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
拉取測試一:將rsync服務端指定目錄全部內容同步到客戶端
[root@b-server ~]# rsync -avzP rsync_backup@192.168.10.11::backup /tmp --password-file=/etc/rsync.password
receiving incremental file list
./
.bash_history
250 100% 244.14kB/s 0:00:00 (xfr#1, to-chk=9/11)
.bash_logout
18 100% 0.13kB/s 0:00:00 (xfr#2, to-chk=8/11)
.bash_profile
176 100% 0.49kB/s 0:00:00 (xfr#3, to-chk=7/11)
.bashrc
176 100% 0.37kB/s 0:00:00 (xfr#4, to-chk=6/11)
.cshrc
100 100% 0.19kB/s 0:00:00 (xfr#5, to-chk=5/11)
.tcshrc
129 100% 0.19kB/s 0:00:00 (xfr#6, to-chk=4/11)
anaconda-ks.cfg
1,259 100% 1.59kB/s 0:00:00 (xfr#7, to-chk=3/11)
zookeeper-3.4.14.tar.gz
37,676,320 100% 3.01MB/s 0:00:11 (xfr#8, to-chk=2/11)
.ssh/
.ssh/known_hosts
175 100% 0.38kB/s 0:00:00 (xfr#9, to-chk=0/11)sent 210 bytes received 37,606,409 bytes 2,785,675.48 bytes/sec
total size is 37,678,603 speedup is 1.00
[root@b-server ~]# ls -ld /tmp/*
-rw-------. 1 root root 1259 4月 30 2021 /tmp/anaconda-ks.cfg
-rw-r--r--. 1 root root 37676320 12月 29 22:45 /tmp/zookeeper-3.4.14.tar.gz
拉取測試二: 將rsync服務端指定目錄下的指定內容同步到客戶端
[root@b-server ~]# ls -l /backup/
總用量 0
[root@b-server ~]# rsync -avzP rsync_backup@192.168.10.11::backup/zookeeper-3.4.14.tar.gz /backup/ --password-file=/etc/rsync.password
receiving incremental file list
zookeeper-3.4.14.tar.gz
37,676,320 100% 45.42MB/s 0:00:00 (xfr#1, to-chk=0/1)sent 43 bytes received 37,692,144 bytes 15,076,874.80 bytes/sec
total size is 37,676,320 speedup is 1.00
[root@b-server ~]# ls -l /backup/
總用量 36796
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
拉取測試三:將rsync服務端指定目錄下的全部內容排除目錄或者文件后,同步到客戶端
方法一:通過命令行實現排除
[root@b-server ~]# ssh root@192.168.10.11 "tree /backup "
root@192.168.10.11's password:
/backup
├── anliu
│ ├── test01.txt
│ └── test02.txt
├── host
├── opt
└── test1 directory, 5 files
[root@b-server ~]# rsync -avz --exclude=anliu/test02.txt --exclude=test rsync_backup@192.168.10.11::backup /backup/ --password-file=/etc/rsync.password
receiving incremental file list
./
host
opt
anliu/
anliu/test01.txtsent 132 bytes received 278 bytes 273.33 bytes/sec
total size is 0 speedup is 0.00
[root@b-server ~]# tree /backup
/backup
├── anliu
│ └── test01.txt
├── host
├── opt
└── zookeeper-3.4.14.tar.gz1 directory, 4 files
方法二:通過列表文件實現排除
[root@b-server ~]# mkdir /backup01
[root@b-server ~]# cat /root/exclude.txt
anliu/test02.txt
host
[root@b-server ~]# rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.10.11::backup /backup01 --password-file=/etc/rsync.password
receiving incremental file list
./
opt
test
anliu/
anliu/test01.txtsent 132 bytes received 278 bytes 164.00 bytes/sec
total size is 0 speedup is 0.00
[root@b-server ~]# tree /backup01/
/backup01/
├── anliu
│ └── test01.txt
├── opt
└── test1 directory, 3 files
[root@b-server ~]# ssh root@192.168.10.11 "tree /backup"
root@192.168.10.11's password:
/backup
├── anliu
│ ├── test01.txt
│ └── test02.txt
├── host
├── opt
└── test1 directory, 5 file
rsync同步拉取和推送測試(讓rsync客戶端目錄內容始終和rsync服務器共享目錄內容保持一致):
兩者的方法均為使用--delete選項同步,同步即服務端刪除文件,客戶端也刪除文件。實現方法為某一端發生變化后,另一端接着執行同步命令。也可以使用--exclude排除某個文件。
6、關於rsync的一個風險提示
一個關於同步推送的選項 --delete參數,當客戶端將本機內容推送到服務端的備份目錄后,--delete有能里刪除服務端的目錄下的所有文件。所以,備份文件盡可能避免使用--delete 。
7、排錯
錯誤問題參考:rsync 常見錯誤與解決方法整理_服務器其它_腳本之家 (jb51.net)
8、rsync實時同步配置
前提:已經配置好以守護進程(socket)的方式傳輸數據
(1)配置rsync源服務器
關閉只讀模式
[root@a-server backup]# vim /etc/rsyncd.conf
[root@a-server backup]# cat /etc/rsyncd.conf | grep -vE "^#|^$" | grep "read"
read only = no
更改內核參數,指定隊列大小,最多監控實例數,每個實例最多監控文件數
[root@a-server backup]# vim /etc/sysctl.conf
[root@a-server backup]# cat /etc/sysctl.conf | grep -vE "^#|^$"
fs.inotify.max_queued_events = 16384 #監控時間的最大隊列數
fs.inotify.max_user_instances = 1024 #監控的最大實例數
fs.inotify.max_user_watches = 1048576 #監控的每實例的最大文件數
[root@a-server backup]# sysctl -p
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
重新啟動rsync服務
[root@server backup]# cd /var/run/
[root@server run]# cat rsyncd.pid
7993
[root@server run]# kill 7993
[root@server run]# ll | grep rsyncd.pid
[root@server run]# rsync --daemon
[root@server run]# ll | grep rsyncd.pid
-rw-r--r--. 1 root root 6 12月 29 22:45 rsyncd.pid
(2)配置客戶端服務器
下載inotify並上傳至客戶端。下載地址inotify-tools - Browse Files at SourceForge.net
解壓縮並安裝
[root@agent ~]# ls
anaconda-ks.cfg inotify-tools-3.13.tar.gz
[root@agent ~]# tar xf inotify-tools-3.13.tar.gz
[root@agent ~]# cd inotify-tools-3.13
[root@agent inotify-tools-3.13]# yum install gcc gcc-c++ -y
[root@agent inotify-tools-3.13]# ./configure
[root@agent inotify-tools-3.13]# echo $?
0
[root@agent inotify-tools-3.13]# make && make install
[root@agent inotify-tools-3.13]# echo $?
0
測試inotifywait監控是否正常使用
[root@agent ~]# mkdir /var/www
[root@agent ~]# inotifywait -mrq -e modify,create,move,delete /var/www (執行后處於監控狀態,不能輸入,重新開啟終端)
測試
[root@agent ~]# cd /var/www/
[root@agent www]# touch a[root@agent ~]# mkdir /var/www
[root@agent ~]# inotifywait -mrq -e modify,create,move,delete /var/www
/var/www/ CREATE a #測試結果 配置成功
客戶端編寫腳本,將inotify和rsync遠程同步結合起來
[root@agent ~]# vi /opt/rsync_inotify.sh
[root@agent ~]# cat /opt/rsync_inotify.sh
INOTIFY="inotifywait -mrq -e modify,create,attrib,move,delete /var/www"
RSYNC="rsync -avz --delete --password-file=/etc/rsync.password /var/www rsync_backup@192.168.10.11::backup"
$INOTIFY | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l ) -le 0 ];then
$RSYNC
fi
done
運行腳本,並測試
[root@agent www]# sh /opt/rsync_inotify.sh & #因為放入后台依舊會有輸出,所以最好將腳本中的輸出放置到Linux的無底洞(/dev/null)中。
[2] 23486
[root@agent www]# ls
a abc
[root@agent www]# cd abc
[root@agent abc]# touch abc
[root@agent abc]#
sending incremental file list
www/
www/a
www/abc/
www/abc/abcsent 216 bytes received 78 bytes 588.00 bytes/sec
total size is 0 speedup is 0.00
sending incremental file listsent 130 bytes received 26 bytes 312.00 bytes/sec
total size is 0 speedup is 0.00
測試成功!!!
二、FTP服務
1、服務介紹
FTP是文件傳輸協議(File Transfer Protocol)的英文縮寫。用於Internet上控制文件的雙向傳輸。同時,他也是一個應用程序,基於不同的操作系統有不同的引用程序,而這些引用程序都遵循同一個協議用來傳輸文件。
(1)FTP用戶類型
FTP有三種用戶類型:①、匿名用戶:anonymous或ftp
②、本地用戶:賬號名稱、密碼等信息保存在passwd/shadow文件中
③、虛擬用戶:使用獨立賬號/密碼數據文件
(2)FTP工作模式
FTP是僅基於TCP的服務,與眾不同的是FTP協議要用到兩個TCP連接,一個是控制鏈路,用來在客戶端與服務器之間傳遞命令的;另一個是數據鏈路,用來上傳或下載數據的。
FTP協議有兩種工作方式:POST方式和PASV方式,即主動式和被動式
| 主動模式 | 被動模式 | |
| 模式 | 服務端從20端口主動向客戶端發起鏈接 | 服務端在指定范圍內某個端口被動等待與而客戶端鏈接 |
| 端口分配 | 控制端口21 數據傳輸端口20 | 控制端口21 數據傳輸端口 隨機 |
| 過程 | 客戶端從一份任意的非特權端口N(N>1024)向FTP服務器的命令端口(默認21)發送請求,服務器接受連接,建立一條命令鏈路。 當需要傳送數據時,客戶端開始監聽端口N+1,並在命令鏈路上用PORT命令發送N+1端口到FTP服務器,於是服務器會從自己的數據端口(20)向客戶端指定的數據端口(N+1)發送連接請求,建立一條數據鏈路來傳輸數據。 |
客戶端從一份任意的非特權端口N(N>1024)向FTP服務器的命令端口(默認21)發送請求,服務器接受連接,建立一條命令鏈路。 當需要傳輸數據時,客戶端在命令鏈路上用PASV命令發送。於是服務器會開啟一個任意的非特權端口P(P>1024),並在命令鏈路上把端口發送給客戶端,然后客戶端從自己的數據端口(N+1)向服務器的數據端口(P)發送連接請求,建立一條數據鏈路來傳送數據。 |
| 優點 | 對FTP服務器的管理有利 |
對FTP客戶端管理有利 |
| 缺點 | 對客戶端管理不利(FTP服務器企圖與客戶端的高位隨機端口建立對接,而這個端口很有可能會被客戶端的防火牆阻塞掉) | 對服務器端管理不利(因為客戶端需要與服務器端建立兩個連接,其中一個連到一個高位隨機端口,而這個端口很有可能被服務器端的防火牆阻塞掉) |
(3)FTP傳輸模式
FTP有兩種傳輸模式:①、ASCII模式:即文本模式,以文本序列傳輸數據;
②、二進制模式:以二進制序列傳輸數據。
2、基礎配置
由於FTP的文件傳輸是銘文方式,具有一定的危險性,所以就誕生了一種更加安全的傳輸方式vsftp。
vsftp是一個基於GPL發布的FTP服務器軟件,安全性高,是RedHat linux默認的FTP服務終端軟件。也是linux服務器的首選產品。
(1)vsftp的特點
①、一般以普通用戶運行,降低進程權限,提高安全性;
②、高權限指令需要上層程序許可;
③、整合了所有FTP命令;
④、用戶chroot功能,限制用戶只能訪問自己的家目錄;
⑤、是redhat linux默認的FTP服務端軟件;
⑥、不再依賴xinetd服務;
⑦、可同時容許匿名(anonymous)與本地用戶(local)訪問,還支持虛擬用戶。
(2)vsftp鏈接類型
控制鏈接: TCP 21,用戶發送FTP命令信息
數據鏈接:TCP 20,用戶上傳,下載數據。
(3)vsftp配置文件介紹
| 配置文件 | 作用 |
| /usr/sbin/vsftpd | vsftpd的可執行文件(主程序) |
| /etc/vsftpd/vsftpd.conf | vsftpd的配置文件 |
| /etc/vsftpd/ftpusers | 禁止使用vsftpd的用戶列表文件 |
| /etc/vsftpd/user_list | 禁止或允許使用vsftpd的用戶列表文件 |
| /var/ftp | 匿名用戶主目錄 |
(4)vsftpd.conf文件常用的配置參數:
常用全局配置:
listen_address=192.168.10.10 #設置監聽的IP地址
listen=YES #是否以獨立運行的方式監聽服務
listen_port=21 #設置監聽FTP服務的端口號
write_enable=YES #是否啟用寫入權限
download_enable=YES #是否允許下載文件
max_clients=0 #限制並發客戶端連接數
max_per_ip=0 #限制同一IP地址的並發連接數
xferlog_enable=yes #是否記錄ftp傳輸過程
xferlog_file=/var/log/vsftpd.log #日志的文件和路徑
chown_username=username #是否改變上傳文件的屬主,username是屬主名稱
date_connection_timeout=120 #設置數據傳輸超時時間
ftpd_banner=welcome to ftp server #定制歡迎信息
本地用戶訪問限制:
userlist_enabled=YES #是否啟動userlist列表文件
userlist_deny=YES #是否禁用userlist中的用戶
本地用戶權限控制:
local_enable=YES #是否啟用本地系統用戶
local_umask=022 #本地用戶所上傳文件的權限掩碼
local_root=/var/ftp #設置本地用戶的FTP根目錄
chroot_local_user=YES #是否將用戶禁錮在主目錄
local_max_rate=0 #限制最大傳輸速率(字節/秒)
chroot_list_enabled=YES #配合下一個選項使用
chroot_list_file=/etc/vsftpd/chroot_list #配合使用,列表中的用戶將被禁錮在目錄中。
匿名權限控制:
anonymous_enable=YES #啟用匿名訪問
anon_umask=022 #匿名用戶上傳文件的權限掩碼
anon_root=/var/ftp #匿名用戶的FTP根目錄
anon_word_readable_only=YES #允許匿名下載
anon_upload_enale=YES #允許上傳文件
anon_mkdir_write_enable=YES #允許創建目錄
anon_mkdir_write_enable=YES #允許匿名者更多權限
anon_max_rate=0 #限制最大的傳輸速率
(5)配置擁有所有權限的匿名用戶
配置簡單的vsftpd
①、檢查目前服務器或虛擬機是否安裝vsftpd
如果安裝,可使用rpm -e vsftpd-* 或yum remove vsftpd卸載
②、安裝vsftpd
③、修改配置文件
④、啟動vsftpd以及設置為開啟自啟動
⑤、開放端口或關閉防火牆
開放端口即開放21端口:firewalld-cmd --zone=public --add-port=21/tcp --permanent
⑥、確保vsftpd已啟動
驗證ftp是否可以可以正常訪問
①、安裝ftp,並登錄
②、外部驗證
③、此時對於數據沒有讀寫權限
④、再次訪問
⑤、此時可以查看了,但依舊不能上傳文件
重啟之后,就可以上傳文件了
(6)配置本地用戶
①、系統本地的默認設置
vsftpd默認容許所有的系統用戶都可以訪問FTP,並且要進行身份驗證。但是用系統用戶身份登錄FTP服務器后,默認將位於自己的家目錄中,而不是FTP的主目錄。

創建系統用戶,並設置密碼,在家目錄中添加測試文件
[root@localhost ~]# useradd anliu01 [root@localhost ~]# useradd anliu02 [root@localhost ~]# passwd anliu01 更改用戶 anliu01 的密碼 。 新的 密碼: 無效的密碼: 密碼少於 8 個字符 重新輸入新的 密碼: passwd:所有的身份驗證令牌已經成功更新。 [root@localhost ~]# passwd anliu02 更改用戶 anliu02 的密碼 。 新的 密碼: 無效的密碼: 密碼少於 8 個字符 重新輸入新的 密碼: passwd:所有的身份驗證令牌已經成功更新。 [root@localhost ~]# echo "ftp test" >> /home/anliu01/ftptest.txtd
登錄測試
右鍵點擊登錄

登錄后查看

②、禁錮系統用戶與指定目錄中
windows客戶端也可以通過ftp命令訪問服務器,由於在命令行模式下模式采用FTP主動模式,因此此時需要將客戶端的防火牆關閉才能成功訪問

此時用戶訪問的是自己的家目錄,但此時可以使用cd命令切換到其他目錄,例如:

此時會存在較大的安全隱患,一般情況下,我們都需要將系統用戶禁錮在他的家目錄下,禁止隨意切換。修改完成后,重新啟動vsftpd。

新建測試出現以下問題:

問題原因:從2.3.5之后,vsftpd增強了安全檢查,如果用戶被限定在了其主目錄下,則該用戶的主目錄不能再具有寫權限了!如果檢查發現還有寫權限,就會報該錯誤。
問題解決:
<1>將用戶主目錄的寫權限去除。
chmod a-w /home/用戶名
結果:這樣的話,登錄會不能進行一些寫的操作。
<2> 在vsftpd.conf中新增allow_writeable_chroot=YES配置

此時發現就不可以切換工作目錄了。系統中的所有用戶都受到限制。
③、允許特殊用戶擁有目錄切換權限
write_enable=YES 用戶可以對根目錄下的文件進行改寫操作,會給系統帶來極大的安全隱患,因此必須限制用戶切換到根目錄。
chroot_list_enabled=YES #配合下一個選項使用
chroot_list_file=/etc/vsftpd/chroot_list #配合使用,列表中的用戶將被禁錮在目錄中。
chroot_local_user=YES #用於指定用戶列表文件中的用戶,是否允許切換到上級目錄。默認為NO。
幾種情況:
1)chroot_list_enabled=YES ,chroot_local_user=YES時;在/etc/vsftpd/chroot_list文件中列出的用戶,可以切換到上級目錄。沒有在文件中列出的用戶,不能切換到站點根目錄的上級目錄。
2)chroot_list_enabled=YES ,chroot_local_user=NO時;在/etc/vsftpd/chroot_list文件中列出的用戶,不能切換到站點根目錄的上級目錄。沒有在文件中列出的用戶,可以切換到上級目錄。
3)chroot_list_enabled=NO ,chroot_local_user=YES時;所有用戶均不能切換到上級目錄。
4)chroot_list_enabled=NO ,chroot_local_user=NO時;所有用戶均可以切換到上級目錄。
5)當用戶不允許切換到上級目錄時,登陸后FTP站點的根目錄“/”時該FTP賬戶的主目錄,即文件系統的/var/ftp目錄。
④、設置用戶列表
在默認的配置下,所有的系統用戶都可以訪問FTP,如何來限定只有指定的用戶來訪問呢。
vsftpd提供了兩個與系統用戶相關的文件:/etc/vsftpd/chroot_list和/etc/vsftpd/ftpusers。這兩個文件均包含一份FTP用戶名的列表,但是作用卻截然不同。
/etc/vsftpd/ftpusers:此文件中包含的用戶賬號將被禁止登錄vsftpd服務器,不論用戶是否出現在另一個文件中。
/etc/vsftpd/chroot_list:該文件中的用戶賬號是否被禁止登錄,需要看其他兩個選項的值。當userlist_enabled=YES時,/etc/vsftpd/chroot_list文件生效;當userlist_deny=YES時,則禁止用戶列表中的用戶登錄;當userlist_deny=NO時,僅容許列表中的用戶登錄。
優先級:/etc/vsftpd/ftpusers的優先級大於/etc/vsftpd/chroot_list。
⑤、配置虛擬用戶
除了虛擬用戶,系統用戶之外,還可以設置虛擬用戶來訪問FTP。所謂虛擬用戶,是指存放於獨立數據庫文件中的FTP用戶賬號,可以將它們映射到某個不能登錄的系統用戶賬號上,以進一步增強FTP服務器的安全。
1)創建虛擬用戶數據庫文件
vsftp服務的虛擬用戶數據庫默認使用Berkeley DB格式的數據庫文件,建立數據庫文件需要用到db_load命令工具,db_load工具是由db4-utils軟件包提供的,所以首先需要確認系統中已經裝好db4-utils組件。
[root@localhost ~]# yum install vsftpd -y #安裝vsftpd [root@localhost ~]# yum install epel-release libdb4-utils -y
創建一個文本文件用來使用格式化用戶名/密碼列表,用於存放虛擬用戶賬號

以文件列表為數據源通過db_load工具創建出DB格式的數據庫文件

2)創建虛擬用戶的映射賬號
vsftpd服務對虛擬用戶其實采用了映射的控制方式,把所有的虛擬用戶賬號都對應到了同一個系統用戶上,並將這個用戶的家目錄作為所有虛擬用戶登錄后公用的FTP主目錄。
例如:

3)創建PAM認證文件
虛擬用戶的認證是通過PAM機制來實現的,PAM時Linux系統中的獨立API,它提供了各種驗證模塊以供其他程序調運。當這些程序需要進行用戶身份驗證操作時,就可以直接調用相應的模塊,而無需由自己來提供驗證功能。
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd [root@localhost vsftpd]# cat /etc/pam.d/vsftpd #%PAM-1.0 #session optional pam_keyinit.so force revoke #auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #auth required pam_shells.so #auth include password-auth #account include password-auth #session required pam_loginuid.so #session include password-auth auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/logins account required /lib64/security/pam_userdb.so db=/etc/vsftpd/logins
4)修改vsftpd配置,添加虛擬用戶支持

5)創建虛擬用戶配置文件
創建兩個虛擬用戶,給兩個虛擬用戶不同的權限

6)驗證
<1>本地登錄
首先需要關閉防火牆或者開啟21端口
其次需要將/etc/selinux/config中的selinux的值修改為disabled

登錄成功!
<2>遠程登錄
實驗結果為anliu01可以進行正常的文件上傳與下載,anliu02只能下載,不能上傳。
3、FTP連接類型配置
關於FTP主被動模式的修改
windows cmd下默認為主動模式,更改為被動的模式

Linux ftp命令下默認為被動模式,切換為主動模式的方法

三、NFS共享存儲
四、SSH服務
五、syslog
六、NTP時間同步服務












