FTP服务

ftp协议

文件传输协议

  • 协议定义了一个远程计算机系统和本地计算机系统之间传输文件的一个标准
  • FTP运载OSI七层模型的应用层,并利用传输协议TCP在不同主机之间提供可靠的数据传输
  • FTP在文件传输中还支持断点续传功能,可以大幅的减少CPU网络带宽的开销

ftp模型

  • 用户接口: 提供了一个用户接口并使用用户端协议解释器的服务
  • 客户端协议解释器:向远程主机发送命令,并建立客户端数据传输过程
  • 服务端协议解释器:响应客户端协议发出的命令并驱动服务器的数据传输
  • 客户端数据传输协议:负责完成和服务端数据传输过程及客户端本地文件系统的通信
  • 服务端数据传输协议:负责完成和客户端数据传输过程及服务端本地文件系统的通信
  • 连接方式:不同的连接方式需要合适的服务质量
    • 命令连接: 建立连接及命令发送和响应(需要更小的延迟时间) 21端口
    • 数据连接: 用于数据传输(需要更大的数据吞吐量) 20端口

命令连接

  • 主要用来传输实际通信中需要执行的FTP命令以及命令响应
  • 只需要很小的网络带宽
  • FTP服务器监听在21端口来等待控制连接建立
  • 建立控制连接之后,还需要验证客户端身份,决定是否建立数据连接
  • 当需要目录列表,传输文件时,才建立数据连接,并且每次客户端都会使用不同的随机端口来建立数据连接;当数据传输完毕之后,就断开数据连接
  • 在FTP连接期间,控制连接始终保持连接状态,在数据连接存在的期间,控制连接必须存在,一旦控制连接断开,数据连接会自动断开

数据连接

  • FTP服务端监听在20端口上等待数据连接
  • 数据连接依赖于控制连接

主动模式

  1. 三次握手建立命令连接,客户端的端口是随机的,目标端口是21
  2. 控制连接建立完成之后,客户端进行验证,协商数据连接采用的模式(主动模式)
    随后客户端会向FTP服务端发送Port报文(端口为命令连接使用的端口向后的第一个可用端口),表明自己的IP地址及端口号信息;等待FTP服务端20端口主动地发起数据连接请求
  3. 服务端发送数据连接请求,连接建立之后开始进行数据传输

被动模式

  1. 三次握手建立控制连接,客户端的端口是随机的,目标端口是21
  2. 控制连接建立完成之后,客户端进行验证,协商数据连接采用的模式(被动模式)
    客户端向服务端发送PASV报文,表示我们用被动模式
  3. 服务端在收到PASV报文,向客户端发送Port报文,表明自己的IP地址及端口号信息;
  4. 客户端发送数据连接请求,建立数据连接
  • 关键点: 主动和被动在于服务端是主动建立数据连接还是被动建立数据连接

Vsftpd服务

  • 是一个安全,高速,稳定的FTP服务器
  • 可设定多个基于IP的虚拟FTP服务器
  • 匿名FTP服务器更是十分容易的
  • 不执行任何外部程序,从而减少了安全隐患
  • 支持虚拟用户,且支持每个虚拟用户具有独立的配置
  • 支持带宽限制等等
  • 注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此两者的交集

FTP服务的使用者

  • vsftpd以ftp用户的身份运行进程,默认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp
  • 匿名用户
    • anonymous用户并没有设置密码进行登录ftp服务端
    • 一般情况下匿名用户只能够拥有下载查看功能
  • 本地用户
    • 既可以登录shell也可以登录ftp服务端
    • 本地用户登录系统后,其登录目录为本地家目录
    • 一般情况下拥有上传和下载功能
  • 虚拟用户
    • 如果用户在远程FTP服务端上拥有账号,但是不能登录shell
    • 虚拟用户登录系统后,其登录为指定目录
    • 一般情况下拥有上传和下载功能

安装

[root@test ~]# dnf install vsftpd -y

  • 服务包:vsftpd

  • 服务类型: 是由systemd启动的守护进程

  • 配置单元:/usr/lib/systemd/system/vsftpd.service

  • 守护进程: /usr/sbin/vsftpd

  • 端口: 21(controller) 20 (data)

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

  • 用户访问控制配置文件:

    • /etc/vsftpd/ftpusers

    • /etc/vsftpd/user_list

  • 日志文件:/etc/logrotate.d/vsftpd

  • URL:

    • SCHEME://username:password@HOST:PORT/PATH/TO/FILE

    • 路径映射:

      • 用户家目录:每个用户的URL的/映射到当前用户的家目录

主配置文件:
默认配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@test ~]# cat /etc/vsftpd/vsftpd.conf | grep -Ev "^$|^#"
anonymous_enable=YES # 匿名用户是否开启
local_enable=YES # 是否允许本地用户可以登录
write_enable=YES # 是否对登录用户可写
local_umask=022 # 本地用户上传文件默认权限的umask值
dirmessage_enable=YES # 是否激活目录欢迎信息功能
xferlog_enable=YES # 是否让系统自动维护上传和下载的日志工作
connect_from_port_20=YES # 是否设置FTP服务器端将启用FTP数据端口的连接请求
xferlog_std_format=YES # 以xferlog日志格式写入到日志文件中
listen=NO # 是否监听
listen_ipv6=YES # 是否支持IPv6
pam_service_name=vsftpd # PAM模式提供的认证服务
userlist_enable=YES # 是否允许ftpusers文件中的用户登录ftp服务器
tcp_wrappers=YES # 是否使用tcp_wrappers作为主机访问控制访问

