搭建NFS服务器

搭建内网 NFS,让文件存储变得简单。


描述

NFS是什么?

NFS即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.

在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

NFS作为备份服务的不足:

  • 实时性及可靠性相较于NFS+rsync+inotify方案要差些;
  • 共享盘一直挂载,浪费资源,可通过autofs解决.
  • 未卸载挂载盘,关闭客户端机器需要等待很久…

安装NFS服务端

以下操作在树梅派上执行,至于为什么不将NFS服务端安装在本机,是因为 “不 想 装 在 本 机” ^^^^

安装NFS所需的软件包

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install nsf-common portmap nfs-kernel-server

这样NFS就安装完成了.

创建共享目录

sudo mkdir -p /home/pi/docNFS

sudo chmod -R 777 /home/pi/docNFS

不给共享目录赋权,在客户端mount时会报错access denied by server while mounting

配置NFS

sudo vim /etc/exports

在末尾添加

/home/pi/docNFS 192.168.1.0/24(insecure,rw,async,no_root_squash)

使配置文件生效:

exportfs -arv

exportfs -aru 卸载全部的共享资源

启动rpcbind及NFS

sudo /etc/init.d/rpcbind start

sudo /etc/init.d/nfs-kernel-server start

或者使用sudo service rpcbind start

查看rpcbind及NFS状态

  • sudo /etc/init.d/rpcbind status #显示Active: active (running)即正常

  • sudo rpcinfo -p localhost #查看NFS服务项rpc服务器注册的端口

  • sudo /etc/init.d/nfs-kernel-server status #NFS状态

  • sudo netstat -lntup|grep nfs #查看NFS端口启动(FNS默认端口为2049)

  • sudo netstat -lntup |grep rpcbind # 111是rpcbind的主端口

  • sudo showmount -e 127.0.0.1 # sudo showmount -e localhost 查看本机挂载情况

  • sudo mount -t nfs 192.168.1.88:/home/pi/docNFS /mnt/docNFS # 在本机测试挂载

开机启动rpcbind

sudo update-rc.d rpcbind enable

sudo service rpcbind restart

查看nfs版本号

  • 在nfs的客户端上可通过nfsstat -m查看

  • 在nfs服务端上可通过nfsstat -s查看

安装NFS客户端

在客户端(个人电脑)上执行如下操作:

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install nfs-common

mkdir -p /home/xujh/docNFS

sudo mount -t nfs 192.168.1.88:/home/pi/docNFS /home/xujh/docNFS

  • 取消挂载:sudo umount /home/xujh/testNFS

  • 查看NFS服务端挂载:sudo showmount -e 192.168.1.88

可通过df命令查看客户端上是否正确挂载了NFS

autofs自动挂载

安装autofs

sudo dpkg -l |grep autofs

sudo apt-get install autofs

配置/etc/autofs

sudo vim /etc/auto.master

添加如下内容

/home/xujh/docNFS /etc/auto.nfs

提示

/home/xujh/docNFS 文件不要事先创建,因为autofs会自动创建,/etc/auto.nfs文件名可自定义.

配置子配置文件

这里的子配置文件指的是/etc/auto.master/etc/auto.nfs文件

sudo vim /etc/auto.nfs

添加内容如下:

hexobak -rw,bg,soft,rsize=10240,wsize=10240 192.168.1.88:/home/pi/docNFS

bg表示后台运行;soft表示RPC会在time out后重复呼叫而非持续呼叫;rsize和wsize会提升NFS的传输能力.

设置NFS闲置时间

sudo vim /etc/autofs.conf

修改原来的timeout = 300改为3,大概是在15行

timeout = 3 ##闲置3秒后系统自动卸载网络设备

这里设置3妙是为了测试autofs是否会自动挂载NFS共享目录,实际工作中建议设置为600

如何使用autofs自动挂载

sudo /etc/init.d/autofs restart

cd /home/xujh/docNFS # autofs会自动创建/home/xujh/docNFS

cd /home/xujh/docNFS/hexobak # autofs会自动挂载NFS共享目录

这里不是非要使用cd命令,也可以是ls等命令,只要是涉及读写/home/xujh/docNFS文件的操作都可触发autofs

开机挂载NFS共享目录(非必须)

推荐使用autofs工具在需要的时候进行挂载

sudo vim /etc/rc.d/rc.local

添加

mount -t nfs 192.168.1.88:/home/pi/docNFS /home/xujh/docNFS

建议不要把挂载命令放在/etc/fstab,因为fstab比网络先启动,会出现挂载不上网络NFS,

如果非要在此处添加可在其里面添加192.168.1.88:/home/pi/docNFS /mnt/docNFS nfs rsize=8192,wsize=8192,timeo=14,intr 0 0

常见错误

access denied by server while mounting

常见错误原因:

  • 使用了非法端口,也就是使用了大于1024的端口。 这个错误,可以通过查看日志确认:

cat /var/log/messages | grep mount

Jan 2 12:49:04 localhost mountd[1644]: refused mount request from 192.168.0.100 for /home/nfsshare/ (/home/nfsshare): illegal port 1689

解决办法:

修改配置文件/etc/exports,加入 insecure选项,重启nfs服务,再尝试挂载。

/home/nfsshare/  *(insecure,rw,async,no_root_squash)

  • NFS版本问题

编辑/etc/sysconfig/nfs文件,找到下面:

#Turn off v2 and v3 protocol support
#RPCNFSDARGS="-N 2 -N 3"
#Turn off v4 protocol support
#RPCNFSDARGS="-N 4"  /*把这句前面的#号去掉*/

最后保存,重启nfs服务,再尝试挂载;如果挂载不上,可尝试在后面加-o nolock参数。

  • 查看客户端挂载的目录是否具备读写权限,添加相应权限即可。

  • nfs服务器上的/etc/hosts中设置了客户端机器IP对应域名,去掉即可。

通过以上这几种方法,access denied by server while mounting这个错误应该可以得到解决了。

umount device is busy

fuser -m /home/xujh/docNFS

显示结果为

/home/xujh/docNFS: 15639c

上面结果代表的是 process 25023(pid) 有使用到此目录, 后面 c 代表的意思可参考下述:

  • c: current directory.
  • e: executable being run.
  • f: open file. f is omitted in default display mode.
  • F: open file for writing. F is omitted in default display mode.
  • r: root directory.
  • m: mmap’ed file or shared library.

要把这个资源释放的话, 可以有下述做法:

  • kill -9 25023 # ps aux | grep 25023 应该就会看到它
  • fuser -m -v -i -k /media/share # 会问你是不是要把 25023 这个 kill 掉, 选 y 就会 kill 掉

提示信息如下:

USER PID ACCESS COMMAND
/meida/share: root 25023 ..c.. bash
Kill process 25023 ? (y/N) y

rm:Device or resource busy

sudo /etc/init.d/autofs stop

sudo rm -rf ~/docNFS/

必须先停掉autofs服务才能删除共享目录

上次更新:
贡献者: iEchoxu