1. NFS简介
NFS(Network File System),即网络共享文件系统
它的主要功能是通过网络(一般是局域网)让不同主机系统之间共享文件或目录
NFS客户端(应用服务器,例如web)以挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(某一个挂载点下)
从客户端本地来看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,而实际上却是远端的NFS服务器的目录
所有的Web服务器会向NFS服务器进行数据交互 NFS存储服务中主要存储那些信息:用户上传的图片、音频、视频、附件等信息
存储场景:
NFS适用于中小型企业:默认只能有一台NFS服务器,
大公司或大门户:高并发:Moosefs(MFS)、GlusterFS、FastDFS等(分布式文件系统 )
2. RPC服务
NFS在传输数据时会使用随机端口号,每个NFS服务进程都会对应一个随机端口号,这时客户端没办法知道NFS服务的准确的端口号,那么就需要通过RPC(中介)来告诉客户端NFS服务的端口号。
NFS工作流程图:
NFS工作原理流程图:
NFS服务端做了三件事:
- 首先要先启动RPC服务,在启动NFS服务
- NFS服务产生随机端口号,
- NFS自动向RPC服务注册随机端口号,在nfs服务稳定运行过程中,只注册一次
客户端做了三件事
- 启动rpcbind服务(可选)
- 确保客户端和服务端网络连接建立成功
- 客户端需要通过自身的RPC服务,来向NFS服务端的RPC服务获取NFS的端口号,然后客户端在通过得到的端口号,单独向NFS发起TCP建立。
NFS服务启动进程和端口过程,需要由rpc统一管理 客户端可以不用启动rpc服务,不会对挂载有任何影响
3. NFS服务端搭建
需求:nfs服务端将/data目录作为共享目录,并只允许10.4.7.0/24网段nfs客户端挂载访问
nfs服务端IP:10.4.7.170
本文以centos7.4系统为实验环境
1.安装nfs-utils
[root@nfs ~]# yum install nfs-utils -y
yum包管理会自动安装nfs所依赖的各种软件,特别是rpcbind
2.启动nfs并加入开机自启动
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
以前nfs老版本的时候,必须要先启动rpcbind之后再启动nfs,现在直接启动nfs,rpcbind也会随着启动
3.编写nfs配置文件
[root@nfs ~]# vim /etc/exports
/data 10.4.7.0/24(rw,sync)
// 配置文件解释
共享/data目录,该目录只允许10.4.7.0/24网段挂载访问,目录权限为可读写,数据同步写入磁盘
4.创建/data目录,并更改共享目录属主nfsnobody(在nfs中,默认的匿名用户为nfsnobody,)
[root@nfs ~]# mkdir -p /data
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data
查看默认配置信息可以知道NFS服务客户端登录用户默认为匿名用户,在nfs中,默认的匿名用户为nfsnobody,如果不指定用户,那么默认就是nfsnobody
5.启动nfs并测试共享目录
[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# showmount -e localhost
Export list for localhost:
/data 10.4.7.0/24 // 目录已经共享成功
每次修改nfs配置文件都需要重启nfs
常用选项:
- ro:默认选项,以只读的方式共享。
- rw:以读写的方式共享。
- root_squash:将客户端使用的是root用户时,则映射到NFS服务器的用户为NFS的匿名用户(nfsnobody)。
- no_root_squash:将客户端使用的是root用户时,则映射到FNS服务器的用户依然为root用户。
- all_squash:默认选项,将所有访问NFS服务器的客户端的用户都映射为匿名用户,不管客户端使用的是什么用户。
- anonuid:设置映射到本地的匿名用户的UID
- anongid:设置映射到本地的匿名用户的GID
- sync:默认选项,保持数据同步,数据同步写入到内存和硬盘。
- async:异步,先将数据写入到内存,在将数据写入到硬盘。
- secure:NFS客户端必须使用NFS保留端口(通常是1024以下的端口),默认选项。
- insecure:允许NFS客户端不使用NFS保留端口(通常是1024以上的端口)
4. NFS客户端
nfs客户端IP:10.4.7.171
1.安装nfs-utils(客户端也必须安装)
[root@web01 ~]# yum install -y nfs-utils
2.将客户端的/mnt目录挂载到nfs服务端/data目录
[root@web01 ~]# mount -t nfs 10.4.7.170:/data /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 98G 1.6G 97G 2% /
devtmpfs 473M 0 473M 0% /dev
tmpfs 483M 0 483M 0% /dev/shm
tmpfs 483M 6.7M 476M 2% /run
tmpfs 483M 0 483M 0% /sys/fs/cgroup
/dev/sda1 1014M 120M 895M 12% /boot
tmpfs 97M 0 97M 0% /run/user/0
10.4.7.170:/data 98G 2.4G 96G 3% /mnt
3.在挂载目录/mnt下创建文件,然后在nfs服务端查看
// nfs客户端
[root@web01 ~]# cd /mnt/
[root@web01 mnt]# touch test.txt
// nfs服务端
[root@nfs ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 13 20:55 test.txt
4.实现开机自动挂载
[root@web01 ~]# echo "10.4.7.170:/data /mnt nfs defaults,_rnetdev 1 1" >>/etc/fstab
注意:第1个1表示备份文件系统,第2个1表示从/分区的顺序开始fsck磁盘检测,0表示不检测。
_rnetdev
表示主机无法挂载直接跳过,避免无法挂载主机无法启动
5. NFS服务端增加用户
默认情况下nfs使用nfsnobody这个匿名用户,但是现在有个需求,我想让nfs服务端共享目录的匿名用户为www,操作如下:
5.1. 服务端
1.创建web用户
[root@nfs ~]# useradd www -u 1100 -s /sbin/nologin
[root@nfs ~]# id www
uid=1100(www) gid=1100(www) groups=1100(www)
2./etc/exporter
添加新的共享目录,并为该目录指定匿名用户
[root@nfs ~]# vim /etc/exports
/data 10.4.7.0/24(rw,sync)
/web_data 10.4.7.0/24(rw,sync,all_squash,anonuid=1100,anongid=1100)
3.创建共享目录并授权
[root@nfs ~]# mkdir /web_data
[root@nfs ~]# chown -R www.www /web_data/
4.重启nfs
[root@nfs ~]# systemctl restart nfs
5.2. 客户端
客户端挂载到10.4.7.170的/web_data目录到本机/opt/目录
1.挂载目录
[root@web01 ~]# mount -t nfs 10.4.7.170:/web_data /opt/
2.root用户创建文件,被压缩成www匿名用户
[root@web01 ~]# cd /opt/
[root@web01 ~]# touch test.txt
[root@web01 opt]# ls -lh
total 0
-rw-r--r-- 1 1100 1100 0 Mar 13 21:19 test.txt