实例1:匿名用户

  1. 关闭防火墙和SELINUX

  2. 配置参数:

    1
    2
    3
    4
    5
    6
    7
    # 匿名用户相关配置参数:
    anonymous_enable=YES
    anon_umask=022
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    anon_root = /path/to/file # 指定匿名用户登录系统后的目录所在位置 ;默认情况下是:/var/ftp/
  3. 修改指定目录的属主
    [root@test pub]# chown -Rf ftp /var/ftp/pub/

  4. 使用anonymous用户登录测试
    ftp://x.x.x.x 用户名: anonymous 密码:

实例2: 本地用户

  1. 关闭防火墙和SELINUX

  2. 配置参数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 本地用户相关配置参数:
    local_enable=YES
    pam_service_name=vsftpd
    # 控制可登录vsftpd服务的用户列表
    userlist_enable=YES
    # YES意味着此为黑名单,NO意味着此为白名单
    userlist_deny=YES|NO

    # 禁锢所有本地用户与家目录;需要事先去除用户对家目录的写权限
    chroot_local_user=YES

    # 禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限
    chroot_list_enable=YES
    chroot_list_file=/etc/vstpd/chroot_list
  3. 检查/etc/pam.d/vsftpd文件中

    列在此文件中的所有用户,均被禁止使用ftp服务

    1
    auth  required	pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed	# 参数必须要有
  4. 检查user_list和ftpuser文件

    1
    2
    3
    4
    5
    6
    [root@test ~]# cat /etc/vsftpd/ftpusers 
    # Users that are not allowed to login via ftp # “黑名单”
    # root
    [root@test ~]# cat /etc/vsftpd/user_list
    # If userlist_deny=YES (default), never allow users in this file, and # 默认情况是“黑名单”
    # root
  5. 重启vsftpd服务并使用本地用户root进行登录测试

实例3:虚拟用户

  1. 关闭防火墙和SELINUX

  2. 创建用于FTP认证的用户数据文件

    1
    2
    3
    4
    5
    6
    7
    mkdir /etc/vsftpd/vconf  
    cat > /etc/vsftpd/vconf/vftpuser.txt <<EOF
    xiaohong # 用户名1
    xiaohong # 密码
    xiaoming # 用户名2
    xiaoming # 密码
    EOF
  3. 将明文信息转成数据文件
    db_load ‐T ‐t hash ‐f /etc/vsftpd/vconf/vftpuser.txt /etc/vsftpd/vconf/vftpuser.db

  4. 创建vsftpd服务应用程序用于存储文件的根目录已经虚拟用户映射的系统本地用户
    useradd -d /var/ftproot -s /sbin/nologin virtual
    chmod -Rf 755 /var/ftproot/

  5. 建立用户支持虚拟用户的PAM文件

    1
    2
    3
    1. [root@test pam.d]# cat /etc/pam.d/vsftpd
    auth required pam_userdb.so db=/etc/vsftpd/vconf/vftpuser
    account required pam_userdb.so db=/etc/vsftpd/vconf/vftpuser
  6. 配置参数:

    1
    2
    3
    4
    5
    # 虚拟用户相关配置参数:
    guest_enable=YES
    guest_username=virtual
    allow_writeable_chroot=YES
    user_config_dir=/etc/vsftpd/vconf/
  7. 为不同虚拟用户设置不同的权限

    1
    2
    3
    4
    5
    6
    [root@test vconf]# cat /etc/vsftpd/vconf/zhangsan 
    local_root=/var/ftproot/
    write_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
  8. 重启vsftpd服务并登陆测试

lftp命令详解

登录ftp

代码:
lftp 用户名:密码@ftp地址:传送端口(默认21)
用法
(1)lftp username:password@127.0.0.1:21
(2)lftp username@127.0.0.1 回车 ##默认21端口 回车后输入密码
(3)lftp 127.0.0.1 回车 ##回车后 login 登录
(4)lftp 回车 –> open 127.0.0.1 –> login 登录

lftp中文乱码问题

登录后看到的都是中文乱码(因为一般本地都是utf-8的编码),用 set 命令来解决

set ftp:charset gbk(或者 gb2312 或 utf-8) ##设置ftp端的编码格式
set file:charset utf-8 (...同上) ##设置本地编码格式

附:set命令的技巧 (1)输入set 查看已经设置好的命令 (2)set -a 查看所有可以设置的命令清晰网

查找ftp端文件

1
2
3
4
ls *.txt ##查找当前目录下的所有txt文件
ls ./123/ ##列出123目录下所有文件
find . -name "*.txt" ##递归查找站点上所有的txt文件
find ./xx -name "*.txt" ##查找xx目录下所有的txt文件

附1: ls第二次读取的是本地缓存,可以用 rels 代替 ls 或者catch off / catch on 来开关catch,catch flush清空本地catch
附2: 浏览本地目录的命令可用 !ls , 如 !ls /usr/local/bin/

下载文件

下载文件之前要先设置好本地的目录,用来存放下载的文件
lcd /home/123/web ##设置本地存放目录 默认为 /home/usr

1
2
3
4
5
6
7
8
9
10
11
12
get 123.txt   ##下载123.txt文件到 /home/123/web 中
get -c 123.txt ##断点续传下载
mget *.txt ##批量下载所有txt文件
mget -c *.txt ##断点续传
mget -c ./123/aaa/*.txt ##断点续传、批量[下载](http://apps.hi.baidu.com/w_empty/blog/item/:void(0);/.1212516110553*/)ftp端aaa目录下的所有txt文件

pget -c -n 10 file.dat
\##以最多10个线程以允许断点续传的方式下载file.dat
\##可以通过设置 set pget:default-n 5 的值而使用默认值。

mirror aaa/
\##将aaa目录整个的下载下来,子目录也会自动复制 本地自动建立目录

上传文件

1
2
3
put 123.txt   ##同下载
mput *.txt ##同下载
mirror -R aaa/ ##同下载

