NFS : Network File System 网络文件系统
sun公司
版本 NFSv2 NFSv3 NSFv4
RPC : Remote Procedure Call Protocol 远程过程调用协议,编程技术,简化分布式应用程序的
开发
工作原理:当地请求调用内核文件系统,内核文件系统发现请求的是远程网络的文件系统(NFS)时
,内核会向本地存根发起请求,本地存根向远程RPC服务请求数据,RPC服务器处理返回本地存根对
应的NFS服务端口,本地存根请求对应端口的NFS服务,NFS服务调用本地内核处理请求。
C->RPC C->RPC S->S
Linux上的RPC服务器 Portmap 111端口 tcp/udp
RPC:二进制格式,文本格式(XMLRPC)
NFS:只能工作在unix/linux,常用于内网,认证环节很薄弱,不安全
服务器端:nfs-utils
service nfs start 需要potmap用时运行,默认是启动的,查看111端口
rpcinfo //查看rpc运行服务监听的所有端口
rpcinfo -p localhost
启动的nfs主要进程:nfsd(文件传输进程) mountd(挂载服务) quotad(限定客户端使用配额)
nfsd tcp 2049 端口
mountd 端口由RPC服务随机选取
quotad 端口由RPC服务随机选取
启动的服务
[[email protected] lib]# rpm -ql nfs-utils /etc/nfsmount.conf /etc/rc.d/init.d/nfs /etc/rc.d/init.d/nfslock /etc/rc.d/init.d/rpcgssd /etc/rc.d/init.d/rpcidmapd /etc/rc.d/init.d/rpcsvcgssd
nfslock服务,防止同一个文件被多个请求占用,用户的锁中断恢复。
nfs服务 要开启启动
chkconfig nfs on
配置文件 /etc/exports man exports 查看帮助文档
配置格式
/path/to/somefile client1 client2 ... 多个客户端用空格隔开,每个客户端后
面加(),客户端可以是主机名 IP 网络组 通配符 定义客户端的,()里面定义文件属性
/nfs/file 192.168.136.0/8(ro,async) 192.168.135.0/8(rw,sync)
#开头的是注释
showmount
-a ip 显示所有客户端名称,挂载的目录
-e ip 显示共享(导出)的目录 showmount -e 192.168.136.135 查看指定IP的共享(导出)
目录,客户端也可查看服务端共享(导出)的目录
-d ip 只显示被挂载的目录
客户端使用mount挂载
mount -t nfs Server:/path/exports /nfs/local
exportfs
-a 和-r或-u同时使用
-r 重新导出所有目录
-u 取消导出所有
-v 显示过程
exportfs -ra
nfs是要通过映射用户ID来管理里用户权限的,如果挂载的客户端有一个用户A的UID号和服务端
共享的文件属主相同的UID,则文件属主则会变为A。
文件系统导出的属性
ro
rw
sync
async
root_squash 默认将管理员映射为来宾账号
no_root_squasha
all_squash 将所有用户映射为来宾账号
anonuid,anongid anonuid=504 将用户映射为指定来宾的用户
/shared 192.168.136.0/8(rw,all_squash,anonuid=503,anongid=503) //修改对应文件属主属组为503,然后客户端重新挂载exportfs -ra
这里遇到nfs属主属组都为nobody
[[email protected] nfs]# ll total 0 -rw-r--r--. 1 nobody nobody 0 Jul 19 23:02 test -rw-r--r--. 1 nobody nobody 0 Jul 19 23:18 test2 -rw-r--r--. 1 nobody nobody 0 Jul 19 23:42 test3 -rw-r--r--. 1 nobody nobody 0 Jul 19 23:42 test4 [[email protected] nfs]#
网上搜答案都说这样解决,不过我没解决,有空在找
方法一:mount中指定参数法 在mount挂载的时候指定使用v3版本去挂载,如下: mount -t nfs -o vers=3 ip:/data1 /data1 显然不推荐该方法,既然有了V4版本,其肯定较V3版本做了很多优化,如果再用V3,显然跟不上时代的步伐 。 方法二:修改/etc/idmapd.conf文件 修改前,先看下为什么会mount成nobody,在/etc/idmapd.conf文件中,mapping配置下有如下两句 。 [Mapping] Nobody-User = nobody Nobody-Group = nobody 有人肯定说,直接修改这两句,变成想要的用户和组不就行了 ? 当然没这么简单,这里改了后,会发现mount的目录只有读的权限,没有写的权限 。想在彻底的解决该文件,只需要客户端和服务端各改一行就行了。修改方法为,取消/etc/idmapd.conf中如下行的注释,改为你所使用的根域名: #Domain = local.domain.edu 如:都改为: Domain = 361way.com 更改完成后,重启idmapd服务: service rpcidmapd restart 至此,问题解决。记得是客户端和服务端都要修改才行,只改一处,问题仍然无法解决 。另外在umount的过程中,还可能遇到无法umount的问题:
/etc/fstab 开机自动挂载
proc /proc proc defaults,_rnetdev 0 0 // _rnetdev 如果开机系统无法挂载则不挂在,防止系统无法启动
nfs配置文件:/etc/sysconfig/nfs
启用自定义端口防止和其它端口冲突
Mountd_port
Reqotaad_port
Lockd_tcpport
lockd_udpport
问题:
启动nfs报错
[[email protected] mnt]# service nfs restart Shutting down NFS daemon: [ OK ] Shutting down NFS mountd: [ OK ] Shutting down NFS quotas: [ OK ] Starting NFS services: [ OK ] Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp). [FAILED] Starting NFS mountd: [FAILED] Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused) rpc.nfsd: unable to set any sockets for nfsd [FAILED] [[email protected] mnt]#
解决:RH系操作系统在6.0版本之后没有portmap服务控制rpc的启动,由于NFS和nfslock的启动需要向
rpc进行注册,rpc不启动的话就会报错。
解决方法:启动rpcbind&rpcidmap rpcbind是6.0版本后默认的RPC服务,所以要先于nfs启动。如
果不启动rpcidmap则会造成用户权限的映射错误,用户的权限看起来是一串数字。
[[email protected] ~]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] [[email protected]- ~]# /etc/init.d/rpcidmapd start Starting RPC idmapd: [ OK ] [[email protected]- ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ]