近因工作需要,所以要搭一个共享的服务器用于存储。实现你有我有大家有的共享的和谐局面。想到了NFS-Network File System。接下来我便说一说NFS以及有关它的搭建。 什么是NFS 搜索引擎哪家强,有事问度娘(好吧,我承认技术性问题我问的是谷歌,此处为了押韵,不用介怀),度娘是这么解释NFS的: NFS,是Network File System的简写,即网络文件系统。网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。NFS这个通过网络共享文件系统的服务在搭建的时候是很简单的,不过,它大的问题在于“权限”。因为在客户端与服务器端必须具有相同的账号才能够访问某些目录或文件。另外,NFS 的启动需要透过所谓的远程过程调用 (RPC),也是说,我们并不是只要启动 NFS 好了, 还需要启动 RPC 这个服务才行啊!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!
如同上面的图示一般,当我们的 NFS 服务器设定好了分享出来的 /home/sharefile 这个目录后,其他的 NFS 客户端可以将这个目录挂载到自己系统上面的某个挂载点 (挂载点可以自定义),例如前面图示中的 NFS client 1 与 NFS client 2 挂载的目录不相同。我只要在 NFS client 1 系统中进入 /home/data/sharefile 内,可以看到 NFS 服务器系统内的 /home/sharefile 目录下的所有数据了 (当然,权限要足够啊!^_^)!这个 /home/data/sharefile 好像 NFS client 1 自己机器里面的一个 partition 喔!只要权限对了,那么你可以使用 cp, cd, mv, rm... 等等磁盘或档案相关的指令!真是方便之极啊! NFS的搭建之所需的软件 RPC主程序:rpcbind 我们的 NFS 其实可以被视为一个 RPC 服务,而要启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实是『 rpcbind 』这个服务所负责的!也是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行! NFS主程序:nfs-utils 是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个是 NFS 服务所需要的主要软件啦!一定要有喔! 因为我用的是CentOS6.5,所以上述两个软件都有,没有的请自行安装,如果不知道有木有,用下述指令查看是否有此软件: 1 rpm -qa | grep nfs #查询是否存在nfs 2 rpm -qa | grep rpcbind #查询是否存在rpcbind NFS搭建 接下来是搭建了,重要也是简单的部分,因为只需编辑好配置文件 /etc/exports 之后,先启动 rpcbind (若已经启动了,不要重新启动),然后再启动 nfs ,你的 NFS 成功了! 不过这样的设定能否对客户端生效?那得要考虑你权限方面的设定能力了。废话少说,我们直接来看看那个 /etc/exports 应该如何设定吧!某些 distributions 并不会主动提供 /etc/exports 档案,所以请你自行手动建立它吧。有以下三种表达方式: method 1: 1 [root@www ~]# vim /etc/exports 2 /tmp 192.168.100.0/24(ro) 3 [分享目录] [主机(权限)] method 2: 1 [root@www ~]# vim /etc/exports 2 /tmp localhost(rw) 3 [分享目录] [主机名(权限)] method 3: 1 [root@www ~]# vim /etc/exports 2 /tmp *(ro,sync) 3 [分享目录] [通配符表示主机(权限)]
至于权限方面 (是小括号内的参数) 常见的参数则有:
启动服务器端NFS 配置文件搞定后,当然要开始来启动才行啊!而前面我们也提到过,NFS 的启动还需要 rpcbind 的协助才行啊! 所以赶紧来启动吧!
1 [root@www ~]# /service rpcbind start 2 # 如果 rpcbind 本来已经在执行了,那不需要启动啊! 3 4 [root@www ~]# service nfs start 5 # 有时候某些 distributions 可能会出现如下的警告讯息: 6 exportfs: /etc/exports [3]: No 'sync' or 'async' option specified 7 for export "192.168.100.10:/home/test". 8 Assuming default behaviour ('sync'). 9 # 上面的警告讯息仅是在告知因为我们没有指定 sync 或 async 的参数, 10 # 则 NFS 将默认会使用 sync 的信息而已。你可以不理他,也可以加入 /etc/exports。 11 12 [root@www ~]# service nfslock start 13 [root@www ~]# chkconfig rpcbind on 14 [root@www ~]# chkconfig nfs on 15 [root@www ~]# chkconfig nfslock on |
在你的 NFS 服务器设定妥当之后,我们可以在 server 端先自我测试一下是否可以联机喔!是利用 showmount 这个指令来查阅! 1 [root@www ~]# showmount [-ae] [hostname|IP] 2 选项与参数: 3 -a :显示目前主机与客户端的 NFS 联机分享的状态; 4 -e :显示某部主机的 /etc/exports 所分享的目录数据。 5 6 # 1. 请显示出刚刚我们所设定好的相关 exports 分享目录信息 7 [root@www ~]# showmount -e localhost 8 Export list for localhost: 9 /tmp * 很简单吧!所以,当你要扫瞄某一部主机他提供的 NFS 分享的目录时,使用 showmount -e IP (或hostname) 即可!非常的方便吧!这也是 NFS client 端常用的指令喔!
如果报错的话,有可能是端口被防火墙禁止了,可以开放端口,当然简单粗暴的方法是关掉防火墙: 1 service iptables stop 或者不想简单粗暴的这样做, 一般来说, NFS 的服务仅会对内部网域开放,不会对因特网开放的。然而,如果你有特殊需求的话, 那么也可能会跨不同网域是了。但是,NFS 的防火墙特别难搞,为什么呢?因为除了固定的 port 111, 2049 之外, 还有很多不固定的埠口是由 rpc.mountd, rpc.rquotad 等服务所开启的,所以,你的 iptables 很难设定规则! 那怎办?难道整个防火墙机制都要取消才可以? 为了解决这个问题, CentOS 6.x 有提供一个固定特定 NFS 服务的埠口配置文件,那是 /etc/sysconfig/nfs 啦! 你在这个档案里面能够指定特定的埠口,这样每次启动 nfs 时,相关服务启动的埠口会固定,如此一来, 我们能够设定正确的防火墙?!这个配置文件内容很多,绝大部分的数据你都不要去更改,只要改跟 PORT 这个关键词有关的数据即可。 那么需要更改的 rpc 服务有哪些呢?主要有 mountd, rquotad, nlockmgr 这三个,所以你应该要这样改:
1 [root@www ~]# vim /etc/sysconfig/nfs 2 RQUOTAD_PORT=1001 <==约在 13 行左右 3 LOCKD_TCPPORT=30001 <==约在 21 行左右 4 LOCKD_UDPPORT=30001 <==约在 23 行左右 5 MOUNTD_PORT=1002 <==约在 41 行左右 6 # 记得设定值左边的批注服务要拿掉之外,埠口的值你也可以自行决定。 7 8 [root@www ~]# /etc/init.d/nfs restart 9 [root@www ~]# rpcinfo -p | grep -E '(rquota|mount|nlock)' 10 100011 2 udp 1001 rquotad 11 100011 2 tcp 1001 rquotad 12 100021 4 udp 30001 nlockmgr 13 100021 4 tcp 30001 nlockmgr 14 100005 3 udp 1002 mountd 15 100005 3 tcp 1002 mountd |
然后将对应的端口号给开放即可。 NFS客户端的挂载 你要如何挂载 NFS 服务器所提供的文件系统呢?基本上,可以这样做: 确认本地端已经启动了 rpcbind 服务! 扫瞄 NFS 服务器分享的目录有哪些,并了解我们是否可以使用 (showmount); 在本地端建立预计要挂载的挂载点目录 (mkdir); 利用 mount 将远程主机直接挂载到相关目录。 比如说将客户端在 192.168.100.10 这部机器上,而服务器是 192.168.100.254 ,将服务器上的目录挂在在客户端上。 1 [root@clientlinux ~]# showmount -e 192.168.100.254 2 Export list for 192.168.100.254: 3 /tmp * 接下来我想要将远程主机的 /home/public 挂载到本地端主机的 /home/nfs/public , 所以我得要在本地端主机先建立起这个挂载点目录才行啊!然后可以用 mount 这个指令直接挂载 NFS 的文件系统?! 1 [root@clientlinux ~]# mkdir -p /home/nfs/public 2 [root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/public /home/nfs/public 然后看看挂载情况: 1 [root@clientlinux ~]# df 2 文件系统 1K-区段 已用 可用 已用% 挂载点 3 ....(中间省略).... 4 192.168.100.254:/home/public 5 7104640 143104 6607104 3% /home/nfs/public 不想挂载想取消的话使用如下命令: 1 [root@clientlinux ~]# umount /home/nfs/public