博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NFS详解
阅读量:5816 次
发布时间:2019-06-18

本文共 3805 字,大约阅读时间需要 12 分钟。

一、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.png

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查看
[root@wolf ~]# 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共享的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@wolf ~]
# 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     

本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/2065232,如需转载请自行联系原作者

你可能感兴趣的文章
定时任务的创建
查看>>
实战Django:小型CMS Part2
查看>>
原创]windows server 2012 AD架构试验系列 – 16更改DC计算机名
查看>>
统治世界的十大算法
查看>>
linux svn安装和配置
查看>>
SSH中调用另一action的方法(chain,redirect)
查看>>
数据库基础
查看>>
表格排序
查看>>
关于Android四大组件的学习总结
查看>>
java只能的round,ceil,floor方法的使用
查看>>
由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件...
查看>>
新开的博客,为自己祝贺一下
查看>>
puppet任务计划
查看>>
【CQOI2011】放棋子
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
一周总结
查看>>
将txt文件转化为json进行操作
查看>>
线性表4 - 数据结构和算法09
查看>>
C语言数据类型char
查看>>
Online Patching--EBS R12.2最大的改进
查看>>