设置被动/非被动模式

1
set ftp:passive-mode 1 ## 1 被动 0非主动

多任务处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ctrl+z ##将当前进行的任务移交后台处理
wait ##将后台处理任[务调](http://apps.hi.baidu.com/w_empty/blog/item/:void(0);/.1212516124164*/)至前台查看
jobs ##查看后台进行的任务列表
kill all 或者 job_no ##删除所有任务 或 指定的任务

\##将任务加入任务列表
queue get 123.txt
queue put 234.txt
queue mirror aaa/

queue ##查看任务列表
jobs ##查看后台任务列表

queue start ##开始任务列表
queue stop ##停止任务列表

其他命令

定义别名

alias less more
alias reconnect “close; cd .”
直接输入 alias 即可看到目前定义了那些别名。如果只输入 alias name 的话, 则是取消 name 这个别名。

bookmark SUBCMD
设定书签, 可将目前站台及所在目录设成书签, 下次可直接进来, 不用再 cd 来 cd 去的

bookmark add name 用来新增名称为 name 的书签
bookmark del name 删除名称为 name 的书签
bookmark list 显示目前有设定那些书签(另外直接打 bookmark 和 bookmark list 的结果一样)
bookmark edit 呼叫编辑器修改书签 (~/.lftp/bookmarks)

cd 切换远端目录

cache SUBCMD
管理 lftp 的 cache

rels []
从 cache 中显示远端档案列表
rels 则不会从 cache 中读取

recls opts [path/]pattern
从 cache 中显示远端的档案列表, 应该算是 ls 的加强版, 有很多参数可用,应该是可用来产生各种不同>的档案列表以供其他程式使用。
recls 则不会从 cache 中读取

du options
计算远端整个目录占用容量

get OPTS -o
抓取远端档案 清晰网

get rfile -o lfile
抓 rfile 到本地改名为 lfile
-c 为续传
-E 抓档完成后, 将远端的档案砍了
-a 为 ascii mode, 预设为 binary mode
-O 设定 base directory 为本地端放档案的目录

mget OPTS
下载远端档案(可用 wildcard expansion 也就是 *)

pget OPTS -o
使用多个连结来下载档案, 预设为五个。
-n 3 为叁个连结

jobs -v
显示目前有那些程序在背景执行
-v 显示详细的资讯(-v 可多加几个来显示更详细的资讯)

lcd
切换本地端的目录

mirror OPTS remote [local]
下载整个目录(楼上的 get 只能用来抓档案)
-c 续传
-e 这个要小心一些, 比较远端和本地端的档案, 假如远端没有的, 就将本地端的档案删除, 也就是将本地端和远端资料同步。
-R 上传整个目录
-n 只下载较新的档案
-r 不用递回到目录中
–parallel=n 同时下载 n 个档案(预设一次只下载一个)清晰网

module name args
载入模组

put OPTS -o
上传档案

mput OPTS
上传档案(可用 wildcard expansion 也就是 *)

mv
将远端的 file1 改名为 file2

mrm
用 wildcard expansion 方式来删除远端档案

open OPTS
开启某个站台
open -u , -p site

queue OPTS []
将 cmd 放到伫列中等待执行
-d index 将编号为 index 的 job 删除
-m index new_index 将编号为 index 的 job 移至编号 new_index, 插队专用。
-n index 在编号 index 之前新增一个 job

wait []
将背景执行中的程序移至前景(也可用 fg)

kill all|
删除全部的 jobs 或 job_no

repeat delay command
每隔 delay 秒, 重覆执行 command, 预设是每隔一秒

rm -r -f
移除远端档案

mkdir -p
建立远端目录

rmdir -f
移除远端目录

set OPT []
设定变数
直接键入 set 可看目前定义了那些变数

source
读取 file, 并执行 file 中的命令(应该是和 bash 中的 source 命令是一样的吧)

debug [|off] -o
设定 debug level 为 level
-o 将输出导向至 file

exit [|bg]
结束 lftp
此时若还有 jobs, 则会将 lftp 放至背景执行, 继续未完成的工作

history -w file-r file-c|-l cnt
和 bash 中的 history 功能一样

renlist []
只显示远端的档名

pwd -p
显示目前远端所在目录
-p 连登入密码也显示

scache []
只打 scache 显示目前所有的 session, 加上 session_no 可切换至其他的 session,
对於同时开启多个站台或同个站台不同目录间切换。

国内的大多数ftp服务器使用的中文编码是gbk,而linxu大多数版本(包括debian,redhat,centOS,fc等版本)默认的编码是utf-8,于是会出现访问ftp服务器是出现中文乱码的问题,解决办法有两种:
1、临时解决
用lftp登录到ftp服务器上,设置远程服务器编码为gbk,而设置本地编码为utf-8,做法为:输入下面两个命令:
set ftp:charset gbk
set file:charset utf8

2、永久解决
在目录$HOME/.lftp编辑文件(如果没有则建立)rc,输入下面两行,设置远程编码为gbk,本地编码为utf-8:
set ftp:charset gbk
set file:charset utf8
这种方法会导致访问utf8编码的服务器时出现中文乱码,不过就目前国内环境来说机会比较少。如果出现乱码时则临时输入下面两行就可以了:
set ftp:charset utf8
set file:charset utf8

另外一个用的很多的图形界面的ftp客户端是gftp,在选项中可以选择编码,用惯了win下客户端的人应该能够很快的早到编码选择的地方,选择服务器端的编码为gbk就可以了。

Samba服务

Samba服务程序现在已经成为在Linux系统与Windows系统之间共享文件的最佳选择

SMB协议

高层协议

  • 提供网络上不同主机之间共享文件
  • 为Window客户程序和服务提供了一个通过虚拟链路,按照请求-响应方式进行通信的机制
  • SMB工作原理是让NetBIOS与SMB协议运行在TCP/IP上,从而让Linux系统在网络邻居中可见

