一、NFS文件共享服务器概念:

NFS是network file sytem的缩写,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

二、NFS工作原理:


  1. 首先NFS服务器端开启rpcbind;
  2. 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad进程等;
  3. 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端口发出NFS文件存取功能的询问请求。
  4. NFS服务端的RPC服务找到对应的已注册的NFS daemon端口后,通知NFS客户端的RPC服务。
  5. 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客户端rpc就直接与NFS服务器的rpc进行存取数据了(rpc知道了nfs的具体端口,就可以实现远程调用,即传输)。
ps:有一点需要注意的是nfs并不是单独存在的,而是由NFS-server,RPC,PORTMAP这三个模块组成。

NFS-server只负责将数据通过以文件系统的方式共享出去,
并进行登录管理和权限管理,并不负责数据的传输,而数据的传输则有RPC来完成。

PORTMAP主要是来分配端口给statd,rquotad等进程,NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp,
还会启动以上进程来完成文件共享。



三、NFS安装部署:

服务器客户端都装好nfs服务组件:


yum -y install nfs-utils


配置服务端:

1、编辑/etc/exports文件


/data/lutixia  192.168.0.0/24(rw,sync)

/data/lutixia   是服务端想要共享出去的目录,提前创建好。
192.168.0.0/24  表示这个网段都可以来挂载,也可以设置具体某个ip。
(rw,sync)  表示客户端挂载服务端目录后的权限,这里表示可读可写,
以及实时同步,还有其他选项,后面介绍。


2、导出(广播)编辑的文件,并启动rpc和nfs服务


exportfs -r
systemctl start rpcbind
systemctl start nfs


配置客户端:

1、可用showmount搜索网络中可用的共享文件


[root@localhost nfs]# showmount -e 192.168.0.187
Export list for 192.168.0.187:
/data/lutixia 192.168.0.0/24

# 192.168.0.187  服务端的IP


2、创建目录,用于挂载


mkdir /mnt/nfs


3、挂载


mount -t nfs  192.168.0.187:/data/lutixia /mnt/nfs
[root@localhost ~]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/sda3                     20G  1.6G   18G   9% /
...
/dev/sda1                    297M  108M  190M  37% /boot
192.168.0.187:/data/lutixia   20G  5.0G   15G  26% /mnt/nfs

#可以看到已经挂载上了。


4、挂载完成之后,进入目录,可能会发现无法创建和修改文件


[root@localhost nfs]# mkdir abc
mkdir: cannot create directory ‘abc’: Permission denied


这主要是因为客户端访问服务器时,身份被压缩成nobody,相对服务器文件系统来说,就是其他用户。所以要想编辑,需要在服务端对文件授权或者更改exports文件,设置no_root_squash(不压缩客户端root身份)。


nfs服务端修改exports文件,加上no_root_squash参数:

/data/lutixia 192.168.0.0/24(rw,sync,no_root_squash)
然后重新导出:
exportfs -r

nfs客户端再次创建文件:
[root@localhost nfs]# mkdir abc
[root@localhost nfs]# ls
abc


服务端的/etc/exports文件详解:


[root@localhost ~]# exportfs -v
/data/lutixia  	192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

其中:
rw:可读可写
ro:仅可读
sync:是指数据同步写入内存和磁盘
root_squash:如果客户端用root身份访问,则被压缩成nobody,权限也将受到限制。
no_root_squash:也就是不压缩,客户端使用root身份登录,全有所有权限,很危险。
all_squash:不管访问者是什么身份,包括root,全部压缩至匿名用户。
no_all_squash:保留访问用户的身份uid以及gid,一般只能查看,不能修改,权限问题,但是可以强制保存。
secure:nfs通过1024以下的安全TCP/IP端口发送


异常报错:

卸载时报错:


umount.nfs4: /mnt/nfs: device is busy
#使用以下命令强行解除挂载
umount -l /mnt/nfs   

或者使用
#将会显示使用这个模块的pid
fuser -m /mnt/nfs 
#将会直接kill那个pid
fuser -mk /mnt/nfs