基础知识篇

  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