CIFS协议

  • 通用网际文件系统是微软服务器消息块协议(SMB)的增强版
  • 提供计算机用户在企业内部网和因特网上共享文件的标准方法
  • CIFS在TCP/IP运行,利用英特网上的全球域名服务系统(DNS)增强其可扩展性

CIFS协议特点

  • 文件访问的完整性
  • 为慢连接优化
  • 为文件或目录的访问提供安全性
  • 使用同一编码(Unicode)文件名
  • 使用全局文件名

Samba服务简介

  • 应用程序,使Linux支持SMB/CIFS协议
  • 可以运行在所有Unix平台上
  • Samba应用程序更新较快并是基于GPL协议发行的

Samba功能

  • Linux系统和Window系统实现资源共享
  • 让Linux系统使用Window系统共享的文件和打印机
  • 提供用户认证功能
  • 支持SSL安全套阶层协议
  • 让Linux主机单位Window域控制和Window域成员服务器
  • 让Linux主机担任Wins名字服务器,提供NetBIOS名字解析器

Samba提供服务

  • 文件和打印机共享
  • 用户认证和授权
  • 名字解析
  • 浏览(服务通信)

Samba的守护进程

  • Smbd:实现共享和验证授权服务
  • Nmbd:实现名字解析和浏览服务

Samba的软件包

  • samba-common : 包括Samba服务器和客户端所需要的文件
  • samba: Samba服务端软件
  • samba-winbind: 可选的Window服务
  • samba-client: 客户端软件
  • samba-swat: Web配置工具

