NFS文件服务
# 存储服务介绍
# NFS介绍
NFS是network file system的缩写,中文意思是网络文件共享系统。存储服务器一般存储附件、图片、音频、视频等数据。他的主要功能是通过网络(一般是局域网) 让不同的主机可以访问自己的共享文件或目录。
存储服务器共享出一个目录,客户端将此目录当做设备文件进行挂载,可有多个客户端对此目录同时进行挂载 实现共享。
# 分类
# 集中式存储
集中式存储指数据都集中存储在一台存储服务器,常用集中式存储应用:FTP、NFS、Samba
# 分布式存储
分布式存储值数据分布式存储在多台服务器。用户访问的是存储管理端,类似于RAID卡,分布式存储将一份数据分成多份存放在不同服务器,而RAID是将数据存放在不同磁盘 两者可以相结合。常用分布式存储应用:Moosefs(mfs)、FastDFS、GlusterFS。
# 存储服务器的由来
早期为了解决Web服务器之间的数据不同步,于是使用Rsync进行同步数据,缺点是当服务器过多时,同步的配置会非常繁琐,网络也可能发送拥堵,服务器的存储设备的成本提高。
NFS诞生用户存储数据时,WEB服务器将数据存储到NFS服务器中,实现数据的共享存储,便于数据操作管理,降低其他服务器存储设备的成本。但缺点是无法对不同的用户进行更细的权限划分。
# RPC介绍
远程过程调用服务程序,常用于网络编程。NFS有大量的进程,其中每个端口都不一样,所以需要将NFS的端口全部注册到RPC服务,客户访问时访问RPC的端口即可。
# NFS服务的部署
# 服务端
- 安装相关服务
# 检查服务程序是否安装
rpm -qa | egrep "nfs|rpc"
# 没有则安装
yum install -y nfs-utils rpcbind
2
3
4
- 编写NFS服务配置文件
配置文件:/etc/exports
配置格式:存储目录路径,主机或网段白名单(权限配置/功能选项)
- 例如:/data 10.86.1.0/24(rw,sync)
- 允许所有主机可以使用*例如:/data *(rw,sync)
多个网段主机挂载在后面指定多个"主机或网段白名单(权限配置/功能选项)"即可,或者另起一行再写
- 例如:/data 0.0.0.0/0(rw,sync) 192.168.0.0/24(rw,sync)
cat>/etc/exports<<EOF
/data 0.0.0.0/0(rw,sync)
EOF
2
3
- 创建存储目录
# 创建存储目录
mkdir /data
# 将属主和属组修改为nobody虚拟用户
chown nobody:nobody /data
2
3
4
- 启动rpcbind服务和nfs服务
# 先启动rpcbind服务程序 再启动nfs才能注册端口,rpcbind默认111端口
systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs
2
3
# 客户端
# 安装nfs服务程序,用于识别nfs文件系统
yum install -y nfs-utils
# 创建挂载目录
mkdir /nfs
# 临时挂载配置,主机地址可以是IP或域名
# mount -t nfs [主机地址]:[远程存储目录] [挂载点]
# 永久挂载配置,配置自动挂载远程共享目录,添加到/etc/fstab
# 格式 [主机地址]:[远程存储目录] [挂载点] nfs defaults 0 0
cat>>/etc/fstab<<EOF
192.168.1.51:/data/d01 /nfs nfs defaults 0 0
EOF
mount -a
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CentOS7还需启动remote-fs.target服务。
# mount参数
-t
文件系统类型。
-o
指定挂载方式。
- rw 可读可写(默认)。
- ro 只读。
-a
立即加载fstab中的配置。
-lf
强制卸载挂载点。
- -l 不退出挂载点目录进行卸载。
- -f 强制进行卸载操作。
suid
使共享目录中suid权限位生效。
nosuid
使共享目录中suid权限位失效,提供共享目录的安全性,防止黑客上传有s权限的命令文件然后执行。
exec
使共享目录中的执行文件可以直接执行,使可以"./[可执行文件]"方式执行文件。
noexec
使共享目录中的执行文件可以直接执行,防止可执行程序直接./执行,比如病毒、木马等。
auto
使开机自动挂载。
noauto
使开机不自动挂载。
user
允许普通用户挂载或卸载挂载点。
nouser
禁止普通用户挂载或卸载挂载点
# NFS服务的原理
# 服务端
先启动RPC服务,RPC服务开启111端口。
再启动NFS服务,NFS向RPC服务注册一次端口号。
# 客户端
客户端执行挂载命令进行远程挂载。
与服务端建立TCP网络连接。
实现数据远程传输。
# NFS服务的默认配置
NFS默认记录文件,仅做记录,修改无效:/var/lib/nfs/etab
NFS默认使用的虚拟用户:nobody
NFS配置文件中的权限配置:
rw
- 存储目录的读写权限。ro
- 存储目录的只读权限。sync
- 同步方式存储数据。async
- 异步方式存储数据。no_root_squash
- 不要将root用户进行身份转换。root_squash
- 将root用户身份进行身份转换。no_all_squash
- 不要将普通用户进行身份转换。all_squash
- 将普通用户进行身份转换。
# 其他名词解释
# 异步与同步
异步
接收到数据之后,先放在内存中,数据排队存放到硬盘中,类似缓存服务器中的队列服务。
优点:传输数据快,减轻磁盘压力。
缺点:数据传输不可靠,易丢失数据。
同步
- 接收到数据之后,直接放到硬盘中。
- 优点:传输数据可靠,不易丢失数据。
- 缺点:数据传输慢。
# 用户身份转换
- 客户端传输数据时,将发送数据的用户映射转换成服务端设置的虚拟用户,来进行数据保存。
# 存储服务应用
# 配置NFS的Squash参数
设置no_all_squash。
- 防止其他服务器的普通用户随便修改NFS数据目录,需要用户有目录的权限,并且将属主组设为指定用户,属主要两个服务器用户的UID一致。
设置root_squash。
- 将root用户转换为nfs虚拟用户,并将存储目录设为其他用户而非nfs 则root无法对目录进行操作 所以较安全。
以上为默认配置,很多服务默认配置都是从安全角度出发。
不设置no_root_squash。
- 防止其他服务器的root用户随便修改NFS数据目录。
不设置all_squash。
- 会将所以用户转换为nfs虚拟用户,非常不安全。
让root用户可以操作www用户管理的存储目录(不安全)。
- 指定映射用户,需要用户的uid,配置中添加 (rw,sync,anonuid=1002,anongid=1002),其他用户登录时,将会映射为指定的用户,差不多同等于 no_root_squash。
# NFS挂载慢问题
nfs服务重启,挂载后创建数据比较慢,可能是服务器重启的方式不正确,能使用reload就不使用restart。
systemctl restart [服务名]
- 强制重启,即便已处于数据传输状态,也会强制断开,并重启整个服务。
systemctl reload [服务名]
- 平滑重启,reload重启只会重新连接没有数据传输的连接,其他正在数据传输的连接,会在传输完后再重新连接,并且会生效新的配置,不会重启整个服务。