基础知识篇
NFS是Network File System的简称,它的目的想让不同的机器,不同的操作系统可以彼此共享数据文件。
1、它需要启动PRC+NFS服务,需首先启动RPC,然后启动NFS
2、RPC的作用是将服务器中注册的NFS的port number通知给client
3、NFS的端口号一般为2049,但不确定,原因是文件系统较为复杂。它用来传输的端口是随机选择且小于1024
一、NFS的文件访问权限
1、NFS Server/NFS Client刚好有相同的账号与用户
此时用户可以直接以zj(假定为客户端的普通账号)的身份访问服务器所提供的共享文件系统
2、NFS Server的501这个UID账号对应为yf(假定为服务端的一个普通账号)
如果客户端的ql(假定为客户端的另一个普通账号)恰好对应服务器端的yf,则客户端的ql可以访问服务器端的yf,只因为两者拥有相同的UID。但用户名不相同,所以ql只会以匿名的方式访问yf(可参考补充部分的内容)。提到了这里你可能会想到,那root的UID不都为0吗?这样一来客户端的权限不是很大。然而结果不是这样的。服务器端默认会将客户端的root用户压缩为匿名用户
3、如果用户身份是root
在默认的情况下,root的身份会被主动压缩成为匿名用户
4、NFS Server并没有501这个UID
此种情况的后果是服务器端将UID为501的这个用户压缩为匿名用户,以匿名用户的身份访问服务器
具备了以上四种条件后,还应该具备以下二种条件
1、NFS服务器已经开放可写入的权限(与/etc/exports文件有关)
2、实际的文件权限具有可写入(w)的权限
总结下来无非此三句话
1、UID与账户的相关性
2、NFS服务器允许写入的权限
3、文件系统确实具有w的权限,此时你才具有该文件的写入权限
二、/etc/exports配置文件的语法与参数
值得一提的是NFS会直接使用到内核功能,所以内核必须要支持NFS才行。使用uname -r查看其版本
配置文件权限参数
sync 代表数据会同步写入到内存与硬盘中,此种方式速度过慢
async 代表数据会先暂时存放在内存中然后保存在硬盘上,此种方式速度较快
no_root_squash 不将客户端中的root用户压缩为nfsnobody(匿名用户)
root_squash 将客户端中的root用户压缩为nfsnobody(匿名用户)
all_squash 无论是什么用户都将被压缩成为nfsnobody(匿名用户)
anonuid 指的是UID,可以自行指定该值,但必须存在
anongid 指的是UID,可以自行指定该值,但必须存在
三、mount命令主要参数
suid/nosuid 当挂载的分区上面有任何SUID的二进制程序时,只要使用nosuid就能够取消其功能
rw/ro 提供客户端可写/可读的权限
dev/nodev 是否可以保留设备文件的特殊功能
exec/noexec 是否具有执行二进制文件的权限,视具体的情况而定
user/nouser 是否允许用户进行文件的挂载与卸载操作,最好不允许
auto/noauto 指的是mount -a时,会不会被挂载到项目
注:加粗为默认值
四、额外的NFS挂载功能
fg/bg:指定挂载的行为为fg(前台)还是bg(后台)
soft/hard :当某台主机脱机时RPC的呼叫方式soft(重复呼叫)、hard(持续呼叫)
intr:它与上面的hard连用,加此参数,当RPC持续呼叫时,该次呼叫是可以被中断的
rsize/wsize :rsize(读出)与wsize(写入)的区块大小,它影响着C/S传输数据的缓冲记忆容易(两者的值均为1024)
注:加粗为默认值
五、无法挂载的原因分析
1、客户端的主机名或IP网段不允许被使用
2、服务器或客户端某些服务未启动
3、被防火墙拦截
实验配置篇
基本配置:
1、服务端的配置 [root@web1 ~]#mkdir /shared [root@web1 ~]#vim /etc/exports /shared 172.16.0.11(rw) [root@web1 ~]#service nfs restart [root@web1 ~]#service iptables stop [root@web1 ~]#setenforce 0
2、客户端的配置 [root@web2 ~]#mkdir /mnt/nfs [root@web2 ~]#service iptables stop [root@web2 ~]#setenforce 0 [root@web2 ~]#mount -t nfs 172.16.0.10:/shared /mnt/nfs [root@web2 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on 172.16.0.10:/shared 10190208 470144 9195776 5% /mnt/nfs
3、结果验证 [root@web1 ~]#cp /etc/inittab /shared [root@web2 ~]#ls /mnt/nfs inittab
匿名访问的情况:
gnnt.web1.com:服务器 gnnt.web2.com:客户端 1、开放匿名访问的情况 [root@web1 ~]#groupadd -g 45 nfsanon [root@web1 ~]#useradd -u 45 -g nfsanon nfsanon [root@web1 ~]#mkdir /public [root@web1 ~]#setfacl -m u:nfsanon:rwx /public [root@web1 ~]#getfacl /public getfacl: Removing leading '/' from absolute path names # file: public # owner: root # group: root user::rwx user:nfsanon:rwx group::r-x mask::rwx other::r-x [root@web1 ~]#vim /etc/exports /public *.gnnt.com(rw,all_squash,anonuid=45,anongid=45) [root@web1 ~]#exportfs -arv #保存配置文件,不用重启也可生效 #-a:全部挂载或卸载/etc/exports文件中的设置 #-r:重新挂载/etc/exports里面的设置,此外,也同步更新/etc/exports及/var/lib/nfs/xtab内容 #-v:在export的时候,将共享的目录显示到屏幕上 #-u:卸载某一目录
2、显示exports共享信息 [root@web1 ~]# showmount -e localhost #显示exports所共享的目录数据,常用于客户端 Export list for localhost: /public *.gnnt.com /tmp 172.16.0.11 /shared 172.16.0.11
3、查看etab文件 [root@web1 ~]# cat /var/lib/nfs/etab /tmp172.16.0.11(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534) /shared172.16.0.11(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534) /public*.gnnt.com(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=45,anongid=45)
4、查看NFS开启哪些端口 [root@web1 ~]# netstat -tulnp|grep -E '(rpc|nfs)'
5、查看本机rpc服务注册情况 [root@web1 ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 53456 status 100024 1 tcp 51270 status 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad 100005 1 udp 60789 mountd 100005 1 tcp 52694 mountd 100005 2 udp 48954 mountd 100005 2 tcp 53781 mountd 100005 3 udp 40201 mountd 100005 3 tcp 34867 mountd 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 2 tcp 2049 nfs_acl 100227 3 tcp 2049 nfs_acl 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 2 udp 2049 nfs_acl 100227 3 udp 2049 nfs_acl 100021 1 udp 35388 nlockmgr 100021 3 udp 35388 nlockmgr 100021 4 udp 35388 nlockmgr 100021 1 tcp 58204 nlockmgr 100021 3 tcp 58204 nlockmgr 100021 4 tcp 58204 nlockmgr
6、检查相关软件版本信息(仅查看TCP数据包) [root@web1 ~]# rpcinfo -t localhost nfs program 100003 version 2 ready and waiting program 100003 version 3 ready and waiting program 100003 version 4 ready and waiting
补充
服务器端与客户端UID不一致时的结果:
[root@web1 ~]# cat /etc/passwd|grep yf yf:x:500:500:yf:/home/yf:/bin/bash [root@web2 ~]# cat /etc/passwd|grep ql ql:x:500:500::/home/ql:/bin/bash [root@web2 ~]# ll /mnt/nfs1 total 8 -rwxr-xr-x. 1 nobody nobody 6878 Aug 15 16:54 nfs #因为使用的root用户,默认情况下将客户端的root用户压缩为匿名用户 [root@web2 ~]# su - ql [ql@web2 ~]$ ll /mnt/nfs1 total 8 -rwxr-xr-x. 1 nobody nobody 6878 Aug 15 16:54 nfs #UID同为500的不是同一个用户,所以将ql压缩为匿名用户
至此,本文档已经结束,文档中难免有不尽人意之处,希望各位能够给出宝贵的建议,谢谢!
紫禁之巅
2015年8月28日 17:50