NFS文件共享服务


NFS是network file sytem的缩写,他最大的特点就是可以通过网络,让不同的机器,不同的系统实现文件共享。NFS客户端可以将NFS服务器共享的目录挂载在本地的文件系统中,访问目录就如同访问自己本地目录一样。

 

NFS工作原理


Linux NFS文件共享服务_linux

1. 首先NFS服务端开启rpcbind;

2. 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad等;

3. 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端口发出NFS文件存取功能的询问请求。

4. NFS服务端的RPC服务找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务。

5. 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客户端rpc就直接与NFS服务器的rpc进行存取数据了(rpc知道了nfs的具体端口,就可以实现远程调用,即传输)。

环境如下:

server1

192.168.179.99

nfs客户端

Server2

192.168.179.100

nfs服务端

 

 

环境部署


[root@localhost ~]# yum install nfs-utils -y  --在192.168.179.99/100客户端服务端都安装上软件包

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld --在服务端客户端两边关闭禁用防火墙

 

[root@localhost ~]# cat /etc/selinux/config  --服务端客户端两边关闭selinux

SELINUX=disabled

临时关闭selinux:

setenforce 0

永久关闭selinux:

sed -i 's/=enforcring/=disabled/' /etc/selinux/config

 

 

服务端的操作


[root@localhost ~]# mkdir -p /data/jfedu  --创建共享出去的目录

[root@localhost ~]# vim /etc/exports  --修改配置文件

/data/jfedu 192.168.179.0/24(ro,sync )

共享出去的目录 共享给哪台服务器,如果给192.168.179网段使用192.168.179.0/24

(里面是参数,ro只读,sync写入的内存数据直接同步到磁盘,这样速度慢一点,但是数据是安全的)

ro 只读权限

rw读写权限

sync数据同步写入内存硬盘

 

[root@localhost ~]# systemctl start rpcbind

[root@localhost ~]# systemctl enable rpcbind

[root@localhost ~]# systemctl start nfs

[root@localhost ~]# systemctl enable nfs

[root@localhost ~]# exportfs -r  --导出(广播)编辑的文件,并重启rpc和nfs服务

[root@localhost ~]# rpcinfo -p

   program vers proto   port  service

    100000    4   tcp    111  portmapper

    100000    3   tcp    111  portmapper

.............................................................................

[root@localhost ~]# exportfs  -v

/data/jfedu    192.168.179.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

 

 

客户端的操作


[root@localhost ~]# showmount -e 192.168.179.100

Export list for 192.168.179.100:  --这里可以有多个列表,服务端可以将多个目录共享给不同的机器

/data/jfedu 192.168.179.0/24

[root@localhost ~]# mkdir -p /mnt/nfs  --创建挂载点

[root@localhost ~]# mount -t nfs 192.168.179.100:/data/jfedu /mnt/nfs  --将服务端192.168.179.100:的共享目录/data/jfedu挂载到/mnt/nfs

推荐使用

mount -t nfs -o soft,timeo=1  192.168.179.100:/data/jfedu /mnt/nfs soft:

软挂载,遇到报错会终止挂载,并返回信息,默认是硬挂载,一直尝试挂载。

timeo: 超时时间,如果不设置,一直链接,可以设置小点

 

[root@localhost ~]# df  --查看挂载是否成功

Filesystem                  1K-blocks    Used Available Use% Mounted on

192.168.179.100:/data/jfedu  25164800 1575808  23588992   7% /mnt/nfs

 

测试


[root@localhost ~]# cp /etc/fstab /data/jfedu/  --在服务端将fstab copy到共享目录

 

[root@localhost ~]# cd /mnt/nfs/  --客户端查看共享目录的fstab

[root@localhost nfs]# ls

fstab

[root@localhost nfs]# cat fstab

 

[root@localhost nfs]# touch a.txt --来自nfs提示,客户端不能创建文件,因为在nfs的exports文件里面只设置了读权限

touch: cannot touch ?..txt?. Read-only file system

 

[root@localhost ~]# vim /etc/exports --修改服务端配置文件

/data/jfedu 192.168.179.0/24(rw,sync)

[root@localhost ~]# exportfs -r --服务端重新加载配置文件

