转载说明
本文转载自:http://www.senra.me/build-your-own-cloud-storage-series-extra-nfs/

有些时候,我们会遇到一种比较尴尬的情况,就是我有两台VPS,其中一台可能内存很小,但是硬盘却比较大,比如128M或者256M配了100G或者更大的硬盘(显然serverhub的某plan就是这样),另一台相对来说内存会正常一点,然而硬盘却不大,比如512M 20G啥的,这种情况下,我们要怎么用呢?当是选择NFS咯,NFS就是网络文件系统,简单的来说就是远程挂载存储。你可以通过NFS来实现将一台机器上的目录挂载到另一台机器上。这样就能充分得利用资源。

一.服务端配置

所谓服务端,就是存储或者说被挂载的那部分

yum install nfs-utils rpcbind -y

请注意,在这个过程中会安装python-argparse,如果你的系统是Centos6且还升级了默认Python为2.7,那么可能你需要运行如下的命令额外为Python 2.7安装argparse,系统默认yum安装的是2.6的,可能会出点问题

pip install argparse

安装在这儿就OK了,下面是配置

首先当然是选择一个用于挂载的文件夹,可以是已有的,也可以新创建,建议创建前使用df -h查看是否本机的大部分存储空间是挂载到指定目录的,这样的话我们就需要在那个目录下创建用于挂载的文件夹

#如果我们的存储盘挂在/data 上,我们可以这么来
mkdir /data/nfsdata
#修改NFS的配置文件
vi /etc/exports
#加入如下内容,如果有多个目录的话就是多行
/data/nfsdata/ 客户端的IP(rw,no_root_squash,no_all_squash,sync)
#启动服务
service rpcbind start
service nfs start
#使配置生效
exportfs -r
#开机启动服务
chkconfig rpcbind on
chkconfig nfs on

这样我们服务端就配置好了

另外解释下/etc/exports中的部分参数

举个栗子
/data/nfsdata/ 1.2.3.4(rw,no_root_squash,no_all_squash,sync)
第一部分就不用说了,第二部分前面的为客户端的地址,后面括号内的是它的权限
 
地址可以是一个网段,一个IP地址或者是一个域名,支持通配符
如:*可以授权所有的IP(不安全,除非你在局域网内)
   *.example.com这样也是可以的
   1.2.3.0/24这样授权的就是整个/24
 
权限说明:
rw:read-write,可读写;
ro:read-only,只读;
 
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
 
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
 
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。

二.客户端配置

客户端同样需要安装nfs-utils和rpcbind,所以参照上面的就行

然后我们依旧是找个文件夹,你需要放在哪就放在哪,当然建议是空的,不然可能会被叠掉

我们先运行如下命令查看服务端是否正常

showmount -e 服务端IP

如果提示rpc mount export: RPC: Unable to receive; errno = No route to host,那么,我们可能需要关闭服务端的防火墙或者开放端口

mount -t nfs 192.168.0.100:/data/nfsdata  /data  -o proto=tcp -o nolock
#这儿的proto默认是udp,为了稳定也可以选择tcp,但是这样的话要保证服务端和客户端尽量近一点,延迟和丢包不能太蛋疼

取消挂载还是用umount,至于要查看挂载目录的使用信息(命令,用户,PID之类的),可以用如下命令

fuser -m -v /path/to/nfs/mount/point/