nfs详解


难度 中等

nfs简介

NFS是Network File System的缩写,即网络文件系统,是一种使用于分散式文件系统的协定。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

这个NFS服务器可以让你的PC来将网络远程的NFS服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样。

除了可以在unix系统间文件共享外,windows也可以使用nfs客户端挂载网络磁盘。windows默认关闭了nfs功能,若要开启需要在程序功能里开启,开启后windows会运行对应的nfs服务,此时就可以把nfs server共享的文件挂载到windows本地。

nfs工作原理

nfs使用客户端和服务器模式,服务端会监听多个服务端口(主要是2049和111(nfs4之前需要监听)),客户端连接监听的端口进行文件共享。中间的通信采用RPC(远程过程调用)的方式。

因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口才没有固定住, 而是随机取用一些未被使用的小于 1024 的端口来作为传输之用。

因为服务端使用随机的端口,需要有一种机制告诉客户端连接哪几个端口。因而nfs在服务端会使用固定的端口来运行rpcbind(或者是portmap), 最主要的功能就是在指定每个 NFS 功能所对应的端口号,并且回报给客户端,让客户端可以连接到正确的端口上去。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序,或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。事实上,有很多这样的服务器都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是 RPC server 的一种。

rpcbind如何知道每个nfs的端口

  • 当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个埠口对应的 NFS 功能,然后 RPC 又是固定使用 111 端口来监听客户端的需求并报客户端正确的埠口, 所以当然可以让 NFS 的启动更为轻松愉快了。

  • 要启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。另外,RPC 若重新启动时,原本注册的数据会不见,因此 RPC 重新启动后,它管理的所有服务都要重新启动来重新向 RPC 注册。

客户端如何向NFS服务端交换数据数据

  1. 客户端会向服务器端的 RPC 的111端口发出 NFS 档案存取功能的询问要求
  2. 服务器端找到对应的已注册的 NFS 守护进程端口后,会回报给客户端
  3. 客户端了解正确的端口后,就可以直接与 NFS 守护进程来联机

nfs主要进程

  • rpcbind(portmap)
    主要负责RPC端口和守护进程的映射关系,在启动nfs之前需要先启动这个进程。
  • rpc.nfsd
    管理客户端是否能够登入主机的权限,其中还包含这个登入者的 ID 的判别。
  • rpc.mountd
    这个守护进程主要的功能,则是在管理 NFS 的档案系统,用于给用户提供访问令牌

nfs版本

nfs共发布了3个版本:NFSv2、NFSv3、NFSv4,NFSv4包含两个次版本NFSv4.0和NFSv4.1。

不同的nfs版本所需要开发的端口不同:

协议版本 开发端口
nfs3 111,445
nfs4 445

服务端安装

  1. 安装server
yum install rpcbind nfs-utils
  1. 配置共享文件
echo "/data *(rw,sync,root_squash)" >> /etc/exports

其中*表示不限制ip,任何ip均可访问。括号中的rw是对权限或者其他选项的控制,具体如下:

  • ro 该主机对该共享目录有只读权限

  • rw 该主机对该共享目录有读写权限

  • root_squash 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户

  • no_root_squash 客户机用root访问该共享文件夹时,不映射root用户

  • all_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户

  • anonuid 将客户机上的用户映射成指定的本地用户ID的用户

  • anongid 将客户机上的用户映射成属于指定的本地用户组ID

  • sync 资料同步写入到内存与硬盘中

  • async 资料会先暂存于内存中,而非直接写入硬盘

  • insecure 允许从这台机器过来的非授权访问

  • subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)

  • no_subtree_check 和上面相对,不检查父目录权限

  • wdelay 如果多个用户要写入NFS目录,则归组写入(默认)

  • no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。

  • hide 在NFS共享目录中不共享其子目录

  • no_hide 共享NFS目录的子目录

  • secure NFS通过1024以下的安全TCP/IP端口发送

  • insecure NFS通过1024以上的端口发送

  1. 使共享目录生效
exportfs -rv
  1. 启动nfs
systemctl start nfs
  1. 查看共享
showmount -e localhost

客户端连接

linux

mount localhost:/data /mnt

windows

需要在程序与功能中开启nfs相关功能。

开启后打开命令行就可以正常使用mount命令。

mount \\ipdata H:

reference

  1. https://www.cnblogs.com/ludongguoa/p/15313140.html
  2. https://blog.csdn.net/qq_36357820/article/details/78488077

文章作者: growdu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 growdu !
  目录
分类导航
随笔3 AI29 计算机基础13 算法1 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库59 数据库深入93 数据库93 Docker11 DPDK26 编辑工具4 Elasticsearch4 FAQ1 Go Web1 hometown2 编程语言16 人生11 网络9 Linux38 OPC1 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 stock1 存储5 成长之路1 工具20 视频作品1 VPP18 Vue13 Web1 代码示例11 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
PostgreSQL 逻辑复制全链路:以一个真实事务为例,从 `INSERT` 到 `apply` 的源码级旅程
数据库🔥 2162
2
PostgreSQL 逻辑复制 Stream 执行逻辑源码级拆解:从 reorderbuffer 触发到订阅端落盘回放
数据库🔥 1765
3
PostgreSQL 行锁机制源码级深度拆解:4 种锁模式 + xmax + MultiXact 的完整链路
数据库🔥 1656
4
PostgreSQL reorderbuffer.c 函数级源码全集:5615 行 / 95 个函数的逐函数解析
数据库深入🔥 1650
5
PostgreSQL 目录快照源码级深度拆解:系统表读取的 MVCC 真相与失效机制
数据库🔥 1604
6
13 逻辑复制深入
数据库深入🔥 1570
7
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
8
PostgreSQL 读一行数据源码级深度拆解:MVCC 在每个环节的落点
数据库🔥 1464
9
PostgreSQL WAL 记录类型完全指南:21 个 RMGR × 80+ 种记录的源码级拆解
数据库🔥 1431
10
一文读懂openguass dcf网络模块
集群🔥 1420
11
PostgreSQL 元数据存储机制:从磁盘文件到内存缓存,`pg_class` 撑起的整个系统表体系
数据库🔥 1411
12
openGauss 并行解码设计原理深度拆解:reader + 多 worker + CSN 三层架构的源码级剖析
数据库深入🔥 1344
13
逻辑复制源码分析
数据库深入🔥 1327
14
PostgreSQL 逻辑复制:catalog 改动、可见性判定与 xmin/xmax 推进全景
数据库深入🔥 1317
15
自托管服务全家桶:从原文方案到可复制实操手册
人生🔥 1278
16
PostgreSQL CREATE_REPLICATION_SLOT 端到端源码分析:从 SQL 到 snapbuild 状态机的完整链路(每个函数每个参数)
数据库深入🔥 1277
17
PostgreSQL syscache 模块源码深度拆解:CatCache 数据结构、LRU 哈希表、cache invalidation 全链路
数据库深入🔥 1216
18
PostgreSQL 18 内核数据结构全景:RangeVar 与 20+ 个核心数据结构源码级拆解
数据库🔥 1158
19
PostgreSQL 逻辑复制里 `RUNNING_XACTS` 写入机制与快照 `xmin / xmax / xip` 的演化:源码级深度拆解
数据库🔥 1119
20
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094