网络文件共享服务

引言:如果两台主机想实现文件共享,很简单(早期通过各自存储介质),但是如果是多台主机实现文件实时同步(即共享的文件无论在那一端发生变化,其他主机上的文件都随之改变),而且保证文件安全,文件同步效率。

1. 存储类型(存储文件的介质的不同组织方式[文件系统,数据存储时分割的方式等])

  DAS(Direct[直连]-Attached[附加] Storage[存储])     直连式存储

  SAN(Storage-Aera Network)                                   存储区域网络

  NAS(Network-Attached Storage)                             网络附加存储

2. FTP(File Transfer Protocol )文件传输协议

   FTP协议,是早期三个应用级协议之一(http,smtp),也是基于C/S架构,面向的是文件(文件传输格式默认是二进制文件),而且是双通道协议(体现的在:在服务端它工作的模式,即可作为服务端[21],也可以作为客户端[20],通过端口来区分)。

  2.1 两种模式:服务器角度

    主动模式(PORT style):服务器主动连接客户端

      当需要数据传输时,客户端通过21端口,向服务器发送指令“我这里打开了,xxxx端口,你可以直接连接”,于是服务器通过20号端口,向客户端的xxxx端口发送连接请求,这样就建立了一条数据链路来传输数据。

      过程:

        命令:客户端,随机打开xxx端口------------->服务器,21/tcp  

        数据: 客户端,随机xxxx端口<--------------服务器,20/tcp

    

    被动(PASV style):客户端主动发起连接(大多数情况下)

      当需要数据传输时,服务端通过21端口向客户端发送pasv指令,“我已打开xxxx端口,你直接连接”,然后客户端向服务端发起连接请求,随后建立数据传输链路。

       过程:

         命令: 客户端,随机端口----->服务端,21/tcp

         数据:客户端,随机端口------->服务端,随机端口

        注意:客户端在同一个会话里,如果还需传输另外一个文件,则ftp会打开一个新的数据连接(每次文件传输都需要重新打开一个数据连接);但是命令控制连接是持久连接的。

      范例:windows连接FTP服务器,默认使用主动模式。

        连接方式:ftp  ipaddress

      服务器被动模式下数据的端口:

        比如:223  entering passive mode(10.0.0.117,224 ,59)        -------------------  224*256+59

  2.2  服务器状态码

      1xx 信息              例如:125 数据链路打开

      2xx成功类信息                         200 命令执行成功;  230 登录成功

      3xx补充类信息                       331 用户名ok

      4xxx客户端错误      425  不能打开数据连接

      5xxx服务端错误      530  不能登录

  

  2.3  用户认证。ftp上面存在三种用户账户,

    匿名用户:(映射为系统ftp用户)。ftp  anonymous

    系统用户:linux系统用户

    虚拟用户:特定服务的专用用户,独立的用户/密码文件

3. 常见的FTP相关软件

  FTP服务端软件

    Wu-ftpd,Proftpd,Pureftpd,Filezilla Server,Serv-U,Wing FTP Server,IIS

    vsftpd:Very Secure FTP Daemon,CentOS 默认FTP服务器(高速稳定)

        官网: https://security.appspot.com/vsftpd.html

    Filezilla  ,服务端只能在windows上使用

        官网: https://filezilla-project.org/index.php

  客户端软件

     ftp,lftp,lftpget,wget,curl

     filezilla,FTP Rush,CuteFtp,FlashFXP,LeapFtp等

扩展:FTP于HTTP区别:

   HTTP:超文本传输协议,他是web的核心。

       HTTP定义了报文的格式,以及客户机和服务器是如何进行报文交换的(客户机是如何向web服务器请求web页面,以及服务器如何将web页面传送到客户机)

       它由两部分程序实现:一个是客户机和一个服务器程序,他们运行在不同的端系统中,通过交换HTTP报文进行会话;

        

  它们之间的相同点:

      都是应用层协议

      都运行在TCP上,使用tcp作为其支撑的运输层协议

  不同点:

    HTTP是超文本传输协议,面向的是网页;FTP是文件传输协议,面向的是文件

    HTTP协议默认端口80。FTP默认端口:21,20

    FTP服务器的控制连接是持久连接,数据连接是非持久连接;而HTTP既可以使用非持久连接,也可以使用持久连接

    FTP服务器必须在整个会话期间保留用户的状态信息;而HTTP是无状态的

    FTP的控制信息是带外传送的,而HTTP的控制信息是带内传送的:

      FTP使用两个并行的TCP连接传输我呢见,一个是控制连接(控制两个主机之间传输控制信息,指令),一个是数据连接(传输具体文件),因而FTP协议使用一个分离的控制连接,因此FTP的控制信息是带外传送的。

      HTTP协议是在传输文件的TCP连接中发起请求和响应首部行的。控制信息是带内传送的。

4. VSFTPD软件介绍

  由vsftpd包提供;用户认证配置文件:/etc/pam.d/vsftpd  (使用模块方式,后面连接数据库时会有案例介绍) 

  启动服务相关文件:

      /usr/lib/systemd/system/vsftpd.service (centos7之后版本)

      /etc/rc.d/init.d/vsftpd(centos6 之前版本)

  配置文件:/etc/vsftpd/vsftpd.conf

  配置文件格式:option=value               “=”两边不能由空格

  帮助:man 5 vsftpd.conf

  用户和其他用户共享目录:

     匿名用户(映射为系统ftp用户)共享文件位置:/var/ftp

     系统用户共享目录:当前用户的家目录

     虚拟用户共享家目录:为其映射的系统用户的家目录

  