[root@localhost nfs]# touch a.txt  --来自文件系统提示,客户端发现权限还是不够

touch: cannot touch ?..txt?. Permission denied

 

怎么解决?

(1)服务端单独创建一个目录,授予该目录rwx权限

[root@localhost nfs]# ls -ld /mnt/nfs/   --可以看到客户端的nfs目录只有r-w权限,但是客户端的身份相当于nfsnobody,被压缩了相当于others
drwxr-xr-x 3 root root 44 Apr 13  2020 /mnt/nfs/

[root@localhost nfs]# chmod o+w /mnt/nfs/  --客户端修改该目录的权限就可以在该目录下创建文件了

或者

[root@localhost jfedu]# mkdir test  --在服务端共享目录里单独创建一个目录如test

[root@localhost jfedu]# chmod o+w test/ --修改权限,那么这个目录共享给服务端可以让服务端root用户在里面自由活动

[root@localhost nfs]# cd test/  --客户端进入服务端创建的test目录

[root@localhost test]# touch a.txt  --看到可以正常创建文件

[root@localhost test]# echo a > a.txt  --可以对文件进行修改

[root@localhost test]# ll     --可以看到客户端的身份是nfsnobody的身份

total 4 -rw-r--r--. 1 nfsnobody nfsnobody

(2)找到根源,为什么客户端root用户不能对服务端提供的目录里面文件进行操作,因为是虽然使用root用户去挂载了,但是身份被压缩了,是others

[root@localhost jfedu]# exportfs -v  --客户端执行,查看配置信息

/data/jfedu    192.168.179.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

root_squash:如果客户端用root身份访问,则被压缩成nobody,权限也将受到限制。

no_root_squash:也就是不压缩,客户端使用root身份登录,全有所有权限,很危险。

all_squash:不管访问者是什么身份,包括root,全部压缩至匿名用户。

no_all_squash:保留访问用户的身份uid以及gid,一般只能查看,不能修改,权限问题,但是可以强制保存。

可以看服务端root_squash参数使得客户端root用户身份被压缩了为nfsnobody,所以对目录没有权限Permission denied

 

[root@localhost jfedu]# vi /etc/exports  --修改服务端配置解决问题

/data/jfedu 192.168.179.0/24(rw,sync,no_root_squash)

[root@localhost jfedu]# exportfs -r

 

[root@localhost nfs]# cd  /mnt/nfs/  --客户端再去重新测试,可以看到正常了,最好不要使用这个参数,权限太大,可以删除共享出去所有的文件

[root@localhost nfs]# touch a.txt

[root@localhost nfs]# ll a.txt  --可以看到是管理员身份创建的

-rw-r--r--. 1 root root 0 Mar  2 16:43 a.txt

 

最后说一下no_all_squash参数


[root@localhost jfedu]# cat /etc/exports --服务端配置

/data/jfedu 192.168.179.0/24(rw,sync,root_squash,no_all_squash)

[root@localhost jfedu]# exportfs  -r

 

[root@localhost nfs]# su - jerry  --客户端切换普通用户

[jerry@localhost ~]$ cd /mnt/nfs/test

[jerry@localhost test]$ touch b.txt

[jerry@localhost test]$ ll b.txt --可以看到保留了当前用户的身份

-rw-rw-r--. 1 jerry jerry0 Mar  2 17:07 b.txt

 

卸载


[root@localhost ~]# umount.nfs4 /mnt/nfs/

umount.nfs4: /mnt/nfs/: device is busy

umount -l /mnt/jfedu 强行解除挂载

或者使用(这个命令容易变为背锅侠,慎用!!!!!!!!!!!!!)

fuser -m /mnt/data 将会显示使用这个模块的pid

fuser -mk /mnt/data 将会直接kill那个pid

 

客户端希望NFS文件共享服务一直有效开机自动挂载,需要修改fstab

[root@localhost ~]# tail -1 /etc/fstab

192.168.179.100:/data/jfedu  /mnt/nfs  nfs defaults        0 0

 

NFS里面最需要注意的就是第一个是共享出去目录的权限,其次是在客户端访问的时候身份是会被压缩的,被压缩了为nfsnobody,这样对于共享出去目录对应于others,要注意这方面的权限问题。