简介:
NFS:network file systerm,即网络文件系统
网络文件系统是FreeBSD支持的文件系统的一种,NFS允许一个系统在网络上与他人共享目录和文件。

NFS 有属于自己的协议与使用的端口号,但是在数据传送或者其它相关讯息传递的时候, NFS 使用的则是一个称为远程过程调用( Remote Procedure Call, RPC )的协议来协助 NFS 本身的运作!

NFS于RPC之间的关系可以简单的理解为:NFS主要在管理分享出来的目录,而至于资料的传递,就直接将其交送给RPC协议去运作了。


RPC服务:监听在TCP/UDP协议的111号端口

NFS协议具有很多版本:
在NFSv3中添加了kerberos协议(kerberos:加密帐号信息,使认证过程安全)
V4相对V3的改进:
1:改进了INTERNET上的存取和执行效能
2:在协议中增强了安全方面的特性
3:增强的跨平台特性


NFS运行机制:
NFS运行时需要调用五个后台进程:
nfsd
rpc.quotad对nfs文件系统启动配额功能
rpc.nfsd管理clinet是否有权限登录,以及判别登录者的uid等;
rpc.mountd读取/etc/exports的权限,对文件访问权限进行控制;
rpc.lockd文件的互斥锁,保证文件在同一时间只有一个人访问,需要nfslockd服务;
rpc.statd检查文件的一致性,需要nfslockd服务。


由于NFS的功能日益完善,逐渐被引进了Linux的内核,也就是说,NFS其实是内核中的一个功能,只要我们内核启用了该项,那么我们就可以使用NFS,但是要配置该功能,就需要一个应用接口,也就是需要安装一个用户空间一个工具,而这个工具就是nfs-utils,需要安装这样一个

NFS控制权限机制:
在Linux的文件都有各自的权限,以及属主和属组,当NFS服务器上某个用户共享了一个文件,当客户端挂载了该文件,放客户端上的用户来访问该文件时其权限应该参考其UID号,这是由于NFS并不认证用户,指认证UID,当客户端访问共享文件时,如果其UID恰好等于服务器端共享该文件的用户的UID,那么其权限就是属主的权限
但是其最终权限取决于文件系统权限和共享权限交集
即:当用户共享权限是:ro
文件系统权限是:rw
即使客户端的用户被识别为属主,但是由于最终权限的规则,其权限并不是rw,而是ro


另外一种特殊情况:当服务器端root共享了文件系统,当客户端上的root挂载了该文件系统,由于NFS只映射UID,所以其被识别为本机的root,那样客户端上的root被识别在服务器上的root,那样就在服务器端没有任何限制,那样是十分危险的,所以共享文件时一定不能使用root用户的身份去共享文件
而正是由于这种特殊情况,NFS引入了一种共享属性:no_root_squash,即当客户端的root来进行共享使用服务器端root共享的文件时,则会被认为是nobody用户,其权限十分的少。


NFS配置:
NFS监听在TCP/UDP的2049端口
无论在服务器端还是客户端都需要安装:nfs-utils这个rpm包

启动服务:
#service nfs start

配置文件:
/etc/exports
格式:FILESYSTEM    Clientlist(共享属性) Clientlist(共享属性)

共享属性:
ro:只读
rw:读写
async:异步写入
sync:同步写入
root_squash:将root用户映射为nobody
no_root_squash:不将root用户映射为nobody
all_squash:所有的用户都映射为nobody


客户端列表格式:

1.单个主机:FQDN或者IP
2.通配符,如:*.example.com
3.IP的网络地址


例如:

  1. /vhosts  172.16.4.10/16(rw)      对172.16.4.10以读写权限共享/vhosts 
  2. '/a b' 172.16.4.10/255.255.0.0(rw)        对172.16.4.10以读写权限共享/a b 
  3. /vhosts  *.coolinuz.com(ro)        对coolinuz.com域内以只读方式共享/vhosts 


注:如果共享的文件系统名中有空格,则需要将其用''引起来。


重读配置文件:
exportfs
    -a:所有
    -r:重新导出所有的
    -u:关闭某个共享的文件系统
    -v:显示详细信息

#exportfs -rv
#exportfs -arv
#exportfs -u 172.16.0.0/16:/mydata



showmount:用于查看主机上的共享
    -e:查看共享的内容
    -a:查看服务器已经被挂载的文件系统
    -d:显示主机上被共享的曾经被挂载的文件系统

#showmount -e 172.16.4.1
#showmount -a 172.16.4.1
#showmount -d 172.16.4.1


客户端挂载:
#mount -t nfs 172.16.4.1:/vhosts /mnt/nfs