NFS - Network File System

NFS - Network File System

概念介绍

Linux 下的 NFS 系统简介 - 简书

https://zhuanlan.zhihu.com/p/448386493

NFS 使用 RPC 协议进行通信,也就是说 NFS 系统只是一组 RPC 程序。RPC 是远程过程调用 (Remote Procedure Call) 的英文缩写,它是能使客户端执行其他系统中程序的一种机制。NFS 可以看作是一个 RPC Server,主要功能是管理需要分享的目录和文件。它不负责通信和信息传输,而是把这部分工作交给 RPC 协议来完成。即 NFS 在文件传送或信息传送过程中依赖于 RPC 协议。所以只要用到 NFS 的地方都要启动 RPC 服务,不论是 NFS SERVER 或者 NFS CLIENT。这样 SERVER 和 CLIENT 才能通过 RPC 来实现 PROGRAM PORT 的对应。可以这么理解 RPC 和 NFS 的关系:NFS 是一个文件系统,而 RPC 是负责负责信息的传输。

docker 部署

docker 里安装 nfs-server

Docker-nfs-server

GitHub - ehough/docker-nfs-server: A lightweight, robust, flexible, and containerized NFS server.

docker 镜像中安装nfs服务端 docker搭建nfs_mob6454cc6d81c9的技术博客_51CTO博客

用起来很简单,服务端往外共享一个目录的东西

客户端通过 mount 命令来将 NFS 服务器上的东西挂载到本机的某个路径下,然后再客户机上,我们就能像访问本地文件一样访问 NFS 服务器上的文件


创建权限文件

exports.txt

## $share_path $host($permission)
/nfs_share *(rw,sync,no_root_squash,no_all_squash,no_subtree_check,nohide,crossmnt)

服务端(192.168.101.144)执行

modprobe nfs
modprobe nfsd

启动容器

docker run --name nfs --privileged -d -v /opt/dir_share:/nfs_share  -v /opt/nfs/config/exports.txt:/etc/exports:ro  -p 2049:2049  -p 2049:2049/udp -p 111:111     -p 111:111/udp -p 32765:32765 -p 32765:32765/udp -p 32767:32767 -p 32767:32767/udp erichough/nfs-server

客户端挂载目录

mount -v -t nfs -o ro,nfsvers=3,nolock,proto=udp,port=2049  192.168.101.144:/nfs_share /opt/auto_sync

挂载的时候同时设置永久挂载

mount -t nfs {{ nfs_server }}:/nfs_share /nfs_sync
echo {{ nfs_server }}:/nfs_share /nfs_sync nfs defaults 0 0 >> /etc/fstab

取消挂载的同时取消永久挂载

umount /nfs_sync
sed -i '/nfs_sync/d' /etc/fstab

不过有的时候,在客户端执行 mount 命令挂载目录的时候会报错,提示

mount: 文件系统类型错误、选项错误、192.168.101.141:/nfs_share 上有坏超级块、
       缺少代码页或助手程序,或其他错误
       (对某些文件系统(如 nfs、cifs) 您可能需要
       一款 /sbin/mount.<类型> 助手程序)

       有些情况下在 syslog 中可以找到一些有用信息- 请尝试
       dmesg | tail  这样的命令看看。

这是因为客户端没有安装 nfs 客户端,此时你可以先执行 yum -y install nfs-utils 安装 nfs 相关软件,然后再执行挂载即可,如果在离线环境下,可以通过 docker 安装 nfs 客户端

Docker-nfs-client

加载镜像之后,直接运行

# SERVER: nfs服务器地址
# SHARE: nfs服务器共享文件夹
# /nfs_sync :本机挂载的文件夹
docker run -d --privileged=true --name nfs-client --net=host -v /nfs_sync:/mnt/nfs-1:shared -e SERVER=192.168.101.141 -e SHARE=/nfs_share d3fk/nfs-client

如何取消挂载呢?删除容器之后,还需要执行 umount 命令,不然还是会同步,最后才能删除挂载的文件夹

cd /
docker stop nfs-client > /dev/null 2>&1 |wc -l
docker rm nfs-client > /dev/null 2>&1 |wc -l
docker rmi -f $(docker images d3fk/nfs-client -qa) > /dev/null 2>&1 |wc -l
sleep 6
cd /
umount /nfs_sync
rm -rf /nfs_sync

注意执行 umount 命令之前需要切到挂载目录的外面,不然你在挂载目录下取消挂载自己,是会报错的,比如:

umount: /nfs_sync:目标忙。
        (有些情况下通过 lsof(8) 或 fuser(1) 可以
         找到有关使用该设备的进程的有用信息)

此外,关闭容器之后,立即取消挂载,有一定几率会报错,因此,这里决定等几秒(sleep 6),保证取消挂载的时候,没有进程在往这个目录里写数据


直接本地安装

小记nfs遇到的问题及解决方法_Run不动了的博客-CSDN博客


启动

systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
exportfs -r

挂载

# 挂载路径
mount -t nfs 192.168.101.144:/nfs_share /nfs_sync
# 开机自动挂载
echo 192.168.101.144:/nfs_share /nfs_sync nfs defaults 0 0 >> /etc/fstab
# 取消挂载路径
umount /nfs_sync
# 取消自动挂载
sed -i '/nfs/d' /etc/fstab