🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Network File System是一个文件系统,而 RPC(Remote Procedure Call)是负责负责信息的传输。 ## 服务说明 nfs v3 * nfsd 它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器; * mountd 它是RPC守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。 * portmap 主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。 Client 先和 RPC Server 链接,再和程序通信,程序在本地操作,调用内核。 NFS:由sun开发,版本NFSv1,NFSv2,NFSv3(rhel 5),NFSv4(rhel 6) CentOS 7.4 以后,支持 NFS v4.2 不需要 rpcbind 了,但是如果客户端只支持 NFC v3 则需要 rpcbind 这个服务。 ### 局限性 * 只能控制来源ip,只验证UID,不验证用户名,安全性较低; * NFS只能工作于linux和unix ## 服务器端 ```bash # centos 5 yum -y install nfs-utils portmap # centos 6/7 (在CentOS 6.3当中,portmap服务由rpcbind负责) yum -y install nfs-utils ``` ## NFS的常用目录 ``` /etc/exports            NFS服务的主要配置文件 /usr/sbin/exportfs      NFS服务的管理命令 /usr/sbin/showmount     客户端的查看命令 /var/lib/nfs/etab       记录NFS分享出来的目录的完整权限设定值 /var/lib/nfs/xtab       记录曾经登录过的客户端信息 ``` ## @ centos 5 nfs启动3个进程 ``` nfsd(nfs服务), mountd(挂载), quotad(配额) nfsd: 2049/tcp, 2049/udp mountd: 端口 quotad: 端口 端口半随机的,可通过配置固定端口 portmap监听端口:111/tcp,udp/111 nfs要启动先要确保portmap服务先启动 # service portmap start ``` ### @ centos 7 ``` # service nfs start ``` ### 配置文件 /etc/exports 多个客户之间使用空白字符分隔 每个客户端后面必须跟一个小括号,里面定义了此客户访问特性,如访问权限等 ``` dir 172.16.0.0/16(ro,async) 192.16.0.0/24(rw,sync) ``` nfsv4默认映射到nfsnobody用户,也可以修改 ``` dir 172.16.0.0/16(ro,asyncfsid=root) 192.16.0.0/24(rw,sync,all_squash,anonuid= ,anongid=) ``` ### 文件系统挂载/导出属性 ``` ro: 只读。 rw: 读写 sync: 同步模式,内存中数据时时写入磁盘。 async: 不同步,把内存中数据定期写入磁盘中。 root_squash: 将root用户映射为来宾账号,限制权限,更加安全; no_root_squash: 加上这个选项后, root 用户就会对共享的目录拥有至高的权限控制,就像是对本机的目录操作一样。不安全,不建议使用 all_squash: 所有转换为来宾帐号 anonuid, anongid: 指定映射的来宾账号的UID和GID; ``` ## 查看 showmount ``` showmount -e|--exports NFS_SERVER: 查看NFS服务器“导出”的各文件系统 showmount -a|--all NFS_SERVER: 查看NFS服务器所被挂载的文件系统及其挂载的客户端对应关系列表 showmount -d|--directories NFS_SERVER: 显示NFS服务器所有导出的文件系统中被客户端挂载了文件系统列表 ``` ## 管理 exportfs 如果修改/etc/exports文件之后无需重启nfs,只需重新扫瞄一次文件/etc/exports,并且重新将设定加载即可; ``` -a:跟-r或-u选项同时使用,表示重新挂载所有文件系统或取消导出所有文件系统; -r: 重新导出 -u: 取消导出 -v: 显示详细信息 ``` * 重新挂载/etc/exports的设置:exportfs –avr * 全部卸载/etc/exports的设置:exportfs –avu ## 客户端 ``` yum install -y nfs-utils 客户端使用mount命令挂载 mount -t nfs NFS_SERVER:/PATH/TO/SOME_EXPORT  /PATH/TO/SOMEWHRERE 若挂载后速度较慢,可使用下面的选项 mount -t nfs -o nolock,nfsvers=3 192.168.24.111:/tmp/ /opt/ 默认nfsvers=4 ``` 让mountd和quotad等进程监听在固定端口,编辑配置文件/etc/sysconfig/nfs ## 客户端挂载参数 ~~~bash ro 以只读模式加载。 rw 以可读写模式加载。 sync 以同步方式执行文件系统的输入输出动作。 async 以非同步的方式执行文件系统的输入输出动作。 defaults 使用默认的选项。默认选项为rw、suid、dev、exec、anto nouser与async。 atime 每次存取都更新inode的存取时间,默认设置,取消选项为noatime。 noatime 每次存取时不更新inode的存取时间。 dev 可读文件系统上的字符或块设备,取消选项为nodev。 nodev 不读文件系统上的字符或块设备。 exec 可执行二进制文件,取消选项为noexec。 noexec 无法执行二进制文件。 auto 必须在/etc/fstab文件中指定此选项。执行-a参数时,会加载设置为auto的设备,取消选取为noauto。 noauto 无法使用-a参数来加载。 suid 启动set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位,取消选项为nosuid。 nosuid 关闭set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位。 user 普通用户可以执行加载操作。 nouser 普通用户无法执行加载操作,默认设置。 remount 重新加载设备。通常用于改变设备的设置状态。 rsize 读取数据缓冲大小,默认设置1048576(rhel6.6)。 wsize 写入数据缓冲大小,默认设置1048576(rhel6.6)。 fg 以前台形式执行挂载操作,默认设置。在挂载失败时会影响正常操作响应。 bg 以后台形式执行挂载操作。 hard 硬式挂载,默认设置。如果与服务器通讯失败,让试图访问它的操作被阻塞,直到服务器恢复为止。 soft 软式挂载。如果服务器通讯失败,让试图访问它的操作失败,返回一条出错消息。这项功能对于避免进程“挂”在无关紧要的安装操作上来说非常有用。 retrans=n 指定在以软方式安装的文件系统上,在返回一条出错消息之前重复发出请求的次数。 nointr 不允许用户中断,默认设置。 intr 允许用户中断被阻塞的操作(并且让它们返回一条出错消息)。 timeo=n 设置请求的超时时间(以十分之一秒为单位)。 ~~~ ## 固定端口 修改配置文件/etc/sysconfig/nfs 启用这几项,即可 ``` LOCKD_TCPPORT=32803 LOCKD_UDPPORT=32769 RQUOTAD_PORT=875 MOUNTD_PORT=892 ``` ## 防火墙规则添加 ``` proto port service tcp 111 portmapper udp 111 portmapper udp 892 mountd tcp 892 mountd udp 6478 status tcp 6478 status udp 875 rquotad tcp 875 rquotad tcp 2049 nfs udp 2049 nfs udp 32769 nlockmgr tcp 32769 nlockmgr ``` ## 客户端开机自动挂载NFS 编辑/etc/fstab,增加  192.168.8.40:/var/shared    /var/nfs    nfs    default,_rnetdev 0 0 _rnetdev,如果开机挂载不上此文件系统,则忽略,否则会开不了机 关于权限的分析 1. 客户端连接时候,对普通用户的检查 * a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户; * b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户; * c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody; 2. 客户端连接的时候,对root的检查 * a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root; * b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户; * c. 如果没有明确指定,此时root用户被压缩为nfsnobody; * d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;