Samba服务概览

  • 安装: [root@test ~]# yum install samba -y

  • 服务包: samba

  • 服务类型: 由Systemd启动的守护进程

  • 守护进程:

    • /usr/sbin/nmbd
    • /usr/sbin/smbd
  • 监听的端口:

    • NetBIOS: udp 137 138 tcp 139
    • SMB基于TCP之上: tcp 445
  • 配置文件: /etc/samba/*

  • 相关软件包: samba‐swat, samba‐client , testparm,cifs‐utils

Samba相关工具

  • 服务端工具
    • /usr/bin/smbpasswd : 用户设置Samba用户账号和口令
    • /usr/bin/testparm: 用于检测配置文件的正确性
    • /usr/bin/smbstatus: 用于查看网络中的Samba服务器状态
  • 客户端工具:
    • /usr/bin/findsmb: 用于查找网络中的Samba服务器
    • /usr/bin/smbclient: Linux下的samba客户端
    • /usr/bin/smbget: 基于SMB/CIFS协议的类似于wget工具
    • /usr/bin/smbtar: 类似于tar工具

Samba相关配置

  • /etc/sysconfig/samba : 用于设置守护进程的启动参数
  • /etc/samba/smb.conf : 主配置文件
  • /etc/samba/smbusers : 用于映射Linux用户和Window用户
  • /etc/samba/lmhosts : 用作与设置NetBIOS名字与IP地址的对应关系
  • /etc/pam.d/samba : 用于Samba服务的PAM相关配置

Samba安全等级

  • User:由本地Samba服务器负责账户验证
  • 使用smbpasswd 设置账号(默认的安全等级)

Samba账户及口令数据库

  • 账户/口令的工作机制和系统本省分离开来
  • 当设置User安全等级之后,账户验证将有Samba服务器本地进行
  • 用.tdb 格式的口令数据库,初始情况下口令数据库文件并不存在
  • 在创建Samba用户时可以创建口令数据库文件
  • 管理员可以使用smbpasswd命令配置smaba账户及口令

默认配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@test ~]# cat /etc/samba/smb.conf | grep -Ev "^$|^#"
[global] # 全局参数
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
netbios name = MYSERVER # 解析ip
log_level= 2 # 设置日志级别
host_deny/allow
config file xxx # 每个用户有独立的配置文件
# 打印机启动参数
load printers = yes
cups options = raw
[homes] # 共享参数
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
[printers] # 共享打印机参数
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$] # 扩展参数
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775

Samba服务权限

  • 所以在使用Samba服务共享资源的时候涉及到本地文件系统权限和Samba本身权限
    • 本地文件系统权限管理:chown chmod selinux (x)
    • Samba本身权限: 配置文件中使用相关参数去控制

Samba服务部署

更多信息可以参考https://www.cnblogs.com/kevingrace/p/8662088.html

第1步:创建用于访问共享资源的账户信息

1
2
3
4
5
6
7
8
9
10
11
[root@node1 ~]# useradd wangwu && pdbedit -a -u wangwu
pdbedit命令:
-a :建立Samba用户
-x 用户名:删除Samba用户
-L:列出用户列表
-Lv:列出用户详细信息的列表
-u:指定用户
# 或者使用smbpassed
-a: 建立用户
不加:更改密码
-x:删除用户

第2步:创建用于共享资源的文件目录
[root@node1 ~]# mkdir /home/database
[root@node1 ~]# chown -Rf wangwu:wangwu /home/database

第3步:修改主配置文件

1
2
3
4
5
6
7
8
9
10
每个共享目录应该有独立的[ ]部分
[共享名称]远程网络看到的共享名称
comment注释信息
path所共享的目录路径
public能否被guest访问的共享,默认no,和guest ok类似
browsable是否允许所有用户浏览此共享默认为yes,no为隐藏
writable=yes可以被所有用户读写,默认为no
read only=no和writable=yes等价,如与以上设置冲突,放在后面的设置生效,默认只读
write list 用户,@组名,+组名,用,分隔,如writable=no, 列表中用户或组可读写,不在列表中用户只读
valid users特定用户才能访问该共享,如为空,将允许所有用户,用户名之间用空格分隔,@组名,+组名,用,分隔

添加如下配置:

1
2
3
4
5
[database]
comment = this is my test
path = /home/database
public = no
writable = yes

第4步:正确性检查

[root@node1 ~]# testparm --show-all-paraments
[root@node1 ~]# systemctl restart smb
[root@node1 ~]# netstat -lunt | egrep '137|138|139|445'

第5步:测试

  • Window挂载共享

    在Window运行输入地址:\\\192.168.10.10
    用户名:wangwu
    密码:wangwu
  • Linux挂载共享
    Samba提供了一个类似FTP客户程序的Samba客户程序smbclient
    使用方法:smbclient //NetBIOS名或IP地址/共享名 -U 用户名
    [root@node1 ~]# yum install samba-client -y
    [root@node1 ~]# smbclient -L //192.168.10.10/database -U kinmfer #检查Samba资源
    smbstatus命令:列出Samba的资源使用情况

  • 或者使用挂载命令

    • 手动挂载

      mount -o username=xxx password=xxx //smbshare/server /mnt/xxx

    • 开机自动挂载

      此方法需要安装cifs-utils包

      1
      2
      3
      4
      5
      6
      7
      echo '//172.16.1.31/share /mnt cifs credentials或cred=/etc/smb.txt 0 0' >> /etc.fstab

      cat /etc/smb.txt
      username=xxx
      password=xxx

      chmod 600 /etc/smb.txt

NFS服务

  • 网络文件系统,英文Network File System(NFS)。是由SUN公司研制的UNIX表示层协议(pressentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

  • 它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,也就是说客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。

  • 它基于开放网络运算远程过程调用(ONC RPC)协议:一个开放、标准的RFC协议,任何人或组织都可以依据标准实现它。

  • 远程过程调用Remote Procedure Call,缩写为 RPC,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。

  • NFS服务端、RPC协议、客户端三者可以理解为房源、中介、租客之间的关系:

    • 首先服务器端启动RPC服务,并开启111端口
    • 服务器端启动NFS服务,并向RPC注册端口信息
    • 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
    • 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
    • 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

    image-20200502192135749

    7355130-62a8b707e67943ba

NFS服务搭建

安装

  • 服务端

    [root@nfs01 ~]# dnf install rpcbind nfs-utils -y

  • 客户端

    [root@web01 ~]# dnf install nfs-utils -y

启动服务

注意:先启动rpc服务,在启动nfs服务

1
2
3
4
5
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl enable rpcbind
[root@nfs01 ~]# systemctl start nfs-server.service
[root@nfs01 ~]# systemctl enable nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.

没有注册时候:

1
2
3
4
5
6
7
8
[root@nfs01 ~]# rpcinfo -p 172.16.1.31
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper

nfs服务注册之后信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@nfs01 ~]# rpcinfo -p 172.16.1.31
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 53997 status
100024 1 tcp 49863 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd

配置

服务端

创建目录并授权

1
2
[root@nfs01 ~]# mkdir -p /data/web01
[root@nfs01 ~]# chown -R nobody.nobody /data

配置文件说明:

格式: 共享目录的路径 允许访问的NFS客户端(共享权限参数)

如上,共享目录为/public , 允许访问的客户端为192.168.245.0/24网络用户,权限为只读。

请注意,NFS客户端地址与权限之间没有空格。

NFS输出保护需要用到kerberos加密(none,sys,krb5,krb5i,krb5p),格式sec=XXX

none:以匿名身份访问,如果要允许写操作,要映射到nfsnobody用户,同时布尔值开关要打开,setsebool nfsd_anon_write 1

sys:文件的访问是基于标准的文件访问,如果没有指定,默认就是sys, 信任任何发送过来用户名

krb5:客户端必须提供标识,客户端的表示也必须是krb5,基于域环境的认证

krb5i:在krb5的基础上做了加密的操作,对用户的密码做了加密,但是传输的数据没有加密

krb5p:所有的数据都加密

配置文件的参数

参数 作用
ro 只读
rw 读写
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户
no_all_squash 不要将普通用户身份进行转换
sync 请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回,优点:数据安全不会丢,缺点:性能比不启用该参数要差
async 写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源)
anonuid 参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好
anongid 指定gid的值

企业互联网公司如何配置NFS 各种squash参数

  • no_all_squash 需要进行配置 共享目录权限为www(可以自己定义)(确保客户端用户 服务端用户 uid数值一致,需要在/etc/exports中定义anonuid)
  • root_squash 需要进行配置

如何让root用户可以操作管理www用户管理的data目录
root — root_squash — www —操作— data目录
anonuid=65534,anongid=65534 — 可以指定映射的用户信息

当然,保证网站存储服务器用户数据安全性,默认配置文件中已经定义了以上配置:

1
2
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
/data 192.168.242.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

企业中如何编辑nfs配置文件

  1. 通用方法 *****
    /data 172.16.1.0/24(rw,sync)
  2. 特殊情况 (让部分人员不能操作存储目录 可以看目录中的数据)
    /data 10.0.0.0/24(ro,sync)
  3. 修改默认的匿名用户
    /data 10.0.0.0/24(ro,sync,anonuid=xxx,anongid=xxx)

配置完成后,使用exportfs实用程序有选择地导出目录,而无需重新启动NFS服务

exportfs命令

1
2
3
[root@nfs01 ~]# exportfs -rv
exporting 172.16.1.0/24:/data
exporting 192.168.242.0/24:/data
参数 作用
-a 全部挂载或者全部卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享目录

客户端

挂载

启动:

1
2
3
[root@web01 mnt]# systemctl start nfs-server.service 
[root@web01 mnt]# systemctl enable nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.

输入命令:mount -t nfs 172.16.1.31:/data /mnt

检查:

1
2
3
4
5
6
7
8
9
10
[root@web01 mnt]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 383M 0 383M 0% /dev
tmpfs 399M 0 399M 0% /dev/shm
tmpfs 399M 11M 388M 3% /run
tmpfs 399M 0 399M 0% /sys/fs/cgroup
/dev/mapper/cl-root 3.5G 1.6G 1.9G 46% /
/dev/sda1 976M 190M 720M 21% /boot
tmpfs 80M 0 80M 0% /run/user/0
172.16.1.31:/data 3.5G 1.7G 1.9G 47% /mnt

如何实现自动挂载:

  1. 利用rc.local
    echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local

  2. 利用fstab文件

    1
    2
    vim /etc/fstab
    172.16.1.31:/data /mnt nfs defaults 0 0

    说明:有很多资料建议写入到/etc/fstab,os启动时一般会先加载文件系统后启动网络,在没有网络时nfs是无法加载的,总是出错, 虽然有类似所以还是建议放到/etc/rc.local中

如果在/mnt下新建目录挂载,如上所述,需要将客户端的xxx用户id修改为和服务端一致,否则会出现Permission denied

卸载

umount -lf /mnt 强制卸载挂载点

  • -l 不退出挂载点目录进行卸载
  • -f 强制进行卸载操作

检查

利用showmount命令检查有权限挂载的服务器是否能够挂载

1
2
3
4
5
[root@web01 mnt]# showmount -e
Export list for web01:
[root@web01 mnt]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 192.168.242.0/24,172.16.1.0/24
常用参数 作用
-d 仅显示已被NFS客户端加载的目录
-e 显示NFS服务器上所有的共享目录

NFS排错

服务端

  1. 检查nfs进程信息是否注册

    rpcinfo -p localhost/172.16.1.31
    问题原因:

    • 服务启动顺序不对
    • 没有启动nfs服务
  2. 检查有没有可用存储目录
    showmount -e 172.16.1.31
    问题原因:
    配置文件编写有问题,重启nfs服务

  3. 在服务端进行挂载测试

    是否能够在存储目录中创建或删除数据

客户端

  1. 检查nfs进程信息是否注册
    rpcinfo -p localhost/172.16.1.31

    问题原因:

    • 没有启动nfs服务

    • 服务启动顺序不对

    1. 检查有没有可用存储目录
      showmount -e 172.16.1.31
      问题原因:
      配置文件编写有问题,重启nfs服务

    2. 网络问题
      ping 172.16.1.31

      telnet 172.16.1.31 111

示例

  • 示例1:客户端挂载报错“No such file or directory”

    1
    2
    3
    4
    5
    [root@nfs01t ~]# showmount -e 172.16.1.31
    Export list for 172.16.1.31:
    /data 172.16.1.0/24
    [root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt
    mount.nfs: mounting 172.16.1.31:/data failed, reason given by server: No such file or directory

    解答:原因是NFS服务器端没有共享目录/data,创建即可。命令如下:
    [root@nfs-server ~]# mkdir /data

  • 示例2:NFS服务器端启动失败,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    [root@nfs01 ~]# systemctl start nfs-server
    Starting NFS services: [ OK ]
    Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused
    rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
    [FAILED]
    Starting NFS mountd: [FAILED]
    Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
    rpc.nfsd: unable to set any sockets for nfsd [FAILED]

    解答:这是因为RPC服务没有在NFS前面启动,需要先启动RPC服务再启动NFS,解决方法为,按顺序启动rpcbind及NFS,命令如下:

    1
    2
    [root@nfs-server ~]# systemctl start rpcbind
    [root@nfs-server ~]# systemctl start nfs-server
  • 示例3:注册RPC服务失败,出现failed:RPC Error:Program not registered错误。

    1
    2
    3
    4
    [root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt
    mount.nfs: requested NFS version or transport protocol is not supported
    [root@nfs-client ~]# showmount -e 172.16.1.31
    clnt_create: RPC: Program not registered

    解答:服务器端的NFS没有启动,客户端没有收到服务器端发来的随机端口信息。
    解决方法如下:

    1
    2
    [root@nfs-server ~]# systemctl restart rpcbind
    [root@nfs-server ~]# systemctl restart nfs-server
  • 示例4:卸载挂载设备时显示device is busy。

    1
    2
    3
    [root@nfs01 mnt]# umount /mnt
    umount.nfs: /mnt: device is busy
    umount.nfs: /mnt: device is busy

    解答:有可能是当前目录就是挂载的NFS目录(/mnt),也有可能是NFS Server挂了。对于第一种情况,解决办法为退出挂载目录/mnt,再执行umount /mnt卸载。对于第二种情况,NFS Server挂了,NFS Client就会出现问题(df -h窗口会死掉),这时只能强制卸载,方法为:
    umount -lf /mnt 其中的参数-f为强制卸载,参数-l为懒惰的卸载。

  • 示例5:CentOS 6.6客户端NFS挂载时遇到问题。

    1
    2
    3
    4
    5
    6
    7
    [root@nfs01 ~]# mount -t nfs 172.16.1.9:/data /mnt
    mount:wrong fs type,bad option,bad option,bad superblock on 10.0.0.7:/data,
    missing codepage or helper program,or other error
    (for several filesystems (e.g. nfs, cifs) you might
    need a /sbin/mount.<type> helper program )
    In some cases useful info is found in syslog - try
    meg | tail or so

    排查思路:同样的机器,NFS服务器本地可以挂载,但是客户端挂载时wrong fs type,因此尝试所有客户端安装nfs-utils。CentOS6.5及以前的NFS没有遇到这个问题。
    解决方法:执行yum install nfs-utils -y,客户端安装NFS软件,但不启动服务。

  • 示例六:共享目录挂载很卡

    1
    2
    3
    [root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt
    [root@nfs01 ~]# cd /mnt
    time touch test.txt

    原因分析:

    • NFS服务端重启之后。立刻进行挂载会出现此问题,因为NFS自身重启的时候,拥有无敌的时间,默认是90秒;在无敌时间内,是不能对共享目录进行更改的操作;
    • 在系统配置中/etc/sysconfig/nfs中指定了无敌时间的配置参数
      NFSD_V4_GRACE=90
      NFSD_V4_LEASE=90
      NLM_GRACE_PERI0D=90
      find /proc -name | grep -i ” NLM_GRACE_PERIOD”
      find /proc -iname ” NLM_GRACE_PERIOD”
    • 重启NFS服务没有按照顺序进行重启,一旦NFS重启了,需要确认rpcbind服务有没有接收,即rpcinfo -p localhost;先启动rpcbind服务再启动nfs服务
  • 示例七:ls: cannot open directory .: Stale file handle
    Stale file handle
    客户端报错

    1
    2
    [root@nfs01 ~]# mount -t nfs 172.16.1.9:/data  /mnt
    [root@nfs01 ~]# mount.nfs: Stale file handle

    服务端挂载报错

    1
    2
    [root@nfs01 data]# mount -t nfs 172.16.1.31:/data /mnt/
    mount.nfs: access denied by server while mounting 172.16.1.31:/data

    查看配置文件发现

    1
    2
    3
    [root@nfs01 data]# cat /etc/exports
    #share /data by lidao at 20160913
    /data 173.16.1.0/24(rw,sync)

    原因分析:

    /proc/mounts客户端挂载文件中已经存在了相应的挂载记录,没有正确卸载掉,就再次进行挂载,就会出现以上错误。

Rsync

rsync,英文全称是 remote synchronize, 是一款实现远程同步功能的免费软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync 是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过 ssh 方式来传输文件。 甚至还可以实现只同步一个文件里有变化的内容部分,所以可以实现快速的同步备份数据。同时, rsync 还可以实现同步本地数据、删除文件和目录的功能。一个 rsync 相当于 scp、 cp、 rm,并且还在性能上优于它们每一个命令。

Rsync特性

  • 能更新整个目录和树和文件系统;
  • 有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  • 对于安装来说,无任何特殊权限要求;
  • 对于多个文件来说,内部流水线减少文件等待的延时;
  • 能用 rsh、 ssh 或直接端口做为传输入端口(rsync 本身不对数据加密);
  • 支持匿名 rsync 同步文件,是理想的镜像工具;

Rsync在企业的工作场景

  • 服务器之间的数据同步(cron+rsync)
  • 把所有客户服务器数据同步到备份服务器(cron+rsync)
  • 与 inotify 或 sersync 配合,做实时的数据同步(rsync+inotify/sersync)

Rsync命令行常用参数

  • 参数说明

    • -v:–verbose 详细模式输出
    • -z:–compress 对备份的文件在传输的过程中进行压缩处理
    • -a:–archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于参数:-vrztopg
    • -r:–recursive 对子目录以递归模式处理。
    • -t:–times 保持文件时间信息
    • -o:–owner 保持文件属主信息。
    • -p:–perms 保持文件权限。
    • -g:–group 保持文件属组信息
    • -D:–devices 保持设备文件信息
    • -l: –links 保留软链结。
    • -e:–rsh=command 指定使用 rsh、 ssh 方式进行数据同步
    • –exclude=PATTERN 指定排除不需要传输的文件模式。
    • –exclude-from=FILE 排除 FILE 中指定模式的文件。
    • –bwlimit=KBPS 限制 I/O 带宽, KBytes per second。
    • –delete 无差异同步参数(慎用),删除那些目标位置有的文件而备份源没有的文件
  • 工作中常用参数组合:-avz

Rsync优缺点

  • 优点
    (1)增量备份,支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物)
      (2)远程shell通道模式还可以加密(ssh)传输,socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务
  • 缺点:
    (1)大量小文件同步的时候,比对时间较长,有的时候,rsync进程可能会停止
    (2)同步大文件,10G这样的大文件有时也会出现问题:中断。未完整同步前,是隐藏文件,可以通过续传等参数实现传输。一次性远程拷贝可以用scp

Rsync部署

服务端

第一步

安装软件

1
2
[root@backup ~]# rpm -qa | grep rsync
rsync-3.1.3-6.el8.x86_64

如果rsync软件不存在: dnf install -y rsync

第二步

编写rsync软件的配置文件

vim /etc/rsyncd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uid = rsync       --- 指定管理备份目录的用户  
gid = rsync --- 指定管理备份目录的用户组
port = 873 --- 定义rsync备份服务的网络端口号
fake super = yes --- 将rsync虚拟用户伪装成为一个超级管理员用户
use chroot = no --- 和安全相关的配置
max connections = 200 --- 最大连接数 同时只能有200个客户端连接到备份服务器
timeout = 300 --- 超时时间(单位秒)
pid file = /var/run/rsyncd.pid --- 记录进程号码信息 1.让程序快速停止进程 2. 判断一个服务是否正在运行
lock file = /var/run/rsync.lock --- 锁文件
log file = /var/log/rsyncd.log --- rsync服务的日志文件 用于排错分析问题
ignore errors --- 忽略传输中的简单错误
read only = false --- 指定备份目录是可读可写
list = false --- 使客户端可以查看服务端的模块信息
hosts allow = 172.16.1.0/24 --- 允许传输备份数据的主机(白名单)
hosts deny = 0.0.0.0/32 --- 禁止传输备份数据的主机(黑名单)
auth users = rsync_backup --- 指定认证用户
secrets file = /etc/rsync.password --- 指定认证用户密码文件 用户名称:密码信息
[backup] --- 模块信息
comment = "backup dir by oldboy"
path = /backup --- 模块中配置参数 指定备份目录

第三步

创建rsync服务的虚拟用户

useradd rsync -M -s /sbin/nologin

第四步

创建备份服务认证密码文件并改权限

1
2
echo "rsync_backup:123123" >/etc/rsync.password
chmod 600 /etc/rsync.password

第五步

建备份目录并修改属主属组信息

1
2
mkdir /backup
chown -R rsync.rsync /backup/

第六步

启动rsync守护进程服务

rsync --daemon

1
2
3
[root@backup ~]# ps -ef | grep rsync
root 901 1 0 12:07 ? 00:00:00 rsync --daemon
root 1432 1405 0 12:09 pts/0 00:00:00 grep --color=auto rsync

第七步

需要熟悉rsync守护进程名称语法:

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

    src: 要推送备份数据信息

    [USER@]: 指定认证用户信息

    HOST: 指定远程主机的IP地址或者主机名称
    ::DEST: 备份服务器的模块信息

    rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST

客户端

第一步

创建密码文件

1
2
echo "123123" >/etc/rsync.password
chmod 600 /etc/rsync.password

第二步

进行免交互传输数据测试

1
2
3
4
5
6
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 227 bytes received 43 bytes 180.00 bytes/sec
total size is 371 speedup is 1.37

检查服务端

1
2
[root@backup ~]# ll /backup/hosts -d
-rw-r--r-- 1 rsync rsync 371 3月 27 07:23 /backup/hosts

守护进程服务企业应用

守护进程多模块功能配置

在配置文件中添加如下

1
2
3
4
5
6
7
8
9
[backup]
comment = "backup dir by kinmfer"
path = /backup
[dba]
comment = "backup dir by kinmfer"
path = /dba
[dev]
comment = "backup dir by kinmfer"
path = /devdata

守护进程的排除功能实践

  • 准备环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@nfs01 ~]# mkdir -p /kinmfer/{a..c}
[root@nfs01 ~]# touch /kinmfer/{a..c}/{1..3}.txt
[root@nfs01 ~]# tree /kinmfer
/kinmfer
├── a
│   ├── 1.txt
│   ├── 2.txt
│   └── 3.txt
├── b
│   ├── 1.txt
│   ├── 2.txt
│   └── 3.txt
└── c
├── 1.txt
├── 2.txt
└── 3.txt

3 directories, 9 files
  • 需求01: 将/kinmfer目录下面 a目录数据全部备份 b目录不要备份1.txt文件 c整个目录不要做备份

    --exclude=PATTERN
    • 绝对路径方式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      [root@nfs01 ~]# rsync -avz /kinmfer --exclude=/kinmfer/b/1.txt --exclude=/kinmfer/c/ rsync_backup@172.16.1.41::backup
      Password:
      sending incremental file list
      kinmfer/
      kinmfer/a/
      kinmfer/a/1.txt
      kinmfer/a/2.txt
      kinmfer/a/3.txt
      kinmfer/b/
      kinmfer/b/2.txt
      kinmfer/b/3.txt

      sent 387 bytes received 135 bytes 116.00 bytes/sec
      total size is 0 speedup is 0.00
    • 采用相对路径方式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      [root@nfs01 ~]# rsync -avz /kinmfer --exclude=b/1.txt --exclude=c/ rsync_backup@172.16.1.41::backup
      Password:
      sending incremental file list
      kinmfer/
      kinmfer/a/
      kinmfer/a/1.txt
      kinmfer/a/2.txt
      kinmfer/a/3.txt
      kinmfer/b/
      kinmfer/b/2.txt
      kinmfer/b/3.txt

      sent 387 bytes received 135 bytes 208.80 bytes/sec
      total size is 0 speedup is 0.00
  • 需求02: 将/kinmfer目录下面 a目录数据全部备份 b目录不要备份1.txt文件 c整个目录1.txt 3.txt文件不要备份
    –exclude-from=file — 批量排除

    • 编辑好一个排除文件

      1
      2
      3
      4
      5
      [root@nfs01 ~]# cat /kinmfer/exclude.txt
      b/1.txt
      c/1.txt
      c/3.txt
      exclude.txt # 将自身排除
    • 实现批量排除功能

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      [root@nfs01 ~]# rsync -avz /kinmfer --exclude-from=/kinmfer/b/1.txt --exclude=/kinmfer/c/ rsync_backup@172.16.1.41::backup
      Password:
      sending incremental file list
      kinmfer/
      kinmfer/exclude.txt
      kinmfer/a/
      kinmfer/a/1.txt
      kinmfer/a/2.txt
      kinmfer/a/3.txt
      kinmfer/b/
      kinmfer/b/1.txt
      kinmfer/b/2.txt
      kinmfer/b/3.txt

      sent 536 bytes received 177 bytes 83.88 bytes/sec
      total size is 36 speedup is 0.05

      守护进程来创建备份目录(不需要手动输入密码)

1
2
3
4
5
6
7
[root@nfs01 ~]# rsync -avz /etc/hosts  rsync_backup@172.16.1.41::backup/192.168.242.31/ --password-file=/etc/rsync.password
sending incremental file list
created directory 192.168.242.31
hosts

sent 227 bytes received 80 bytes 614.00 bytes/sec
total size is 371 speedup is 1.21

PS: 客户端无法在服务端创建多级目录

守护进程的访问控制配置

守护进程白名单和黑名单功能

守护进程的列表功能配置

1
2
3
4
[root@nfs01 /]# rsync rsync_backup@172.16.1.41::
backup "backup dir by kinmfer"
dba "backup dir by kinmfer"
dev "backup dir by kinmfer"