简单的说是函数调用(远程主机上的函数) 一部分功能由本地程序完成 另一部分功能由远程主机上的函数完成。客户端挂载了nfs服务器的文件系统时,进行一些操作,但是这些操作服务端如何知道呢??这可是在内核级别上实现协议。RPC就解决了这个问题,它会将客户端的操作的函数调用发送到服务器端,由服务器端执行这些函数调用。
想想这种情形,nfs客户端在挂载文件系统以后,在本地以某用户的身份创建了一个文件,在服务器端这个文件的属主和属组是哪个用户呢?早期是通过NIS(Network Information Services网络信息服务)来解决这个问题的,但是在传输账号和密码时,使用的是明文传输,现在使用LDAP+clbbler来实现的。但是,NFS使用的是idmapd这个服务,有rpc提供,将所有的用户后映射为nfsnobody,但是在访问的时候,还是以本地UID对应的本地用户来使用的。
NFS是通过什么来控制那些客户端可以访问,那些不可以访问的呢?NFS只支持通过IP来控制客户端,而这个功能是由守护进程mounted来实现的,它监听的端口是半随机的。所谓的半随机指的是,这个随机端口是由rpc服务来决定的,而rpc是通过随机的方式。作用等等同于小区大门保安的作用。
在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:权限
(1)NFS 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 用访问时,会压缩成匿名者
5:NFS服务器配置权限要点:
(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,可以提高传输速度。
本文出自 “centos6 运维学习” 博客,请务必保留此出处http://wskfnso.blog.51cto.com/4025557/1764478
原文:http://wskfnso.blog.51cto.com/4025557/1764478