综合架构-文件共享服务+传输服务
FTP服务
ftp协议
文件传输协议
- 协议定义了一个远程计算机系统和本地计算机系统之间传输文件的一个标准
- FTP运载OSI七层模型的应用层,并利用传输协议TCP在不同主机之间提供可靠的数据传输
- FTP在文件传输中还支持断点续传功能,可以大幅的减少CPU网络带宽的开销
ftp模型
- 用户接口: 提供了一个用户接口并使用用户端协议解释器的服务
- 客户端协议解释器:向远程主机发送命令,并建立客户端数据传输过程
- 服务端协议解释器:响应客户端协议发出的命令并驱动服务器的数据传输
- 客户端数据传输协议:负责完成和服务端数据传输过程及客户端本地文件系统的通信
- 服务端数据传输协议:负责完成和客户端数据传输过程及服务端本地文件系统的通信
- 连接方式:不同的连接方式需要合适的服务质量
- 命令连接: 建立连接及命令发送和响应(需要更小的延迟时间) 21端口
- 数据连接: 用于数据传输(需要更大的数据吞吐量) 20端口
命令连接
- 主要用来传输实际通信中需要执行的FTP命令以及命令响应
- 只需要很小的网络带宽
- FTP服务器监听在21端口来等待控制连接建立
- 建立控制连接之后,还需要验证客户端身份,决定是否建立数据连接
- 当需要目录列表,传输文件时,才建立数据连接,并且每次客户端都会使用不同的随机端口来建立数据连接;当数据传输完毕之后,就断开数据连接
- 在FTP连接期间,控制连接始终保持连接状态,在数据连接存在的期间,控制连接必须存在,一旦控制连接断开,数据连接会自动断开
数据连接
- FTP服务端监听在20端口上等待数据连接
- 数据连接依赖于控制连接
主动模式
- 三次握手建立命令连接,客户端的端口是随机的,目标端口是21
- 控制连接建立完成之后,客户端进行验证,协商数据连接采用的模式(主动模式)
随后客户端会向FTP服务端发送Port报文(端口为命令连接使用的端口向后的第一个可用端口),表明自己的IP地址及端口号信息;等待FTP服务端20端口主动地发起数据连接请求 - 服务端发送数据连接请求,连接建立之后开始进行数据传输
被动模式
- 三次握手建立控制连接,客户端的端口是随机的,目标端口是21
- 控制连接建立完成之后,客户端进行验证,协商数据连接采用的模式(被动模式)
客户端向服务端发送PASV报文,表示我们用被动模式 - 服务端在收到PASV报文,向客户端发送Port报文,表明自己的IP地址及端口号信息;
- 客户端发送数据连接请求,建立数据连接
- 关键点: 主动和被动在于服务端是主动建立数据连接还是被动建立数据连接
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 | [root@test ~]# cat /etc/vsftpd/vsftpd.conf | grep -Ev "^$|^#" |
实例1:匿名用户
关闭防火墙和SELINUX
配置参数:
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/修改指定目录的属主
[root@test pub]# chown -Rf ftp /var/ftp/pub/使用anonymous用户登录测试
ftp://x.x.x.x 用户名: anonymous 密码:
实例2: 本地用户
关闭防火墙和SELINUX
配置参数:
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检查/etc/pam.d/vsftpd文件中
列在此文件中的所有用户,均被禁止使用ftp服务
1
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed # 参数必须要有
检查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重启vsftpd服务并使用本地用户root进行登录测试
实例3:虚拟用户
关闭防火墙和SELINUX
创建用于FTP认证的用户数据文件
1
2
3
4
5
6
7mkdir /etc/vsftpd/vconf
cat > /etc/vsftpd/vconf/vftpuser.txt <<EOF
xiaohong # 用户名1
xiaohong # 密码
xiaoming # 用户名2
xiaoming # 密码
EOF将明文信息转成数据文件
db_load ‐T ‐t hash ‐f /etc/vsftpd/vconf/vftpuser.txt /etc/vsftpd/vconf/vftpuser.db创建vsftpd服务应用程序用于存储文件的根目录已经虚拟用户映射的系统本地用户
useradd -d /var/ftproot -s /sbin/nologin virtualchmod -Rf 755 /var/ftproot/建立用户支持虚拟用户的PAM文件
1
2
31. [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配置参数:
1
2
3
4
5# 虚拟用户相关配置参数:
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vconf/为不同虚拟用户设置不同的权限
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重启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 | ls *.txt ##查找当前目录下的所有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 | get 123.txt ##下载123.txt文件到 /home/123/web 中 |
上传文件
1 | put 123.txt ##同下载 |
设置被动/非被动模式
1 | set ftp:passive-mode 1 ## 1 被动 0非主动 |
多任务处理
1 | ctrl+z ##将当前进行的任务移交后台处理 |
其他命令
定义别名
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 | [root@test ~]# cat /etc/samba/smb.conf | grep -Ev "^$|^#" |
Samba服务权限
- 所以在使用Samba服务共享资源的时候涉及到本地文件系统权限和Samba本身权限
- 本地文件系统权限管理:chown chmod selinux (x)
- Samba本身权限: 配置文件中使用相关参数去控制
Samba服务部署
更多信息可以参考https://www.cnblogs.com/kevingrace/p/8662088.html
第1步:创建用于访问共享资源的账户信息
1 | [root@node1 ~]# useradd wangwu && pdbedit -a -u wangwu |
第2步:创建用于共享资源的文件目录[root@node1 ~]# mkdir /home/database[root@node1 ~]# chown -Rf wangwu:wangwu /home/database
第3步:修改主配置文件
1 | 每个共享目录应该有独立的[ ]部分 |
添加如下配置:
1 | [database] |
第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 密码:wangwuLinux挂载共享
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
7echo '//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连接并进行数据的传输。

NFS服务搭建
安装
服务端
[root@nfs01 ~]# dnf install rpcbind nfs-utils -y客户端
[root@web01 ~]# dnf install nfs-utils -y
启动服务
注意:先启动rpc服务,在启动nfs服务
1 | [root@nfs01 ~]# systemctl start rpcbind |
没有注册时候:
1 | [root@nfs01 ~]# rpcinfo -p 172.16.1.31 |
nfs服务注册之后信息:
1 | [root@nfs01 ~]# rpcinfo -p 172.16.1.31 |
配置
服务端
创建目录并授权
1 | [root@nfs01 ~]# mkdir -p /data/web01 |
配置文件说明:
格式: 共享目录的路径 允许访问的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 | /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) |
企业中如何编辑nfs配置文件
- 通用方法 *****
/data 172.16.1.0/24(rw,sync) - 特殊情况 (让部分人员不能操作存储目录 可以看目录中的数据)
/data 10.0.0.0/24(ro,sync) - 修改默认的匿名用户
/data 10.0.0.0/24(ro,sync,anonuid=xxx,anongid=xxx)
配置完成后,使用exportfs实用程序有选择地导出目录,而无需重新启动NFS服务
用exportfs命令
1 | [root@nfs01 ~]# exportfs -rv |
| 参数 | 作用 |
|---|---|
| -a | 全部挂载或者全部卸载 |
| -r | 重新挂载 |
| -u | 卸载某一个目录 |
| -v | 显示共享目录 |
客户端
挂载
启动:
1 | [root@web01 mnt]# systemctl start nfs-server.service |
输入命令:mount -t nfs 172.16.1.31:/data /mnt
检查:
1 | [root@web01 mnt]# df -h |
如何实现自动挂载:
利用rc.local
echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local利用fstab文件
1
2vim /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 | [root@web01 mnt]# showmount -e |
| 常用参数 | 作用 |
|---|---|
| -d | 仅显示已被NFS客户端加载的目录 |
| -e | 显示NFS服务器上所有的共享目录 |
NFS排错
服务端
检查nfs进程信息是否注册
rpcinfo -p localhost/172.16.1.31
问题原因:- 服务启动顺序不对
- 没有启动nfs服务
检查有没有可用存储目录
showmount -e 172.16.1.31
问题原因:
配置文件编写有问题,重启nfs服务在服务端进行挂载测试
是否能够在存储目录中创建或删除数据
客户端
检查nfs进程信息是否注册
rpcinfo -p localhost/172.16.1.31问题原因:
没有启动nfs服务
服务启动顺序不对
检查有没有可用存储目录
showmount -e 172.16.1.31
问题原因:
配置文件编写有问题,重启nfs服务网络问题
ping 172.16.1.31telnet 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 | [root@backup ~]# rpm -qa | grep rsync |
如果rsync软件不存在: dnf install -y rsync
第二步
编写rsync软件的配置文件
vim /etc/rsyncd.conf
1 | uid = rsync --- 指定管理备份目录的用户 |
第三步
创建rsync服务的虚拟用户
useradd rsync -M -s /sbin/nologin
第四步
创建备份服务认证密码文件并改权限
1 | echo "rsync_backup:123123" >/etc/rsync.password |
第五步
建备份目录并修改属主属组信息
1 | mkdir /backup |
第六步
启动rsync守护进程服务
rsync --daemon
1 | [root@backup ~]# ps -ef | grep 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 | echo "123123" >/etc/rsync.password |
第二步
进行免交互传输数据测试
1 | [root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password |
检查服务端
1 | [root@backup ~]# ll /backup/hosts -d |
守护进程服务企业应用
守护进程多模块功能配置
在配置文件中添加如下
1 | [backup] |
守护进程的排除功能实践
- 准备环境
1 | [root@nfs01 ~]# mkdir -p /kinmfer/{a..c} |
需求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 | [root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup/192.168.242.31/ --password-file=/etc/rsync.password |
PS: 客户端无法在服务端创建多级目录
守护进程的访问控制配置
守护进程白名单和黑名单功能
守护进程的列表功能配置
1 | [root@nfs01 /]# rsync rsync_backup@172.16.1.41:: |



