NFS的工作原理
NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。
http://wiki.jikexueyuan.com/project/linux/nfs.html
https://www.freebsd.org/doc/zh_CN.UTF-8/books/handbook/network-nfs.html
http://www.zhukun.net/archives/7096
NFS的安装
服务器端和客户端:
$ yum install nfs-utils portmap (适用centos 5)
$ yum install nfs-utils rpcbind (适用centos 6)
|
在线上机器只需要执行$ yum install nfs-utils,rpcbind会自动安装
如果客户端不安装,会报错如下
客户端nfs-utils,执行yum install nfs-utils -y
如果不安装,会报错如下
mount: wrong fs type, bad option, bad superblock on 10.76.174.182:/opt/meituan/nfsattachment,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)
In some cases useful info is found in syslog - try
dmesg | tail or so
NFS的配置
服务器端:
主配置文件/etc/exports
$ su - sankuai
$ vi /etc/exports //在此文件中输入一下内容
/opt/meituan/poslog cq-icb-h-posmonitor-staging01(rw,sync,fsid=0,anonuid=500,anongid=500)
/opt/meituan/poslog cq-icb-h-posmonitormanage-staging01(rw,sync,fsid=0,anonuid=500,anongid=500)
这个配置文件就这样简单一行。共分为三部分,第一部分就是本地要共享出去的目录,第二部分为允许访问的主机(可以是一个IP也可以是一个IP段)第三部分就是小括号里面的,为一些权限选项。
rw:read-write,可读写;
ro:read-only,只读;
sync:同步写入(文件同时写入硬盘和内存),适用在通信比较频繁且实时性比较高的场合
async:异步写入(文件先写入内存,稍候再写入硬盘),性能较好(速度快),适合超大或者超多文件的写入,但有数据丢失的风险,比如突然断电等情况;
root_squash(默认):将来访的root用户映射为匿名用户或用户组;
no_root_squash:来访的root用户保持root帐号权限(可能会不安全);
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
all_squash:将来访的所有用户映射为匿名用户或用户组;
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器;
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值;
no_subtree_check:如果NFS输出的是一个子目录,则无需检查其父目录的权限(可以提高效率)
服务端NFS的启动与停止
$ chkconfig rpcbind on //设置开机自启动
$ chkconfig nfs on //设置开机自启动
$ service rpcbind start //启动rpcbind服务,NFS是依托rpcbind的,所以首先要启动rpcbind,然后启动NFS才能使刚才的配置生效。启动完NFS后,就该使用NFS服务了。
$ service nfs start //启动nfs服务
$ showmount -e localhost //用shoumount -e 加服务器IP就可以查看NFS的共享情况
$ showmount -a //把连接本机的NFS的client全部列出。
客户端的挂载
格式:mount [- t nfs] [-o 选项] 服务器IP:共享的目录 本地目录
$ mount 10.12.18.176:/opt/meituan/poslog /opt/meituan/poslog (需要root全选,sudo一下)
NFS默认是用UDP协议,也可以加上-o proto=tcp换成TCP协议。
客户端重新挂载nfs
http://www.jianshu.com/p/cfa02764d19e
[方案一]
解决因服务端移除目录再恢复时,客户端报错,此类问题的常规思路是:
1.卸载目录 umount -f /home/log/dir
2.重新挂载 mount server_ip:/home/log/dir /home/log/dir
[方案二]
然而通常情况下,因为客户端挂载的目录会被其他进程打开,导致我们在卸载目录的时候通常不能成功,那么成功卸载目录也有以下步骤:
1.查看哪些进程占用文件目录: fuser -mu /mnt
2.kill掉这些占用文件目录的进程:kill -9 xxxx
3.卸载目录:umount -f /home/log/dir
4.重新挂载目录:mount server_ip:/home/log/dir /home/log/dir
[方案三]
运气不太好的时候,当还有未知应用进程在操作文件目录,上述步骤也是不成功的,这个时候就要使用炒鸡卸载方式umount -l
1.使用lazy卸载:umount -l /home/log/dir
2.重新挂载目录:mount server_ip:/home/log/dir /home/log/dir
解释下umount lazy:
umount -l #umount lazy
当不知道是什么应用操作了文件目录,使用umount -f也无法成功的时候,使用umount -l ,umount会等待应用操作文件系统,直到文件系统可以被卸载为止,即umount -l并不是立刻清除所有挂载操作,它的特点是一直等待;
修改配置文件/etc/exports 如何生效
exportfs -rv 等价于 /etc/init.d/nfs reload 加载配置生效(当修改了/etc/exports时执行)
-a 打开或取消所有目录共享。
-o options,...指定一列共享选项,与 exports(5) 中讲到的类似。
-i 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
-r 重新共享所有目录。它使 /var/lib/nfs/xtab 和 /etc/exports 同步。 它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。
-u 取消一个或多个目录的共享。
-f 在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd添加的新的共享条目。
-v 输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。
本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1975268,如需转载请自行联系原作者