NFS详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFS详解相关的知识,希望对你有一定的参考价值。

一、NFS工作原理
VFS:VFS的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。在古老的DOS操作系统中,要访问本地文件系统之外的文件系统需要使用特殊的工具才能进行。而在Linux下,通过VFS,一个抽象的通用访问接口屏蔽了底层文件系统和物理介质的差异性。
nfs:network file system,Sun,Unix-like
    NFS:也是服务,内核级fs    
PC:procedure call //过程调用
FC:function //函数调用,一般有结果返回,但是过程调用就不一定来的
    RPC:remote procedure call //远程过程调用
        //只要客户端支持rpc就可以挂载
linux支持众多的文件系统,但是对于用户来说看到的都是一样的
    因为vfs:用户空间进程只需要和vfs交互,其他的由vfs负责和各种fs交互
    
=======================================    
        用户
——————————————————————————vfs
    nfs,等各种文件系统
如图:
技术分享图片

1、首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能的询问请求,这时NFS客户端(即执行程序的服务器)RPC服务(portmap 或rpcbind服务)就会通过网络向NFS服务端的RPC服务(即portmap或rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
2、NFS服务端的RPC服务(即portmap或rpcbind服务)找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务(即portmap或rpcbind服务)。
3、此时NFS客户端就可获取到正确的端口,然后就直接与NFS daemon联机存取数据了。
4、NFS客户端把数据存取成功后,返回给前端程序,告诉用户存取结果,作为网站用户,我们就完成了一次存取操作。
    
最终权限取决于:
    访问文件的权限:取决于:运行该进程的用户属主-属组-其他人
    但是远程s又不可能获知本地用户的权限
情景1:
    c:有用户centos(1001)   S:用户fedora(1001)
    centos在本地nfs共享目录中创建的文件,看到的是属主是centos
    fedora看到的是自己创建的,因为系统根据用户id来进行名称解析
root_squash:压缩root用户权限,以root用户来访问的时候,降级身份为nfsnobody //来宾账号
all_squash:全部都压缩为nfsnobody    
    nfsv2,nfsv3,nfsv4

nfsd:监听在一个套接字端口:tcp/2049,基于RPC工作
    nfs不能实现身份认证,
    rpc.mountd进程:验证用户是否有权限来进行mount
    rpc.lockd:[施加锁,并将锁状态信息通知给其他主机]加锁,写的时候独占锁,防止同一文件多个用户同时写入,读用的是共享锁,读的时候不允许别人修改,但是允许读
    rpc.statd:保存文件的状态信息,应对突发情况
rpc监听的大多数端口都是半随机的,例如rpc.mountd在启动的时候,先向本地的rpc服务注册某一端口,由rpc_server端帮忙挑选一个空闲端口
    client请求s的rpc服务端,获取rpc.mount端口信息,然后client再访问s的rpc.mount的端口
    rpc服务端的端口是固定的
    rpcbind监听端口111 ;lsof -i:111查看
[[email protected] ~]# rpcinfo -p localhost //查看rpcbind服务已经启用了对NFS服务的映射

    
二、安装    
假如局域网内提供一个中心认证主机负责用户信息的认证,例如nis,kerberous等,这样就不会存在用户权限错乱的问题了
实现:
yum -y install nft-utils //nfs是内核级服务,不需要服务端
rpm -ql nfs-utils //有一大堆的unit文件
systemctl start rpcbind //先启动这个服务
systemctl start nfs.service
mkdir /data //建议独立提供一个分区,
vim /etc/exports
    /data  192.168.4.109(rw)
强烈不建议重启,因为可能某一用户正在写入
exportfs -r //重新导出文件系统,让内核重读/etc/exports    
client:
    showmount -e 192.168.4.118
    mkdir /web/thml  -p //建立本地挂载点
    mount -t nfs 192.168.4.118:/data /web/thml/
    cd /web/html/
    touch aa //不能创建文件,root用户会被rootsquash-->nfsnobody权限压缩
权限测试
    useradd -u 1111 user1 //s端
    useradd -u 1111 user2 /c端
    setfacl -m u:user1:rwx /data //s修改目录权限
    su user2  //c
    touch aa //c ;将能顾创建目录
    ls -l //在s上看到是user1为属主,在c上看到是user2属主
    
导出的fs的格式:
    /path/to/somedir  Ip(export opt1,opt2) Ip(opt1,opt2)
选项:/etc/exports
    Machine Name Formats:
        单个主机:ipv4,ipv6,FQDN
        网络:address/netmask,address/prefix
        通配符: 主机名通配,*.mt.com, “*”:任意长度任意字符,“?":任意单个字符
        网络组:NIS域内的主机组,@组名
        匿名:使用*通配所有客户端
    General Options
        rw:读写 //服务读写权限和fs读写权限都要满足才可以
        sync:同步写入,立即写入才返回成功
        async:异步写入,提高读写性能,但是可能会导致数据丢失
        root_squash:压缩root权限,默认就启用了
        no_root_squash:明确不压缩,很不安全
        all_squash:压缩所有用户,所有用户都被映射成nfsnobody
        anonuid:映射成指定的用户账号的uid
        anongid:映射成指定的用户账号的gid
        ro:read-only
    /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)        
    /mydata/data    192.168.4.0/26(rw) *(ro,allsquash) //4.0网段内的主机及是rw,其他的任何主机都是ro,而且压缩为nfsnobody
        
    showmount:
        -e IP //查看s共享的目录

[[email protected] ~]# ps -ef |egrep "rpc|nfs"
root      3483     2  0 17:28 ?        00:00:00 [rpciod/0]
rpc       3590     1  0 17:31 ?        00:00:00 rpcbind
root      3635     1  0 17:31 ?        00:00:00 rpc.rquotad        //磁盘配额进程
root      3640     1  0 17:31 ?        00:00:00 rpc.mountd         //权限管理验证
root      3647     2  0 17:31 ?        00:00:00 [nfsd4]
root      3648     2  0 17:31 ?        00:00:00 [nfsd4_callbacks]
root      3649     2  0 17:31 ?        00:00:00 [nfsd]
root      3650     2  0 17:31 ?        00:00:00 [nfsd]
root      3651     2  0 17:31 ?        00:00:00 [nfsd]
root      3652     2  0 17:31 ?        00:00:00 [nfsd]
root      3653     2  0 17:31 ?        00:00:00 [nfsd]
root      3654     2  0 17:31 ?        00:00:00 [nfsd]
root      3655     2  0 17:31 ?        00:00:00 [nfsd]
root      3656     2  0 17:31 ?        00:00:00 [nfsd]
root      3687     1  0 17:31 ?        00:00:00 rpc.idmapd    //名称映射
root      3799  2717  0 17:48 pts/0    00:00:00 egrep rpc|nfs

man exports 最后有示例

注:由于是nfs,因此在挂载的时候可以指定其缓冲区的大小
    mount.nfs    

以上是关于NFS详解的主要内容,如果未能解决你的问题,请参考以下文章

nfs详解

NFS配置详解

NFS详解

NFS配置详解

NFS文件系统详解

详解NFS-----共享存储服务