参考文档:http://blog.51cto.com/atong/1343950
NFS介绍
1.什么是NFS
NFS是Network File System 的缩写,中文意思是网络文件系统。它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如Web)可以通过挂载(mount)的方式将NFS服务端共享的数据目录挂载到NFS客户端本地系统中。从客户端本地看,NFS服务端的共享目录就好像是客户端自己的磁盘分区或目录一样,而实际上却是远端的NFS服务器目录。
2.什么是RPC
NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据就要有想对应的网络端口来进行传输。NFS服务器到底使用什么网络端口来传输数据的,NFS服务器端其实是随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS服务器时通过远程过程调用(remote procedure call 简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口来进行数据的传输。
RPC和NFS如何通讯
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口。RPC就会记录下这些端口。并且RPC会开机111端口,等待客户端RPC的请求,如果客户端有请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。
注意:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
NFS安装
系统环境:
##服务端
#yum install nfs-utils rpcbind -y
#/etc/init.d/rpcbind start #启动rpcbind服务
#/etc/init.d/rpcbind status
#/etc/init.d/nfs start #启动nfs服务
#/etc/init.d/nfs status
#mkdir -p /tmp/nfs_test/
#chown -R nfsnobody.nfsnobody /tmp/nfs_test/
#vi /etc/exports #修改配置文件
#exportfs -rv #或/etc/init.d/nfs reload
#showmount -e localhost #在NFS服务本地查看挂载情况
#cat /var/lib/nfs/etab 查看NFS Server配置问的参数
客户端: yum install rpcbind -y
为了使用showmount等功能,所有客户端最好也要安装NFS软件,但是不启动NFS服务。
#/etc/init.d/rpcbind start
#showmount -e 192.168.0.198 #查看nfs服务端共享
#mount -t nfs 192.168.0.198:/tmp/nfs_test/ /mnt/
#df -h
NFS的文件权限
NFS服务本身没有身份验证的功能,权限是遵循共享目录在NFS服务器上的权限设置,而且只识别UID和GID。如果访问者的UID与/share在nfs server上的权限一致,那么访问者就有可能拥有与该用户相同的权限,这还要取决于/share设置共享时所分配的权限;如果访问者的uid对应了NFS服务器上的另一个用户,则访问者就对应拥有other权限,但是否能够完全对应用other权限也要取决于/share的共享权限;如果访问者的uid恰好在NFS服务器上不存在,则服务器用自动将其压缩成为匿名用户,其uid为65534
由于在绝大部分Linux系统中root用户的uid为0,也就是说客户端可以轻易的获得NFS的root权限来访问共享目录,这样是极不安全的,所以NFS默认会将root的身份压缩成匿名用户。
NFS的推荐配置
上面提到的,客户端挂载了共享目录后,其权限受一下3部分的影响:
- exports文件定义的权限
- /share所在nfs server的本地用户权限
- 匿名用户的权限
为了解决权限繁杂的问题,统一在exports文件中定义使用匿名用户(all_squash),并设置权限来进行权限管理,统一入口:
## nfs服务端配置
# cat /etc/exports
/data/tools/nfs 192.168.0.230(rw,sync,all_squash) 192.168.0.232(rw,all_squash)
# chown -R nfsnobody.nfsnobody /data/tools/nfs
all_squash, 将所有访问NFS的用户身份全部压缩成为匿名用户
一个有读写权限,一个为只读权限
最后设置共享目录的所有者和所属组都为nfsnobody
## 230服务器上用写入权限
$ touch a b
$ ll
total 16
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 19 19:20 a
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jan 19 2020 b
drwx------ 2 nfsnobody nfsnobody 16384 Jan 19 17:12 lost+found
## 231服务器上为只读权限
$ touch a
touch: cannot touch ‘a’: Read-only file system
补充
常用权限参数:
rw:可读可写;
ro:只读;
root_squash:将root用户压缩成为匿名用户(默认选项);
no_root_squash:访问共享目录时保持root用户身份;
all_squash:将所有访问NFS的用户身份全部压缩成为匿名用户;
sync:将数据同步写入到内存和硬盘中;
async:将数据暂存于内存中。
anonuid:指定匿名访问用户的UID;
anongid:指定匿名访问用户组的GID。