1、NFS的几个概念

RPC(Remote Procedure Call Protocol远程过程调用协议):

简单的说是函数调用(远程主机上的函数) 一部分功能由本地程序完成 另一部分功能由远程主机上的函数完成。客户端挂载了nfs服务器的文件系统时,进行一些操作,但是这些操作服务端如何知道呢??这可是在内核级别上实现协议。RPC就解决了这个问题,它会将客户端的操作的函数调用发送到服务器端,由服务器端执行这些函数调用。

idmapd:

想想这种情形,nfs客户端在挂载文件系统以后,在本地以某用户的身份创建了一个文件,在服务器端这个文件的属主和属组是哪个用户呢?早期是通过NIS(Network Information Services网络信息服务)来解决这个问题的,但是在传输账号和密码时,使用的是明文传输,现在使用LDAP+clbbler来实现的。但是,NFS使用的是idmapd这个服务,有rpc提供,将所有的用户后映射为nfsnobody,但是在访问的时候,还是以本地UID对应的本地用户来使用的。

mounted:

NFS是通过什么来控制那些客户端可以访问,那些不可以访问的呢?NFS只支持通过IP来控制客户端,而这个功能是由守护进程mounted来实现的,它监听的端口是半随机的。所谓的半随机指的是,这个随机端口是由rpc服务来决定的,而rpc是通过随机的方式。作用等等同于小区大门保安的作用。

2、NFS请求过程

在CentOS6.5中,NFS服务端监听在tcp和udp的2049端口,服务名是nfs、pc监听于tcp和udp的111号端口,服务名是portmapper。

请求过程:当客户端试这去挂载使用nfs共享的文件系统是,客户端首先回去与postmapper(tcp/111)端口去注册使用,此时postmapper会随机分配一个端口给mounted,然后mounted这个守护进程会来验证客户端的合法性,验证通过后,会把请求交给nfs服务,客户端此时可以挂载使用了,用户在创建文件时,会使用到idmapd的守护进程来映射属主。其实idmapd也是有rpc服务提供的,只不过在这里,nfs服务使用到用户映射的功能时,会自动的去调用此守护进程。

========================================================================================================================

3:原理

nfs服务器主要端口是2049,早期是同时启动1024以下的端口来响应客户机。现在端口很大

nfs服务器启动随机获取端口,并rpc注册,所以rcp就知道NFS的端口了。

rpc 同时使用固定端口111来监客户端需求,同时把知道的正确nfs端口发给客户。

客户机和nfs 直接联系了

 

4权限

1NFS server和 NFS client 刚好用相同的帐号和群组。这时可以直接存取

 (2) NFS server和NFS client  UID 正好相同,用户名不同, 可以存取,但有危险性

(3)当NFS server 没有相对应的UID时,NFS client会被压缩成匿名用户nfsnobody。也有例外,就是当NFS server 共享目录为/tmp时,NFS client用户建立的资料会变成无拥有者

(4) NFS client root 用访问时,会压缩成匿名者

 

5NFS服务器配置权限要点:

  (1)服务器/etc/exports 里权限设定用关

  (2)共享的目录实际权限,也就是目录本身可写

  (3)使用者的UID身份

 

6:配置文件

# yum install rpcbind nfs-utils

 

/usr/sbin/rpc.mountd

/usr/sbin/rpc.nfsd

 

/etc/exports        共享的目录和权限

/usr/sbin/exportfs  服务器端维护共享资源的指令

 

/var/lib/nfs/etab   记录NFS共享目录的权限设定值

/var/lib/nfs/xtab   记录NFS相关的科技机连接数据

 

/usr/sbin/showmount  客户端查看共享资源的指令 

 

 

# /etc/rc.d/init.d/rpcbind start

# /etc/rc.d/init.d/nfs start

[root@centos ~]# /etc/rc.d/init.d/nfs start

Starting NFS services:                                     [  OK  ]

Starting NFS mountd:                                       [  OK  ]

Starting NFS daemon:                                       [  OK  ]

Starting RPC idmapd:                                       [  OK  ]

  

7:共享目录配置文件:

/etc/exports:

文件系统  客户机(权限)  客户机(权限)  客户机(权限)          

      注意客户机:可以是IP ,网段,主机名

      权限:rw 读写       ro 只读  

            sync(同步)  async(异步)

            no_root_squash (不压缩root) root_squash(压缩root)

            all_squash (统统压缩为nfsnobody

            anonuid (匿名的uid) anongid (匿名的gid

 

测试:

NFS 服务器 : 

# useradd -u 600 test

# mkdir -pv /web/www

# setfacl -m u:test:rwx /web/www/

# vim /etc/exports 

/web/www 192.168.2.20(rw) 192.168.2.0/24(rw)

 

NFS 客户端:

# useradd -u 600 test

 

# showmount -e 192.168.2.34  

Export list for 192.168.2.34:

/web/www 192.168.2.0/24

 

# mkdir /mnt/nfs

# mount -t nfs 192.168.2.34:/web/www /mnt/nfs/

 

 

匿名用户登录后 建立文件uid gid 都为601.并可以读写

[root@centos ~]# groupadd -g 601 nfsanon

[root@centos ~]# useradd -u 601 -g nfsanon nfsanon

[root@centos ~]# mkdir /nfs/linux -pv

[root@centos ~]# setfacl -m u:nfsanon:rwx /nfs/linux/

[root@centos ~]# cat /etc/exports 

/web/www 192.168.2.20(rw) 192.168.2.0/24(rw)

/nfs/linux 192.168.2.0/24(rw,all_squash,anonuid=601,anongid=601)

[root@centos ~]# exportfs -ar

 

# exportfs -ar : 重新到出所有的文件系统

# exportfs -au: 关闭到处的所有文件系统

# rpcinfo -p   查看监听的端口

 

小知识:开机挂载时/etc/fstab

server:/path/  /mount_point   nfs  defaults,_netdev 0 0  

                                               _netdev 是跳过网络检查

常用命令

showmount是用来查看nfs服务的情况

用法:showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

可以使用短选型,也可以使用长选项。

-a :这个参数是一般在NFS SERVER上使用,是用来显示已经mount上本机nfs目录的cline机器。   
-e :显示指定的NFS SERVER上export出来的目录。
 

exportfs:一般用在当NFS服务启动后,使用此命令来控制共享目录的导出

用法:exportfs [-aruv] 
-a :全部mount或者unmount /etc/exports中的内容 
-r :重新mount /etc/exports中分享出来的目录 
-u :umount目录 
-v :在export的时候,将详细的信息输出到屏幕上。 
具体例子: 
# exportfs -au 卸载所有共享目录 
# exportfs -rv 重新共享所有目录并输出详细信息

客户端的使用

先使用 showmont -e SER_NAME 来发现服务端的共享的目录

然后使用mount挂载使用,格式:

mount -t nfs SER_NAME:/data /parth/to/someponit [-o 选项]

mount -t nfs 192.168.1.99:/mydat /mnt -o rsize=4096

rsize 的值是从服务器读取的字节数。wsize 是写入到服务器的字节数。默认都是1024, 如果使用比较高的值,如8192,可以提高传输速度。