4.2  vsftp服务常见配置

  4.2.1    命令端口,不建议修改

      默认为21,但是在主配置文件(/etc/vsftpd/vsftpd.conf)看不到默认的端口设置。如果修改端口后,后来连接都需要加上端口号。

        listen_port=#      (默认21)

  

  4.2.2    主动模式端口,不建议修改

      connect_from_port_20=YES   

      ftp_data_port=20   指定主动模式端口

  

  4.2.3     被动模式端口范围(如果范围太小会影响并发数量,即连接端客户端)。建议修改

      linux 上客户端默认使用被动模式

      windows上客户端默认使用主动模式

      pasv_min_port=6000

      pasv_max_port=6010

  

  4.2.4      使用当地时间。不建议修改(部分客户机时间本身就是对的,而有些客户机上的共享给的文件可能是UTC时间)

      use_local_time=yes    使用当地时间(默认为NO,使用GMT)

  

  4.2.5      匿名用户登录

      anonymous_enable=yes     #支持匿名用户。centos8上面默认不允许匿名用户登录

      no_anon_password=yes      #匿名用户略过口令检查,默认为NO            如果允许匿名用户登录,就无需再输密码(输入的密码不检查,可以随机输入)

  

  4.2.6      匿名用户上传  (匿名用户登录后默认目录再/var/ftp/)

      anon_upload_enable=yes    匿名用户上传文件,  是否能上传文件,需要看文件系统的权限。  默认没有开启

      anon_mkdir_write_enable=yes   匿名建目录  默认没有开启

      setfacl -m u:ftp:rwx  /var/ftp/pub      

      anon_word_reable_only=NO         只能下载全部读的文件,默认为yes。如果没有读权限下载文件时报错:(Failed to open file)

            anon_umask=0333                       指定匿名用户上传文件的umask,默认为077;注意 0333中的0不能省略 

      anon_other_write_enable=yse       可删除和修改上传的文件,默认为NO                                                        

       

              范例 :修改主配置文件(去掉注释即可),重启vsftpd服务。 (结论:作为FTP根目录不能具有写权限;但是子目录如果没有写权限,上传文件时会报错[文件系统的权限])

           

            会出现的错误:

              1. 如果给了/var/ftp写权限,匿名用户登录时会报错(refusing to run with writable root inside chroot())

              2. 如果/var/ftp/pub/目录没有写权限,匿名用户上传文件时会报错(Could not create file)

                   3.  上传后的文件默认的权限为600,如果再下载该文件时会报错(Failed to open file)

  4.2.7        指定匿名用户的上传文件的默认的所有者和权限(默认情况下匿名用户上传文件的用户是ftp)

        chown_uploads=yes                 #开启此选项,相当如下面定义的用户和组,权限才有用

        chown_username=ldl            

        chown_uoload_mode=0644   

  

  4.2.8        linux系统用户(系统用户登录后进入的是系统用户的家目录,故上传的文件也会在其用户的家目录里)

       local_enable=yes       是否允许linux用户登录。         默认允许

       write_enable=yes       允许linux用户上传文件            默认允许

       local_umask=022        指定系统用户上传文件的默认权限对应的umask         默认

  4.2.9        将所有系统用户映射为指定的guest[客人]用户

       guest_enable=yes             所有系统用户都映射为guest用户

       guest_username=ftp          配合上面选项才生效,指定guest用户

       local_root= /ftproot             指定guest用户登录所在目录,但不影响匿名用户的登录目录

       user_config_dir= /etc/vsftpd/conf.d/        每个用户独立的配置目录

         范例1:让所有系统用户映射指定的guest用户。

          [root@cnetos8117 ~]#vim /etc/vsftpd/vsftpd.conf ;systemctl restart vsftpd

            guest_enable=yes

            guest_usernmae=guest

          [root@cnetos8117 ~]#useradd guest; chmod a-w  /home/guest 

          [root@cnetos8117 ~]#cp /etc/issue /hmoe/guest

          [root@cnetos8117 ~]#测试登录(利用系统账户测试)

          

          #注意:也可以再主配置文件中加”local_root=/DIR“,这样每个系统用户登录后进入到的目录不在是映射为的用户的加目录下。但需要注意DIR不能有写权限。

      范例2:让所有系统用户映射指定的guest用户,并且每个用户登录后进入的目录不同

           [root@cnetos8117 ~]#vim   /etc/vsftpd/vsftpd.conf ;systemctl restart vsftpd

           guest_enable=yes

           guest_username=guest

              user_config_dir=/etc/vsftpd/conf.d/

          [root@cnetos8117 ~]#mkdir  /etc/vsftpd/conf.d/   /data/ftproot;chmod a-w /data/ftproot

          [root@cnetos8117 ~]#vim /etc/vsftpd/conf.d/ldl

            local_root=/data/ftproot

          测试登录(使用ldl用户和poff用户登录测试) 

  4.2.10     禁锢所有系统用户在家目录中(默认情况下,系统用户登录后可以随意切换至其他目录,更可以随意下载所有文件)

      chroot_local_user=yes       #禁锢系统用户,默认为NO(不禁锢)

      

      禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反。

        chroot_list_enable=yes             #是否启用限制用户名单,yes为启用

        chroot_list_file=/etc/vsftpd/chroot_list               #是否限制该文件下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user选项。

        注意:chroot_list_enable=yes和chroot_local_user=yes时,则chroot_list中的用户不禁锢,即实现白名单

           chroot_list_enable=NO和chroot_local_user=yes时,则chroot_list中的用户禁锢,即实现黑名单

      

      范例1:禁锢所有系统用户登录后只能处于自己的家目录下,不能切换至其他位置。

        [root@cnetos8117 ~]#vim   /etc/vsftpd/vsftpd.conf;systemctl restart vsftpd

            chroot_local_user=yes  

        [root@cnetos8117 ~]# 登录测试(使用系统用户)

     

 4.2.11    上传/下载日志(有两中日志)

    wu-ftp  日志(默认)

      xferlog_enable=yes                  #启用记录上传下载日志,默认为yes

      xferlog_std_format=yes              #使用wu-ftp日志格式,默认为yes

      xferlog_file=/var/log/xferlog             #可自动生成,默认值

  

    vsftpd日志:默认不启用

      dual_log_enable=yes                #使用vsftpd日志格式

      vsftp_log_file=/var/log/vsftpd.log          可自定生成   

