NFS 最初是由 Sun Microsytem 公司於 1984 年所开发出来的,最主要的功能就是让网路上的 UNIX 电脑可以共享目录及档案。我们可以将远端所分享出来的档案系统,挂载 (mount) 在本地端的系统上,然後就可以很方便的使用远端的档案,而操作起来就像在本地操作一样,不会感到有甚麽不同。而使用 NFS 也有相当多的好处,例如档案可以集中管理,节省磁碟空间......。
nfs的运作原理是远程装载,在每个主机上运行unix的portmapper和mountd(处理nfs装载请求的服务器)守护进程。/etc/exports控制对服务器的访问,它包含一个授权主机的清单,以及用户权限和允许的目录。
下面是mountd帮助手册的一段话:
当mountd启动时,会使用mount系统调用将输出主机的地址和配置载入到内核中。 一旦更改exports文件,应当向mountd进程发送挂起信号,以使其重新载入配置信息。 在发送SIGHUP信号后,应检查syslog确认mountd没有在exports文件中发现语法错误。如果mountd发现内核不支持nfs,将试图装载包含nfs程序的lkm。
大部分bsd内核缺省时内置了nfs支持并可以在/etc/rc.conf中配置, 而linux则需要可加载模块或者重新编译内核。
RPC
当我们在使用某些服务来进行远程联机的时候,有些信息,例如主机的IP、服务的 port number、与对应到的服务之 PID 等等,都需要管理与对应!这些管理 port 的对应与服务相关性的工作,就是这个 Remote Procedure Call, RPC 的任务了
NFS 本身的服务并没有提供资料传递的协议,但是 NFS 却能让我们进行档案的分享,这其中的原因,就是 NFS 使用到一些其它相关的传输协议!而这些传输的协议,就是使用到这个所谓的 RPC 的功能啰!这也就是说, NFS 本身就是使用 RPC 的一个 program 就是了!说的更白话一点, NFS 也可以视作是一个 RPC server 啦!同时要注意到的是,在某些状况中,不但跑 NFS 的 Server 需要激活 RPC 的服务,连带的,要挂载 NFS partition 的 Client 机器,也需要同步激活 RPC 才行!这样 Server 端与 Client 端才能藉由 RPC 的协议来进行 program port 的对应喔!NFS 主要在管理分享出来的目录,而至于资料的传递,就直接将他丢给 RPC 的协议来运作就是了!
NFS 激活的 RPC daemons
o rpc.nfsd:这个 daemon 主要的功能就是在管理 Client 是否能够登入主机的权限啦,其中还包含这个登入者的 ID 的判别
o rpc.mountd:这个 daemon 主要的功能,则是在管理 NFS 的档案系统!当 Client 端顺利的通过 rpc.nfsd 而登入主机之后,在他可以使用 NFS server 提供的档案之前,还会经过档案使用权限 ( 就是那个 -rwxrwxrwx 与 owner, group 那几个权限啦 ) 的认证程序!他会去读 NFS 的设定档 /etc/exports 来比对 Client 的权限,当通过这一关之后, Client 就可以取得使用 NFS 档案的权限啦!(注:这个也是我们用来管理 NFS 分享之目录的使用权限与安全设定的地方哩)
4.NFS需要有两个套件才行,分别是:
nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其它相关 documents 与说明文件、执行档等的套件!这个就是 NFS 的主要套件
portmap
就如同刚刚提的到,我们的 NFS 其实可以被视为一个 RPC server program,而要激活任何一个 RPC server program 之前,我们都需要做好 port 的对应 ( mapping ) 的工作才行,这个工作其实就是『 portmap 』这个服务所负责的!也就是说,在激活任何一个 RPC server 之前,我们都需要激活 portmap 才行呢!那么这个 portmap 到底在干嘛呢?就如同这个服务的名称,哈哈!就是作 port 的 mapping 啊!举个例子来说:当 Client 端尝试来使用 RPC server 所提供的服务时,由于 Client 需要取得一个可以连接的 port 才能够使用 RPC server 所提供的服务,因此, Client 首先就会去跟 portmap 讲『喂!可不可以通知一下,给我个 port number ,好让我可以跟 RPC 联络吧!』这个时候 portmap 就自动的将自己管理的 port mapping 告知 Client ,好让他可以连接上来 server 呢!所以啰:『激活 NFS 之前,请先激活 portmap !』
安装 NFS:
大部份的 Linux Distribution 安装时都会将 NFS 安装上去,在 OpenLinux 上,NFS 由两个 RPM 套件所组成,分别为 nfs 及 nfs-server,nfs 主要包括一些 client 端所需要的程式,而 nfs-server 主要是 NFS Server 的一些 daemon 程式。
设定 NFS:
设定档:/etc/exports
设定档格式:档案系统 [主机][选项]
例:
/charlie(ro) john(rw,no_root_squash)
/tmp pc*.col.com.tw(rw) 172.29.0.0/255.255.0.0(ro)
/pub (ro)
/pub/private (noaccess)
选项说明:
ro read only
rw read write
no_root_squash 信任客户端,对应 UID
noaccess 客户端不能使用
启动及结束 NFS 的服务:
设定档更改後,一定要记得重新启动 NFS 的服务,启动及停止的方式如下:
# /etc/rc.d/init.d/nfs [ start | stop | restart | reload ]
start 启动 NFS 服务
stop 停止 NFS 服务
restart 停止并重新启动 NFS 服务
reload 重新载入 NFS 设定值
客户端使用 NFS:
1.查看 NFS 的服务:
client 要查看 Server 有提供哪些 NFS 服务,可以使用 showmount 这个指令。
# showmount -e 可看有分享哪些目录
# showmount -a 可看出所有的 mount
2.连接 NFS Server:
要使用 NFS server 上的资源,使用 mount 指令就可以了。
# mount -t nfs hostname:/shared_dir
例:
# mount -t nfs 192.168.1.100:/tmp /mnt/nfs
3.开机时自动连上 NFS:
如果希望开机的时候,系统就自动挂载 NSF,则需要编辑 /etc/fstab 档。
例:
192.168.1.100:/tmp /mnt/nfs nfs defaults 0 0
可能出问题的地方:
1.权限的设定不符合
2.忘记了激活portmap,此时会报错:
mount: RPC: Port mapper failure - RPC: Unable to receive 或者
mount: RPC: Program not registered
那么,启动portmap,并且重新启动nfs
#service portmap start
#service nfs restart
3.被防火墙搞掉
重新设置防火墙,包括iptables与TCP_Wrappers,因为激活了portmap,所以port 111必须提供出去.因此在iptables rules中,要增加:
iptables -A INPUT -p TCP --dport 111 -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -j ACCEPT
如果还不行,那就是TCP_Wrappers的问题,检查/etc/hosts.deny,如果有一行是:
ALL: ALL: deny
那就必须在/etc/hosts.allow中增加:
portmap: ALL: allow
如果我们的NFS针对内部网络开发,对于外部网络只对学术网络开发(140.0.0.0/8),可以:
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
还可以使用TCP_Wrappers,在/etc/hosts.allow里面规定连上 NFS 主机的主机 IP 与名称,例如
#vi /.etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 :allow
portmap: 140.113.23.23 :allow
portmap: .sdu.edu.cn :allow
RPC Server的相关命令
rpcinfo
#rpcinfo -p hostname(orIP)
要注意的问题:
需要注意的是,由于 NFS 使用的这个RPC在 client 端连上主机时,那么你的主机想要关机,那可就会成为『不可能的任务』!我还不知道正确的原因是什么,但是,如果你的 Server 上面还有 Client 在联机,那么你要关机,可能得要等到数个钟头才能够正常的关机成功!嗄!真的假的!不相信吗?不然您自个儿试试看! ^_^!所以啰,建议您的 NFS Server 想要关机之前,能更先『关掉 portmap 与 nfs 』这两个东西!如果无法正确的将这两个 daemons 关掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 将他关掉先!这样才有办法正常的关机成功喔!这个请特别特别的注意呢!
在TurboLinux8.0 for AMD64 (kernel 2.4.21-4smp),mount NFS时候报错为:
portmap: server localhost not responding, timed out
解决办法:
mount -t nfs -o nolock node1:/public /public
即增加-o nolock参数,原因:
Unfsd doesn't support NLM locking, and it's causing the lockd daemon to be started (which again requires the portmapper to be installed etc.)
阅读(2087) | 评论(0) | 转发(0) |