一、需求背景
笔者项目中此前有这么个需求,需要支持文件进行预览,文件的存储位置都在后端服务器上,想要支持预览是比较困难的(若是在前端服务器上则比较方便),因为无法做到跨服务器之间的静态文件预览,然后解决这个问题的思路就设定在了将后端服务器的文件所在位置挂载到前端服务器上,然后再使用nginx的反向代理,将文件地址代理出去,这样就可以实现文件预览功能了。方案确定以后就是技术选型了,最后确定使用了nfs来解决服务器之间的磁盘挂载,当然不止nfs可以实现,其他也可以。这里对nfs的使用做一次总结。
二、使用nfs实现多服务器之间磁盘挂载
1.nfs安装
# ubuntu 安装nfs sudo apt-get install -y nfs-kernel-server # centos 安装nfs sudo yum install nfs-utils rpcbind
2.nfs使用
nfs使用不难,只需要很少量的配置即可,下面来展示下这个配置
2.1服务端配置
服务端负责把文件共享出去,我们相当于把某个文件夹暴露给某个ip或者暴露在公网环境下。
# 先安装nfs # 编辑服务端配置文件 vim /etc/exports # 添加共享信息:将本地的/data目录共享给192.168.150.166,并让该ip拥有对该目录的rw权限 /data 192.168.150.166(rw) # 重启nfs systemctl restart nfs-server.service # rpc如果没有启动的话,这里启动下就行,启动过则无需重启 systemctl start rpcbind.service # 重载 /etc/exports exportfs -rv
2.2客户端配置
客户端负责将本地的某个文件夹与服务端建立连接,这样就可以在本地操作远端服务器目录了。
# 先安装nfs # 启动nfs systemctl restart nfs-server.service systemctl restart rpcbind.service # 与服务端建立连接:将本地的mnt挂载到 192.168.150.167:/data 目录下 mount -t nfs 192.168.150.167:/data /mnt # 查看挂载是否成功,挂载成功的话会能看到成功挂载的信息 df -h # 客户端取消挂载:将本地的mnt挂载进行取消 umount /mnt
一个服务端是可以同时被n个客户端进行挂载的,所以服务端与客户端其实是1对n的关系。
3.nfs介绍
上面说了是啥,这里介绍下他的原理。原理都是网络上搜的,作为了解。
3.1nfs是什么
NFS是一种基于TCP/IP 传输的网络文件系统协议。通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源
NAS存储: NFS服务的实现依赖于RPC (Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。需要安装nfs-utils、 rpcbind 软件包来提供NFS共享服务,前者用于NFS共享发布和访问,后者用于RPC支持。手动加载NFS共享服务时,应该先启动rpcbind, 再启动nfs。
nfs端口:2049
RPC端口:111
3.2nfs特点
采用TCP/IP传输网络文件
安全性低
简单易操作
适合局域网环境
3.3共享时权限选项
常用的赋予权限类型,如下命令:
# 将本地的/data目录共享给192.168.150.166,该ip对于该目录及文件具有括号内的这些权限 /data 192.168.150.166(rw,sync,no_subtree_check,no_root_squash)
下面是权限的所有可选项:
ro 只读访问 rw 读写访问 sync 所有数据在请求时写入共享 async NFS在写入数据前可以相应请求 secure NFS通过1024以下的安全TCP/IP端口发送 insecure NFS通过1024以上的端口发送 subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) no_subtree_check 和上面相对,不检查父目录权限 all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 no_all_squash 保留共享文件的UID和GID(默认) root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认) no_root_squash root用户具有根目录的完全管理访问权限 anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
3.4其他常用命令
# 服务端命令,查看服务端共享出去的文件信息 exportfs -v # 服务端命令,重新加载配置文件,通常这么使用:exportfs -rv exportfs -r
三、实践中碰到的问题
1.挂载时报错:mount.nfs: Stale file handle
这个报错笔者这里是因为之前客户端挂载过别的服务器,但是服务端直接将挂载取消了,这里再从客户端进行别的挂载就报了这个错误,只需要执行以下命令即可解决该问题
# /mnt是之前挂载的目录 umount -lf /mnt
2.共享时报错:exportfs: does not support NFS export
解决办法:查看文件类型:cat /etc/fstab,若文件类型不是ext4则无法正常共享,若本来就是挂载的文件夹也是无法共享的。