4.2.12       提示信息

     登录前提示(即,ftp ipaddress[port]      回车后就提示)

       ftpd_banner="String"

       banner_file=/etc/vsftpd/ftpbanner.txrt

     目录访问时提示信息

      dirmessage_enable=yes           默认开启

      message_file=.message           信息存放在指定目录下.message

     范例1 :  在一个文件中一定一个提示信息,当用户登录时即可打印该提示信息。(登陆前提示)

        [root@cnetos8117 ~]#vim banner_file=/etc/vsftpd/ftpbanner.txt

          ^[[1;31m  welcome to here!^[[0m         (^[  是使用快捷键ctrl+v+[ ,)

        [root@cnetos8117 ~]# vim /etc/vsftpd/vsftpd.conf

           banner_file=/etc/vsftpd/ftpbanner.txt

        登录测试,查看是否有提示信息。

        

    范例2:当用户登陆后切换至某目录下时,打印提示信息(访问目录时提示)

        [root@cnetos8117 ~]#vim /etc/vsftpd/vsftpd.conf

          message_file=.message

        [root@cnetos8117 ~]#cd /var/ftp/pub ;mkdir testmessage; systemctl restart vsftpd

        [root@cnetos8117 pub]#vim testmassage/.message

          ^[[1;31m testdir ^[[0m

        登录测试,使用匿名用户(系统用户登录后是处在该系统用户的家目录下)

        

4.2.13    PAM模块实现用户访问控制

    pam_service_name=vsftpd

    pam配置文件:/etc/pam.d/vsftpd

      /etc/vsftpd/ftpusers         默认情况下,该文件中的用户拒绝登录,默认是黑名单,但也可以是白名单

    

    利用pam模块实现访问控制原理:先在/etc/pam.d/vsftpd文件,该文件调用了pam其他模块(/lib64/security/*) 并且定义了/etc/vsftpd/ftpusers 文件及文件中的效用------------>然后在主配置文件中通过pam_service_name选项调用了此处定义的vsftpd,从而实现了用户访问控制。

      但是在/etc/pam.d/vsftpd  文件中,对/etc/vsftpd/ftpusers定义的效用默认是拒绝(sense=deny)。如果修改为allow,那么/etc/vsftpd/ftpusers文件中定义的用户将都可以登录ftp,不在该文件中的用户将不能登录ftp

    

    

    注意:如果将某用户加入到/etc/vsftpd/ftpusers文件中,则该用户默认不能登录。(可以查看日志/var/log/secure 提示:pam_listfile(vsftpd:auth))

4.2.14        是否启用控制用户登录的列表文件(处在该文件中的用户,默认拒绝登录,并且不提示输入密码)

      userlist_enable=yes              默认开启

      userlist_deny=yes                 黑名单,不提示口令,NO即为白名单

      userlist_file=/etc/vsftpd/user_list 

    

    注意:系统root用户不能登录ftp服务器,是因为/etc/vsftpd/user_list文件和/etc/vsftpd/ftpusers文件中将其定义,拒绝相当于双保险(不建议使用root用户登录ftp)   

4.2.15   vsftpd服务指定用户身份运行

    nopriv_user=nobody         #此为默认值     

 4.2.16       连接数限制

      max_clients= #             最大连接并发数

           如果该连接数修改的太小,会导致有些客户端连接报错(to many connected uses)

      max_per_ip= #             每个ip同时发起的最大连接数

          如果超出连接数,会报错:(to many connections from your internet address)

4.2.17     传输速率,单位:字节/秒  

    anon_max_rate=#    匿名用户的最大传输速率,以字节为单位,比如1024000表示1MB/s    

    local_max_rate=#      本地用户的最大传输速率

4.2.18      连接时间:单位:秒

    connect_timeout=60             #主动模式数据连接超时时长

    appect_timeout=60             被动模式数据连接超时时长

    data_connection_timeout=300         数据连接无数据传输超时时长

    idle_session_timeout=60             无命令操作超时时长

  

2.4.19    以文本方式传输,不建议修改,有些场景下可能会导致二进制文件内容被破坏

    以文本方式传输文件时,会自动对文件进行格式转换,比如转换成windows的文本格式(在Linux下的换行是\n,而在Windows下的换行是\r\n)

    ascii_upload_enable=yes

    ascii_download_enable=yes 

2.5     vsftpd虚拟用户

   虚拟用户:给特定服务使用的用户账号

             所有虚拟用户会映射为一个指定的系统账号:访问共享位置(此系统账号的家目录)

      各虚拟有可被赋予不同的访问权限,通过匿名用户的权限控制参数进行

      

    虚拟用户账号存储方式:

      文件:创建文本文件,奇数行为用户名,偶数和为密码,再被编码为hash格式的database文件

         db_load -T -t hash -f vusers.txt  vusers.db           db_load工具是由libdb-utils包生成

        缺点:每次新增用户都需要重新转换文件。

      关系型数据库中的表里:实时查询数据库完成用户认证

        vsftpd支持mysql库(根据pam模块来连接数据库:pam-mysql) 

      

    范例1:基于文件验证vsftpd虚拟用户

      在linux系统上创建用户

      [root@centos7146 ~]#useradd -d  /data/ftproot  -s /sbin/nologin -r  ftpuser       

      [root@centos7146 ~]#mkdir /data/ftproot/upload ; chmod  a-w  /data/ftproot; touch  /data/ftproot/upload/ftproot.txt

       创建用户数据文件(ftpuser1,ftpuser2),文件存放位置,可以随意

      [root@centos7146 ~]#vim  /etc/vsftpd/ftpusers.txt       ;chmod   600  /etc/vsftpd/ftpusers.txt 

        ftpuser1                            

        ftpuser123

        ftpuser2

        ftpuser123

      利用账户文本文件生成数据库文件

        db_load -T -t hash -f /etc/vsftpd/ftpuserstxt     /etc/vsftpd/ftpusers.db

      在/etc/pam.d/目录下编写vsftpd.db文件,该文件实现用户和密码认证

        cat > /etc/pam.d/ftpuser1 <<EOF

          auth required pam_userdb.so db=/etc/vsftpd/ftpusers.db

          account required pam_userdb.so db=/etc/vsftpd/ftpusers.db

        EOF

      在主配置文件中找到选项pam_service_name,将其修改为自定义的模块

        vim /etc/vsftpd/vsftpd.conf

          pam_service_name=vsftpd.db

          guest_enable=yes

          guest_username=ftpuser

      重启vsftpd服务测试。

      

      缺点:/etc/vsftpd/ftpusers.txt文件中定义的用户登录后进入的目录都是系统用户ftpuser用户的家目录。

        每次新增用户,都需要重新生成/etc/vsftpd/ftpusers.db文件(即,现在文件/etc/vsftpd/ftpusers.txt中添加用户,在利用该文件重新生成ftpusers.db文件,而且/etc/vsftpd/ftpusers.txt文件的不安全,建议将其权限修改为600权限)

        用户登入后没有上传和下载文件功能,需要手动在著配置文件中开启(匿名用户下载和上传权限)

      

      解决:/etc/vsftpd/ftpusers.txt文件中定义的用户登录ftp服务器进入的目录不同 。

        在前面的案例的基础上只需要修改主配置文件,添加选项:user_ocnfig_dir=/etc/vsftpd/conf.d

        然后再创建/etc/vsftpd/conf.d目录,再该目录下定义各自用户的访问控制权限(定义文件)

          cat >  /etc/vsftpd/conf.d/ftpuser1 << EOF

            anon_upload_enable=yes

            anon_mkdir_write_enable=yes

            anon_other_write_enable =yes

      

    范例2:实现基于mysql验证的vsftpd虚拟用户

      实现原理:利用pam-mysql模块实现基于mysql的FTP虚拟用户功能

        pam-mysql模块:目前只支持centos6,7.    centos8上使用时会报错。

          网站:http://pam-mysql.sourceforge.net/

             https://sourceforge.net/projects/pam-mysql/                          

    

    本案例搭建的模型如下:

         centos8(10.0.0.110)主机上

      [root@mysql110 ~]#yum install mariadb-server; systemctl enable --now mariadb                 #安装并启动数据库

      [root@mysql110 ~]#mysql

        mysql> create database vsftp                              #创建数据库vsftp

        mysql>\u vsftp                                #切换数据至数据库中

        mysql>   CREATE TABLE users (                                  #创建users表,结构如下。binary:二进制

          id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
          name CHAR(50) BINARY NOT NULL,
          password CHAR(41) BINARY NOT NULL
          );

        mysql> insert into users (name,password) values('ftpuser1',password('123456'));                  #创建用户ftpuser1和ftpuser2   密码使用了password函数

        mysql> insert into users (name,password) values('ftpuser1',password('1234567'));

        mysql> create user ftpuser@‘%’ identified by '123456'  ;                       #创建连接数据库的用户ftpuser

        mysql> grant select on vsftp.* to  ftpuser@‘%’ ;                                   #授予ftpuser查询权限

  

         centos7(10.0.0.147 主机上)

      [root@ftpserver147 ~]#useradd -s /sbin/nologin -d /data/ftproot -r ftpuser              #创建ftpuser用户用于映射数据库中的ftpuser1和ftpuser2虚拟用户

      [root@ftpserver147 ~]#mkdir  -pv /data/ftproot/upload ;chmod  a-w /data/ftpload; touch /data/ftproot/ftproot.txt      #创建文件,但作为根的目录不能有写权限;并创建一个文件用于登录测试

      

      编译安装pam-mysql模块

      [root@ftpserver147 ~]#yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel

      [root@ftpserver147 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz

        [root@ftpserver147 ~]#tar xf pam_mysql-0.7RC1.tar.gz; cd pam_mysql-0.7RC1

        [root@ftpserver147 ~]#./configure   --with-pam-mods-dir=/lib64/security  ;make install                                  #将编译的模块放在lib64目录下

        [root@ftpserver147 ~]#ll /lib64/security/pam_mysql*                                                        #如果编译成功会生成如下两个文件   

          -rwxr-xr-x 1 root root 882 Mar 11 15:02 /lib64/security/pam_mysql.la
          -rwxr-xr-x 1 root root 141712 Mar 11 15:02 /lib64/security/pam_mysql.so

      

      建议pam认证所需要的文件

      [root@ftpserver147 ~]#cat > /etc/pam.d/vsftpd.mysql <<EOF          

        auth required pam_mysql.so user=ftpuser passwd=123456 host=10.0.0.110 db=vsftp table=users usercolumn=name passwdcolumn=password crypt=2
        account required pam_mysql.so user=ftpuser passwd=123456 host=10.0.0.110 db=vsftp table=users usercolumn=name passwdcolumn=password crypt=2

        EOF

          

        CRYPT: 加密方式

          0 表示不加密

          1表示crypt(3)加密

          2表示使用mysql password()函数加密

          3表示md5加密

          4表示sha1加密

        其他配置端说明:

          auth  表示认证

          account  验证账户密码正常使用

          required  表示认证要通过

          pam_mysql.so 模块,是默认的相对路径,相对于/lib63/security

          user   表示登录mysql的用户

          passwd   登录mysql的密码

          host   MySQL server服务器主机(可以式主机名也可以是ip地址)

          db  指连接mysql数据库的数据库名称

          table   表名

          usercolumn   当作用户的字段

          passwdcolumn    当作密码的字段

          

      再主配置文件中引用该模块

      [root@ftpserver147 ~]#vim  /etc/vsftpd/vsftpd.conf

        pam_service_name=vsftp.mysql                   #必须注释原有的

        guest_enable=yes                            #允许虚拟用户登录

        guest_username=ftpuser                 #虚拟用户登录后切换至某身份

      [root@ftpserver147 ~]#systemctl restart vsftpd

    

    测试(centos8  10.0.0.112)

      [root@112client ~]#yum install -y ftp

      [root@112client ~]#ftp 10.0.0.147

       

     

      当然案例中缺陷:映射后的每个虚拟用户登录ftp后进入的都是同一个目录:

       案例3:在ftp服务器上配置虚拟用户具有不同的访问权限:(在案例2的基础上,增加修改。)

        #在主配置文件中添加一行user_config_dir选项

        [root@ftpserver147 ~]#vim  /etc/vsftpd/vsftpd.conf

          user_config_dir=/etc/vsftpd/conf.d

        [root@ftpserver147 ~]#mkdir /etc/vsftpd/conf.d;mkdir  /data/ftproot2 && chmod  a-w /data/ftproot2 ;touch /data/ftproot/ftproot2.txt                    

        [root@ftpserver147 ~]# vim  /etc/vsftpd/conf.dftpuser2                    为虚拟用户创建独立的控制文件        

            anon_upload_enable=yes
            anon_mkdir_write_enable=yes
            anon_other_write_enable=yes
            local_root=/data/ftproot2   

                       

       [root@112client ~]#ftp  10.0.0.147    测试

       

5  .NFS(network file system) 服务

  nfs:网络文件系统,基于内核的文件系统。基于RPC(Remote Procdure Call远程过程调用)实现

  prc:采用C/S模式,客户机请求程序调用进程发起一个有进程参数的调用信息到服务进程,但后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接受答复信息,获得进程结果,然后调用进程继续运行继续运行

  NFS 工作原理:

      

    nfs服务打开的端口众多,且不固定。服务端打开时必须先将自己端口及ip提交至注册中心,而且该注册中心,必须一直处于等待状态(可中断睡眠态);客户但连接NFS时,先通过内核调用(网络客户端)去连接NFS服务端的注册中心,注册中心将其响应返回;客户机获取到ip和port后,根据ip后port向对应的NFS服务器发起处理请求。

  5.1  NFS软件介绍

      软件包:nfs-uilts(包括服务端和客户端相关工具),最小化安装没有此工具

      相关软件包:rpcbind(必须) ,tcp_wrappers(是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受TCP_Wrappers的安全控制)

      kernel支持:nfs.ko

      NFS服务主要进程:

        rpc.nfsd   最主要的NFS进程,管理客户端是否可以登录

        rpc.mountd  挂在和写在NFS文件系统,包括权限

        rpc.lockd   非必要,管理文件锁,避免同时写出错

        rpc.statd  非必要,检查文件一致性,可修复文件

      主:cnetos6 开始portmap进程由rpcbind代替

      日志:/var/lib/nfs

      NFS配置文件:

        /etc/exports

        /etc/exports.d/*.exports

      

      NFS共享配置文件格式

        /dir       主机1(opt1,opt2)   主机2(opt1,opt2)....

        格式说明:

           以#开始的行为注释

           主机格式:

              anonmous: 表示使用*通配所有客户端

              单个主机:ipv,ipv6,FQDN

              IP NETWORKS:两中掩码格式都支持

                例如:10.0.0.110/255.255.0.0 

                    10.0.0.110/16

              wildcards: 主机名通配,例如:*.ldl.com

              netgroups: NIS域的主机组,,@group_name

         每个条目指定目录导出到的纳休主机,及相关的权限和选项

         默认选项:(ro,sync,root_squash[挤压,降级],no_all_squash)

           ro,rw  只读和读写

           async,异步,数据变化后不立即写磁盘,先写入缓冲区中,过段时间再写入磁盘,性能高,安全低

           sync(默认), 同步,数据再请求时立即写入共享磁盘,性能低,安全高

              root_squash   远程root映射为nfsnobody,uid为65534,centos8 为nodoby,centos7以前版本为nfsnobody

           no_root_squash(默认)  保留共享文件的UID和GID

           anonuid和anongid   指明匿名用户映射为特定用户的UID和组GID ,而非nobody,可配合all_squash使用

         

        范例:NFS配置示例          

          vim /etc/exports
          /myshare server.example.com
          /myshare *.example.com
          /myshare server?.example.com
          /myshare server[0-20].example.com
          /myshare 172.25.11.10
          /myshare 172.25.0.0/16
          /myshare 2000:472:18:b51:c32:a21
          /myshare diskless.example.com(rw,no_root_squash)

  5.2  NFS工具

    5.2.1   rpcinfo(查看rpc相关信息)

      查看注册在指定主机的RPC程序:

          rpcinfo -p hostname  

      查看PRC注册程序

          rpcinfo  -s hostname

    

    5.2.2   exportfs  (可用于管理NFS到处的文件系统)

      常见选项:

        -v   查看本机所有NFS共享

        -r    重读配置文件,并共享目录

        -a    输出本机所有共享

        -au    临时停止本机所有共享

    5.2.3   showmount  (查询NFS服务器的相关信息)

      常见选项:

        -e,--exports  hostname | ip    显示NFS服务器的输出清单

          例如showmount  -e  10.0.0.8

    5.2.4     mount.nfs  (客户端NFS挂载)

        NFS相关的挂载选项:man 5 nfs

          fg  前台挂载

          bg   后台挂载

          hard   持续请求

          soft    非持续请求

          intr  和hard配合,请求可中断

          rsize   和wsize  一次读和写数据最大字节数,rsize=32768

          _netdev  无网络服务不挂在。一般使用在/etc/fatab文件中,代替default选项,这样不至于机器重启起不来

          vers   指定版本

        提示:基于安全考虑,建议使用nosuid,_netdev,noexec挂载选项

          范例1:挂载临时NFS共享

            mount   -o rw,nosuid,fg,hard,intr 10.0.0.1:/testdir   /mnt

          范例2:开机挂载临时NFS共享

            vim  /etc/fstab

              10.0.0.1:/tesrtdir     /mnt/nfs      nfs   defaults,_netdev  0   0

  5.3      自动挂载

    可使用autofs服务按需要挂载外围设备

    5.3.1   相关软件包

      软件包:autofs  

      服务文件:/usr/lib/systemd/system/autofs.service

      配置文件:/etc/auto.master

    

    5.3.2   配置文件格式

      查看帮助:man  5 autofs

      所有导出到网络中的NFS启用特殊匹配-host至”borwse“

      范例:  /etc目录 可以自动挂载NFS共享

        cat   /etc/auto.master 

          /net   -hosts

          cd   /net/10.0.0.110/

      自动挂载资源有两种格式:

        相对路径法:将mount point路径分为dirname 和basename 分别配置,可能会影响现有的目录结构

        绝对路径法:直接匹配全部的绝对路径名称,都写入到指定的配置文件里,不会影响本地目录结构

     

 

      相对路径法:

        /etc/auto.master  格式

           挂载点的dirname    指定目录的配置文件路径(如/etc/test.auto)

        指定目录的配置文件格式

           挂载点的basename    挂载选项      选项设备

    

       范例1:  

         #vim   /etcauto.master

            /misc          /etc/auto.misc

         # vim /etc/auto.misc

            cd    -fstype=iso9660,ro,nosuid,nodev  :/dev/cdrom

      

        范例2:

           vim  /etc/auto.master

              /misc   /etc/auto.misc

           vim    /etc/auto.misc 

              *    server:/export/&                  #表示/misc下面的子目录和nfs共享/esport目录的子目录同名 

          

       绝对路径法:

          /etc/auto.master格式

            /-                   指定配置文件路径

         

          指定配置文件格式

            挂载点完整的绝对路径                        挂载选项              选项设备

      

        范例:绝对路径法

          vim   /etc/auto.master

            /-                  /etc/auto.direct

          vim     /etc/auto.direct 

            /foo              -fstype=nfs  server1:/export/foo

            /user/local       -fstype=nfs,vers=3   server1:/usr/local

            /mnt/cdrom       -fstype=iso9660   :/dev/cdrom

6.   SAMBA服务

    SAMBA服务实际是SMB,因为早期smb三个字母被其他上商业组织注册了,故设计人在SMB前后各加了一个A,SMB(server massage block),服务器消息块,是最早的DOS网络文件共享协议。

    与前面的nfs服务相比samba服务相对较安全些:前面nfs服务的验证是基于ip,而SAMBA服务却是用的虚拟用户(它有自己的账户文件,而且samba用户必须是linux系统用户,建议使用/sbin/nologin,而且samba用户登录后进入的是当前用户的家目录,故创建用户时不要使用-r选项[不会创建家目录]),而且造出是设计是为了实现windows和unix文件共享的。  与nfs相同点,SAMBA服务同样也支持挂载,而且samba是采用的cifs文件系统。(nfs支持挂载,采用的是nfs文件系统)。

  

    

    官网:http://www.samba.org/

    SMABA的功能:

      共享和打印,实现在线编辑

      实现登录SAMBA用户身份认证

      可以进行Netbios名称解析

      外围设备共享

  6.1   SAMBA软件介绍

    相关包:smaba,提供smb服务器端

      samba-client客户端软件

      samba-common  通用软件

      cifs-utils   smb客户端工具

      samba-winbind   和AD相关

    

    相关服务进程:

      sambd 提供smb(cifs)服务TCP:139,445

      nmbd Netbios 名称解析UDP:137,138

    主配置文件:/etc/samba/smb.conf

      帮助参考: man smb.conf

    语法检查:testparm [-v]  [/etc/samba/smb.conf]

    客户端工具:smbclient,mount.cifs

    服务器状态检测:smbstatus命令

    

    SAMBA客户端连接SAMBA格式

      UNC路径:Universal Naming Convention,通用命名规范,格式如下

        \\sambaserver\sharename

    

    使用smbclient访问SAMBA服务器,需要安装    samba-client包

      smbclinet -L HOSTNAME | IPADDRESS    #无需端口

      smbclient -L HOSTNMAE  -U     smb用户%password               #U指定用户 %指定密码

        范例:

          

    

    挂载cifs文件系统

      手动挂载:

        范例:mount  -o  user=ldl,password=ldl123   //server/shared  /mnt /smb

      开机自动挂载:(需要安装cifs-utils包),否则会报错

        cat  /etc/fstab

          //server/homes           /mnt/       cifs   credentials或cred=/etc/smb.txt   0  0

        cat  /etc/smb.txt

          username=ldl

          password=ldl123

        chmod  600 /etc/smb.txt

  6.2    管理SAMBA用户

    实现samba用户说明:

      包:samba-common-tools

      工具:smbpasswd pdbedit

      用户数据库:/var/lib/samba/private/passdb.tdb

      注意:samba用户必须是linux用户,建议使用/sbin/nologin

  

    管理用户命令:

      添加samba用户:

        smbpasswd -a  <user>

        pdbedit  -a   -u <user>

       修改用户密码:

        smbpasswd <user>

       删除用户和密码:

        smbpasswd  -x  <user>

        pdbedit -x -u <user>

        

      查看samba用户列表

        pdbedit  -L  -v

      

        范例:创建samba用户 

          [root@7148 ~]#useradd   -s  /sbin/nologin  -d /data/smb1   smb1

          [root@7148 ~]#smbpasswd -a smb1

          [root@7148 ~]#pdbedit  -L  [-v]    #显示所有账户信息

  6.3   SAMBA服务器配置

      samba配置文件/etc/samba/smb.conf,该配置文件使用ini文件的格式。

     帮助:man  smb.conf

     使用[]  分成以下几部分

        全局设置:

          [global]   服务器通用或全局设置的部分

        特定共享设置

          [homes]    用户的家目录共享

          [printers]    定义打印机资源和服务

          [sharename]    自定义的共享目录配置

          

          注意:其中:#和;开头的语句为注释,大小写不敏感

        samba配置中的宏定义

          %m   客户端主机的Netbios名

          %M   主机客户端的FQDN

          %H   当前用户的家目录路径

          %U   当前用户的用户名

          %g     当前用户所属组

          %h     samba服务器的主机名

          %L    samba服务器的netbios名

          %I    客户端的ip

          %T    当前日期和时间

          %S    可登录的用户名

  6.4    samba服务器的全局配置

     workgroup   指定工作组名称

     server string 主机注释信息

     netbios  name  指定netbios  名   可以被samba客户端使用,需要启动nmb服务。但不支持ping

        范例:

            [global]

              workgroup  =  workgroup

              netbios  name = smbserver  

     interfaces  指定服务监听接口和ip  

     hosts  allow  可以使用逗号,空格,或tab分割。默认允许所有主机访问,也可以在每个共享独立设置

         范例:

            hosts  allow  = 10.0.   .ldl.com

     hosts  deny  拒绝指定主机访问,格式和hosts  allow 相同

     config file =/etc/samba/conf.d/%U    用户独立的配置文件

     Log file  =/var/log/samba/log.%I    不同客户机采用不同的日志

     log  level=2    日志级别   默认为0   不记录日志

        范例:

          [global]

            log   file =/var/log/samba/log%I

            log level =2

     max  log  size =50  日志文件达到50k,将轮循rotate,单位KB

     security三种认证方式:

        user :samba用户(采用linux用户,samba的独立口令)

        share  :匿名(centos7不在支持),不建议使用

        server:不建议使用

      passdb  backend =tbbsam   密码数据库格式

  6.5  每个共享目录应该由独立的[] 部分

      [共享名称]              远程网路看到的共享名称

      comment                注释信息

      path                        所共享的目录路径

      public                     能否被guest访问的共享,默认为no。(相当于不用输入密码)

      browsable               是否允许所有用户浏览此共享,默认为yes,no为隐藏

      writable=yes            可以被所有用户读写,默认为no

      read  only                用户,@组名,+组名   之间也会逗号分隔 ;如wirtable=no  列表也会或组可读写

      valid   users           特定也会才能访问该共享,如为空,将允许所有用户,用户名之间用空格分割

         范例:基于特定的用户和组的共享

            vim  /etc/samba/smb.conf

              [share]

                path= /data/dir

                valid users=ldl,@admins

                writeable =no

                browseable =no

      范例1:在linux上创建共享,在wondows上访问共享:

          [root@7148 ~]#useradd   -s /sbin/nologin    smb1;  mkdir /data/share;touch /data/share/a.txt;

          [root@7148 ~]#smbpasswd -a smb1  ;pdbedit  -L  

          [root@7148 ~]#vim  /etc/samba/smb.conf

            [share]

              path=/data/share

         

          1.  在windows上访问:\\10.0.0.148   账户smb1/123  

          

          windows第一次连接后会记住密码(不便于测试),解绝办法就是在windows上打开cmd目录窗口.

           c:\users\ldl>    net use             #查看windows所有连接 ,$表示windows里时隐藏的

           

          

           c:\users\ldl>  net use  远程  /del     (删除远程连接记录,需要等一分钟)

           

           

          小技巧:如果发现windows主机共享的目录被大量访问,影响到本机。查看谁在访问

            c:\users\ldl>    netstat -nt   #查看所有的连接

            c:\users\ldl>    findstr   工具相当于grep

            c:\users\ldl>   ping   -a  ip   可以查看ip对应的主机名

            

             

          2.  在linux上访问

             [root@localhost ~]#  smbclient -L 10.0.0.148                 #检测同网络的共享 (需要安装samba-client包)

              

            [root@localhost ~]# smbclient   //10.0.0.148/share   -Usmb1%123456 

              

             

    范例2:利用samba实现指定目录共享

    server端:创建用户,并配置共享目录

      [root@7148 ~]#useradd -s /sbin/mologin   smb2;mkdir /data/{share,test} ;touch /data/share/a.txt

      [root@7148 ~]#smbpasswd -a  smb2;pdbedit  -L  HOST |  IP

      [root@7148 ~]#vim /etc/samba/smb.conf

        [share]

        path=/data/test

        comment=welcome

    client端:检测共享(需要使用smbclient软件[安装samba-client包]),在本地创建上文件夹并挂载对应的共享

      [root@localhost ~]#smbclient -L 10.0.0.148

      [root@localhost ~]# mount -o username=smbuser //10.0.0.148/share  /mnt

    范例3:   实现不同的samba用户访问相同的samba共享,实现不同的配置

       server端修改配置:

        [root@7148 ~]#useradd  -s /sbin/nologin smb1 smb2  smb3(要分别创建)

        [root@7148 ~]# smbpasswd -a  smb1 smb2 smb3

        [root@7148 ~]#  vim  /etc/samba/smb.conf

            config file=/etc/samba/conf.d                   #在全局配置端的workgroup下添加该行

            [share]

            path=/data/dir

            read only =no

            guest ok =yes

        针对smb1和smb2用户创建单独的配置文件

        [root@7148 ~]#  vim /etc/samba/conf.d/smb1

          [share]

            path=/data/dir1

            read only=yes

            create umask 0644

        [root@7148 ~]#  vim /etc/samba/conf.d/smb2

          [share]

            path=/data/dir2

          

        [root@7148 ~]#mkdir /data/{dir1,dir2}; touch /data/dir1/dir1.txt

        

      client端:

        [root@localhost ~]#smbclient  //10.0.0.148/share -Usmb1%123

          

7  数据的实时同步

  在生产环境中,有时需要两台主机的特定目录显示实时同步,比如,将NFS共享目录的数据文件,自动实时同步到备份服务器上的特定目录中

  实时同步的方法:

    inotify + resync方式实现数据同步

    sersync 在inotify的基础上进行开发的。

  工作原理:

    要利用监控服务(inotify),监测同步数据服务器目录中的信息变化

    发现目录中的数据变化,就利用rsync服务推送到备份服务器上

  inontify:

    异步的文件系统事件监控机制,利用事件驱动机制,而无需通过诸如cron等轮询机子和来获取事件

    linux内核从2.6.13起支持inotify,通过1innotify可以监控文件系统中添加,删除,修改,移动等各事件

  实现软件:

    inotify-tools

    sersync

    lrsyncd

   实现inontify

    查看内核是否支持inotify方法:

      ls -l /proc/sys/fs/inotify

        

     inontify内核参数说明:

      max_queued_events  : inotify事件队列最大长度,如果太小会出现Event Queue Overflow 错误,默认值:16384, 生产

          环境建议调大,比如:327679

      max_user_instrances:    每个用户创建inotify实例最大值,默认为128

      max_user_watches:   可以监控的文件的总数量(inontify单进程),默认为8192,建议调大

  

        范例:内核参数设置

          [root@7148 ~]#vim  /etc/sysctl.conf 

            fs.inotify.max_queued_events=66666

            fs.inotify.max_user_watches=100000

          [root@7148 ~]#systtl  -p  (立即生效,即让内核重读配至文件) 

  7.1  inotify-tol工具

    inotify-tool参看文档:https://github.com/rvoicilas/inotify-tools/wiki

    安装inotify-tools,基于epel源

    

    inotify-tools包主要工具

      inotifywait  在被监控的文件或目录上等待特定文件吸引事件发生(open,close,delete),常用于实时同步的目录监控

      inotifywatch   收集被监控的文件系统使用的统计数据,指定文件系统事件发生的次数统计

    

    inotifywait命令:

      格式:inotifywait    [options]  files

      常用选项:

        -m,--monitor   始终保持事件监听

        -d,--daemon    一守护进程方式执行,和-m相似,配合-o使用

        -r,--recursive   递归监控目录数据信息变化

        -q,--quite   输出少量事件信息

        --exclude <pattern>   指定排除文件或目录,使用扩展的正则表达式的模式实现

        --excludei <pattern>  与上面选项相似,只是不区分大小写

        -o,--outfile <file>  打印事件到文件中,相当于标准正确输出,但是必须使用绝对路径

        -s,--syslogoutput   发送错误到syslog相当于标准错误输出

        --timefmt  <fmt>  指定事件输出格式

        --format <fmt>   指定输出格式,即时间监控输出内容

        -e   指定监听的事件,如果省略,表示所有事件都进行监听

    

        inotifywait的--timefmt时间格式(帮助man 3 strftime)

          %Y  年份信息,包含世纪信息

          %y   年份信息,不包含世纪信息

          %m  显示月份,范围01-12

          %d   每月的第几天,范围是01-31

          %H 小时信息,使用24小时制,范围0-23

          %M  分钟,范围00-59

          %S  秒,范围0-60

        

        范例:

          --timefmt  ”%Y-%m-%d  %H:%M:%S“

      inotifywait的--format格式定义

        %T  输出时间格式定义的时间格式信息,通过--timefmt option语法格式指定时间信息

        %w  事件出现时,监控文件或目录的名称信息,i相当于dirname  

        %f   事件出现时,将显示监控目录下触发的文件或目录信息,否则为空,i相当于basename

        %e   显示发生的事件信息,不同的事件默认使用逗号分隔

        %Xe  显示发生的事件信息,不同的事件指定用X进行分隔

          范例:  

            --fotmat  ”%T %w%f event: %;e“

            --format '%T %w %f'

      notifywaite -e 选项之地你的事件类型:      

          create #文件或目录创建
          delete #文件或目录被删除
          modify #文件或目录内容被写入
          attrib #文件或目录属性改变
          close_write #文件或目录关闭,在写入模式打开之后关闭的
          close_nowrite #文件或目录关闭,在只读模式打开之后关闭的
          close #文件或目录关闭,不管读或是写模式
          open #文件或目录被打开
          lsdir #浏览目录内容
          moved_to #文件或目录被移动到监控的目录中
          moved_from #文件或目录从监控的目录中被移动
          move #文件或目录不管移动到或是移出监控目录都触发事件
          access #文件或目录内容被读取
          delete_self #文件或目录被删除,目录本身被删除
          unmount #取消挂载

        

        范例:

            -e create,delete,moved_to,close_write,attrib

      范例:使用inotifywait

        监控一次性事件         

          inotifywait /data/www
          Setting up watches.
          Watches established.
          /data/www/ CREATE f1.txt

        

        #持续前台监控
          inotifywait -mrq /data/www  --exclude=".*\.swx|\.swp"
          /data/www/ OPEN f1.txt
          /data/www/ ACCESS f1.txt
          /data/www/ CLOSE_NOWRITE,CLOSE f1.txt

        #持续后台监控,并记录日志
          inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --
          format "%T %w%f event: %e"

        #持续前台监控特定事件
          inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event:
          %;e" -e create,delete,moved_to,close_write,attrib

          

  7.2    rsync 

      rsync 常用于作为linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或则与其他SSH,rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,撇和inotify或sersync,可以实现触发式的实时同步。

      官方网站: http://rsync.samba.org/

      软件包:rsync ,rysnc-daemon(cnetos 8)

      服务文件/usr/lib/systemd/system/rsyncd.service

      配置文件:/etc/rsync.conf

      端口:873/tcp

    

    rsync格式:   

        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

  

    rysnc有三种工作方式

      本地文件系统上实现同步,命令语法格式为rsync [OPTION...] SRC... [DEST]

      本地主机使用远程shell和远程主机通信,命令语法格式为上述的Access via remote shell:段的格式

      本地主机通过网络套接字连接远程主机上的rsync daemon  命令语法格式为上述的Access via rsync daemon:

      

      前两者的本质是通过本地或远程shell,而第三种方式则是让远程主机上允许rsyncd服务,使器监听在一个端口上,等待客户端的连接

      

     常用选项:        

        -v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
        -P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
          
        -n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
        -a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
        -r --recursive:递归到目录中去。
        -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,
        导致下次更新
              :检查出mtime不同从而导致增量传输无效。
        -o --owner:保持owner属性(属主)。

        -g --group:保持group属性(属组)。
        -p --perms:保持perms属性(权限,不包括特殊权限)。
        -D    :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
        -l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象
        -z    :传输时进行压缩提高效率
        -R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,
            包括它们的属性。用法见下文示例。
        --size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
        -u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会
            影响删除行为。
        -d --dirs  :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1
          目录,使用该选项将拷贝dir1但不拷贝file1。
        --max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--
        max-size=1.5m")
        --min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
        --exclude  :指定排除规则来排除不需要传输的文件。
        --delete  :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行
        的,所以它是在
             :exclude/include规则生效之后才执行的。
        -b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
        --backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
        -e     :指定所要使用的远程shell程序,默认为ssh。
        --port   :连接daemon时使用的端口号,默认为873端口。
        --password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程
        shell认证的密码,而是rsync模块认证的密码。
        -W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增
        量传输更高效。
        --existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如
          果上层目录不存在也不会传输。
        --ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文
          示例。
        --remove-source-files:要求删除源端已经成功传输的文件

    范例1:利用sshkey验证和cron计划任务是西安数据自动同步:

      

           目的:将10.0.0.148主机上的/data/testdir/目录下的内容自动同步到10.0.0.144主机上

         实现步骤:

          cnetos7  10.0.0.148 上

            打开服务rysncd服务,监听与tcp/873 端口

          [root@7148 ~]#yum -q install -y rsync;systemctl enable --now rsyncd

          [root@7148 ~]#mkdir /data/testdir;touch /data/testdir/a.txt

        

          cnetos7  10.0.0.144 上

          [root@7148 ~]#yum -q install -y rsync 

          [root@7148 ~]#  ssh-keygen;ssh-copy-id 10.0.0.148      #基于key验证(在本即上生成key,然后在推送到目标主机上)    

          [root@7148 ~]#crontab -e    

             * * * * *  /usr/bin/rsync  10.0.0.148:/data/testdir   /data/backup

          [root@7148 ~]# watch -n 0.5  ls  -l /data/backup                   #每个0.5秒动态刷新

          

   

    范例2:两张格式访问rysnc服务(cnetos8 上叫rsync daemon)

          

       实现步骤       

          在备份数据服务器上:

            [root@backup150 ~]# yum install -y rsync(centos 8 上叫rsync daemon)  ;systemctl enable --now  rsyncd;  ss -tnl  #检查/tcp/873端口是否打开            

            [root@backup150 ~]# vi /etc/rsyncd.conf                   #编辑文件,定义备份数据服务器上用于接受数据的文件夹

              [backup]

                path=/data/backup/

                read only=no

            [root@backup150 ~]# mkdir /data/backup   chmod  a+w /data/backup

      

          

            

          

        将自己主机上(data)的文件数据推送到备份服务器上(backup)

           [root@data149 ~]# rsync /etc/networks root@10.0.0.150::backup  或  rsync /etc/issue rsync://root@10.0.0.150/backup

          

        也可以将备份服务器上的文件拉取到数据服务器上:

          [root@data149 ~]# rsync rsync://root@10.0.0.150/backup/* /mnt   或  rsync root@10.0.0.150::backup/* /opt

            

             

        

        范例3:  以独立服务方式运行rsync并实现验证功能

              在范例2的基础上稍加修改。

         

        实现步骤:            

      在备份数据服务器上:

            [root@backup150 ~]# yum install -y rsync(centos 8 上叫rsync daemon)  ;systemctl enable --now  rsyncd;  ss -tnl  #检查/tcp/873端口是否打开            

            [root@backup150 ~]# vi /etc/rsyncd.conf                   #编辑文件,定义备份数据服务器上用于接受数据的文件夹              

              uid = root
              gid = root
              max connections = 0
              ignore errors
              pid file = /var/run/rsyncd.pid
              log file = /var/rsync/rsyncd.log
              lock file = /var/run/rsyncd.lock
              exclude = lost+found/
              timeout = 900
              reverse lookup =no

              [backup]
                path=/data/backup
                read only =no
                auth users=rsyncuser
                secrets file=/etc/rsync.pas

            [root@backup150 ~]# echo "rsyncuser:123"  > /etc/rsync.pas                          #创建用户和密码

            [root@backup150 ~]#chmod 600  /etc/rsync.pas     

            [root@backup150 ~]# mkdir /data/backup   chmod  a+w /data/backup

        

    在数据服务器上(10.0.0.149)

          [root@data149 ~]# yum -y install rsync;

        查看远程rsync服务器的模块信息

          [root@data149 ~]# rsync  rsync://10.0.0.150  或   rsync 10.0.0.150::                   

        

        交互式查看具体模块内的文件

          [root@data149 ~]# rsync  rsync://rsyncuser@10.0.0.150/backup    或  rsync  rsyncuser@10.0.0.150::backup                

            

            

        非交互式查看具体模块内的文件:但是需要在客户端建立对应的账户密码文件。

          [root@data149 ~]#echo  ”123“ > /etc/rsync.pas;chmod  600 /etc/rsync.pas

          [root@data149 ~]#rsync --password-file=/etc/rsync.pas rsyncuser@10.0.0.150::backup   或 

               rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.150/backup   

            

        

      实时同步数据,即将数据服务器上的数据同步到备份服务器上

        [root@data149 ~]# rsync -avz --delete --password-file=/etc/rsync.pas /data/test/ rsyncuser@10.0.0.150::backup

            或rsync -avz --delete --password-file=/etc/rsync.pas /data/test/  rsync://rsyncuser@10.0.0.150/backup

          

         实时同步数据,也可以将备份服务器上/data/backup/的数据拉取到数据服务器上的某个位置

           [root@data149 ~]# rsync -avz --delete --password-file=/etc/rsync.pas rsyncuser@10.0.0.150::backup  /opt 

  

      范例4:脚本+rsync+shell脚本实现实时数据同步  

[root@data149 ~]#cat  inotify_rsync.sh    

#!/bin/bash
#inotify rsync shell脚本方式实现主备数据同步,此脚本需要现在备份服务器上设置,用于接受数据的文件夹(/data/backup),以及密码文件/etc/rsync.pas
#此脚本在数据服务器上运行
SRC='/data/test/' #本主机上的数据目录
username="rsyncuser"
passwd="123"
passwd_file=/etc/rsync.pas #存在在本机的密码文件,用于验证
DEST_IP='10.0.0.150' #备份服务器的IP
DEST="${username}@${DEST_IP}::backup"
LOGFILE='/var/log/changelist.log' #产生的日志记录
#检测rsync程序是否安装
rpm -ql rsync &>/dev/null || yum install -y -q rsync

#创建密码文件
[ -a ${passwd_file} ] || echo "${passwd}" > ${passwd_file}

#开启监控inotify,其中选项-r[递归],-m[持续监控],-q[简要信息], %T不上少,不然不能显示timefmt定义的时间
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %s' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=${passwd_file} ${SRC} ${DEST} && echo "AT ${TIME} on ${DATE},file ${FILEPATH} was backuped up via rsync" >> ${LOGFILE}
done

[root@backup150 ~]# cat rsync_backup.sh 

!/bin/bash
#此脚本在备份服务器上运行

cat > /etc/rsyncd.conf<<EOF
uid = root
gid = root
max connections = 0
ignore errors
pid file = /var/run/rsyncd.pid
log file = /var/rsync/rsyncd.log
lock file = /var/run/rsyncd.lock
exclude = lost+found/
timeout = 900
reverse lookup =no

[backup]
path=/data/backup
read only =no
auth users=rsyncuser
secrets file=/etc/rsync.pas
EOF
rpm -ql rsync &>/dev/null || yum install rsync
mkdir -pv /data/backup
chmod a+w /data/backup
echo "rsyncuser:123" > /etc/rsync.pas
systemctl enable --now rsyncd && echo "配置完成,rsyncd启动成功"

8     sersync实现实时数据同步

  ersync类似于inotify,都是用于监控,但是它客服了inotify的缺点

  inotify最大的不足时产生重复的事件,或者在一个目录下多个文件的操作会产生多个事件,例如:当监控目录种有5个文件时,删除目录会产生6个或6个以上的监控事件,从而导致重复调用rsync命令。另外比如,vim文件时,inotify会监控到临时文件的事件,但这些事件相对于rsync来说是不应该被监控的。

  sersync优点:

    使用c++编写,相对于linux系统文件产生的临时文件和重复的文件操作进行过滤,所以结合rsync同步的时候,节省了运行时损耗的网络资源。因此更快。

    sersync配置很简单,其中提供了静态编译好的二进制文件和xml配置文件,直接可以使用

    sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态

    sersync又出错处理机制,通过失败队列出错的文件重新同步,如果仍旧失败,则安设定时长对失败的文件重新同步

    sersync不仅可以实现实时同步,另外还自带crontab功能,只需在xml文件中开启,即也可以按要求隔一段事件整体同步一次,而无需额外配置crontab功能

    

    sersync下载地址: https://code.google.com/archive/p/sersync/downloads

   

    案例1:基于rsync(cnetos8:rsync daemon) 实现sersync。

    

        先备份服务器上安装rsync,并配置用于同步数据的文件夹。

        [root@backup7152 ~]#yum install -y rsync  

        [root@backup7152 ~]#cat >/etc/rsyncd.conf           

uid = root
gid = root
max connections = 0
ignore errors
pid file = /var/run/rsyncd.pid
log file = /var/rsync/rsyncd.log
lock file = /var/run/rsyncd.lock
exclude = lost+found/
timeout = 900
reverse lookup =no

[backup]
path=/data/backup1
read only =no
auth users=rsyncuser
secrets file=/etc/rsync.pas

      [root@backup7152 ~]#mkdir -pv /data/backup1; chmod a+w /data/backup1;touch /data/backup1/a.txt

      [root@backup7152 ~]#echo "rsyncuser:123" >/etc/rsync.pas;chmod 600 /etc/rsync.pas

      数据服务器,安装sersync程序(需要下载)用于监控/data/testdir 目录下的某些文件的变化,一旦发生变化自带同部数据到/data/backup(10.0.0.152) ,并且记录事件于日志中

         [root@data7151 ~]#yum install -y  rsync 

        [root@data7151 ~]#wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz   

        [root@data7151 ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz;

          

          

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
 <host hostip="localhost" port="8008"></host>
 <debug start="false"/> # 是否开启调试模式
 <fileSystem xfs="false"/>
 <filter start="false"> #不开启文件过滤功能,当为true时,以下类型的文件将不同

<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
 </filter>
 <inotify> # 监控事件,默认监控
delete/close_write/moved_from/moved_to/create folder
<delete start="true"/>

<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>  #修改此行为true,文件属性变化后也会同步
<modify start="false"/>
 </inotify>
 <sersync>  # rsync命令的配置段
<localpath watch="/data/www"> #修改此行,需要同步的源目录或文件,建议同步
目录
 <remote ip="备份服务器IP" name="backup"/>  #修改此行,指定备份服务器地址和rsync
daemon的模块名,如果下面开启了ssh start,此时name为远程shell方式运行时的目标目录
 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
 <commonParams params="-artuz"/>  # 指定rsync选项
 <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/> #修
改此行为true,指定备份服务器的rsync配置的用户和密码文件
 <userDefinedPort start="false" port="874"/><!-- port=874 -->#指定rsync的
非标准端口号
 <timeout start="false" time="100"/><!-- timeout=100 -->
 <ssh start="false"/> #默认使用rsync daemon运行rsync命令,true为使用远程shell模

</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every
60mins execute once-->          #错误重传及日志文件路径
<crontab start="false" schedule="600"><!--600mins--> #不开启crontab功能
 <crontabfilter start="false">  #不开启crontab定时传输的筛选功能
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
 </crontabfilter>
</crontab>
<plugin start="false" name="command"/>
 </sersync>

#####################################以下行不需要修改
####################################
 <plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix
/opt/tongbu/mmm.sh suffix-->
<filter start="false">
 <include expression="(.*)\.php"/>
 <include expression="(.*)\.sh"/>
</filter>
 </plugin>
 <plugin name="socket">
<localpath watch="/opt/tongbu">
 <deshost ip="192.168.138.20" port="8009"/>
</localpath>
 </plugin>
 <plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
 <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx"
passwd="xxxx"/>
 <sendurl base="http://pic.xoyo.com/cms"/>

<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-
9]*).xoyo.com/images"/>
</localpath>
 </plugin>
</head>

       [root@data7151 ~]#echo 123 > /etc/rsync.pas;chmod 600 /etc/rsync.pas

       [root@data7151 ~]#  rsync 10.0.0.152::               用于测试

       [root@data7151 ~]#sersync2 -dro /usr/local/sersync/confxml.xml                  然后查看数据是否同步。

  也可以基于上面案例基础上,修改为基于远程ssh实现sersync。

    备份服务器上的配置与上面案例一致。

    数据服务器:

         [root@data7151 ~]#yum install -y  rsync 

        [root@data7151 ~]#wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz   

        [root@data7151 ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz;

         [root@data7151 ~]#cp -a   GNU-Linux-x86 /usr/local/sersync

         [root@data7151 ~]#echo 'PATH=/usr/local/sersync:$PATH' >/etc/profile.d/ersync.sh   ; source  /etc/profile.d/ersync.sh

         [root@data7151 ~]#vim /usr/local/sersync/conf.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
 <host hostip="localhost" port="8008"></host>
 <debug start="false"/>
 <fileSystem xfs="false"/>
 <filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
 </filter>
 <inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>  #修改此行为true
<modify start="false"/>
 </inotify>
 <sersync>
<localpath watch="/data/www"> #修改此行,指定源数据目录
 <remote ip="备份服务器IP" name="/data/backup"/> #修改此行指定备份服务器地址和备
份目标目录
 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
 <commonParams params="-artuz"/>
 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> #必须修
改此行,不启用认证
 <userDefinedPort start="false" port="874"/><!-- port=874 -->
 <timeout start="false" time="100"/><!-- timeout=100 -->
 <ssh start="true"/> #修改此行为true,使用远程shell方式的rsync连接方式,无需在目
标主机上配置启动rsync daemon服务

#####################################以下行不需要修改
####################################
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every
60mins execute once-->
<crontab start="false" schedule="600"><!--600mins-->
 <crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
 </crontabfilter>
</crontab>
<plugin start="false" name="command"/>
 </sersync>
#将中间的行可以删除
</head>

         #不需要配置rsync daemon,只需要配置基于key验证的ssh即可
          [root@data-centos8 ~]#ssh-keygen
          [root@data-centos8 ~]#ssh-copy-id backup-server

           [root@data7151 ~]#echo 123 > /etc/rsync.pas;chmod 600 /etc/rsync.pas

            [root@data7151 ~]#  rsync 10.0.0.152::               用于测试

           [root@data7151 ~]#sersync2 -dro /usr/local/sersync/confxml.xml                  然后查看数据是否同步(如果备份服务器指定的目录下没有,就检查下配置文件,或查看用户加目录下是否存在)。

  ++++++++++++++++++++++++++++++++++++一天不学习,好难受!++++++++++++++++++++++++++++++++++++++++++++++++++++++++

          

 

  

        

       

  

        

 

          

       

            

          

 

      

 

           

 

       

          

           

        

      

        

  

  

     

          

   

    

  

    

                       

      

      

      

    

        

    

    

    

        

        

        

          

          

 

        

      

          

        

      

            

      

    

      

     

  

              

    

      

    

        

         

      

      

   

        

            

          

      

              

             

            

    

    

         

      

      

       

      

   

一如IT深似海,从此妹子是路人; 只要学不死,就往死里学;
原文地址:https://www.cnblogs.com/ldlx/p/14514524.html