第29章 网络文件系统NFS
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍NFS协议,包括NFS的工作方式、RPC远程过程调用、XDR外部数据表示、NFS挂载和文件访问等。
29.1 引言
NFS的作用
NFS(Network File System):
- 网络文件系统
- 通过网络访问远程文件
- 就像访问本地文件一样
- 透明
- Sun Microsystems开发的
NFS让远程文件像本地一样。
为什么需要NFS
为什么需要NFS:
- 多台机器共享文件
- 不用每台机器都存一份
- 集中管理
- 方便共享
- 透明访问
好处:
- 文件共享
- 集中存储
- 节省空间
- 方便管理
NFS用于文件共享。
NFS的特点
NFS的特点:
-
透明
- 用起来和本地文件一样
- 应用不用改
- 操作系统层面支持
-
无状态
- 服务器不维护客户端状态
- 每个请求都是独立的
- 服务器崩溃了恢复快
- 客户端等服务器起来就行
-
基于RPC
- 用RPC通信
- 远程过程调用
- 像调用本地函数一样调用远程的
-
用UDP或TCP
- 早期用UDP
- 后来也支持TCP
NFS透明、无状态、基于RPC。
本章讨论的内容
本章讨论的内容:
- NFS的工作方式
- RPC远程过程调用
- XDR外部数据表示
- NFS挂载
- 文件访问
- NFS的协议
本章介绍NFS协议。
29.2 RPC:远程过程调用
什么是RPC
RPC(Remote Procedure Call):
- 远程过程调用
- 调用远程计算机上的函数
- 就像调用本地函数一样
- 不用关心网络细节
RPC让远程调用像本地一样。
RPC的工作方式
RPC的工作方式:
-
客户端调用本地的stub函数
- 看起来像普通函数
- 实际上是stub
-
stub把参数打包
- 打包成网络消息
- 序列化
- 用XDR
-
发给服务器
- 网络传输
- UDP或TCP
-
服务器的stub收到
- 解包
- 反序列化
-
调用真正的函数
- 服务器的实际函数
-
返回结果
- 服务器stub打包结果
- 发给客户端
- 客户端stub解包
- 返回给调用者
客户端stub→网络→服务器stub→真实函数。
RPC的好处
RPC的好处:
- 简单
- 像调用本地函数一样
- 不用管网络细节
- 不用自己打包解包
- 开发方便
RPC简化了分布式编程。
RPC的端口映射
RPC的端口映射:
- RPC服务的端口不固定
- 怎么找到服务?
- 用端口映射器(Portmapper)
- 也叫rpcbind
过程:
- 服务启动,注册到端口映射器
- 告诉它我是哪个程序,在哪个端口
- 客户端要调用服务
- 先问端口映射器
- 这个程序在哪个端口
- 端口映射器回答
- 在某个端口
- 客户端连那个端口
- 调用服务
端口映射器帮你找端口。
29.3 XDR:外部数据表示
什么是XDR
XDR(External Data Representation):
- 外部数据表示
- 标准的数据格式
- 不同系统之间传数据
- 统一格式
- 不管你是什么系统,都按这个来
XDR是标准的数据格式。
为什么需要XDR
为什么需要XDR:
- 不同系统数据格式不一样
- 字节序不同(大端小端)
- 数据类型大小不同
- 对齐方式不同
- 直接传过去对方看不懂
解决:
- 都转换成XDR格式再传
- 收到了再转成本地的
- 中间格式统一
- 大家都认识
XDR解决不同系统的兼容问题。
XDR的特点
XDR的特点:
-
大端字节序
- 统一用大端
- 也就是网络字节序
-
4字节对齐
- 所有类型都对齐到4字节
- 不够的补0
-
基本类型
- int, 4字节
- unsigned int, 4字节
- bool, 4字节
- enum, 4字节
- 等等
-
变长类型
- 字符串:长度+内容,对齐到4字节
- 数组:长度+元素
- 结构体:每个元素按顺序
XDR有固定的格式规则。
29.4 NFS的架构
NFS的组成
NFS的组成:
-
NFS协议
- 文件操作
- 读文件、写文件、创建删除…
-
挂载协议(Mount)
- 挂载文件系统
- 建立连接
- 获取文件句柄
-
端口映射器(Portmapper)
- 找端口
- RPC用的
NFS需要几个协议配合。
NFS的版本
NFS的版本:
| 版本 | 说明 |
|---|---|
| NFSv2 | 最早,UDP,32位文件大小,最大2GB |
| NFSv3 | 64位文件大小,更大文件,更多操作,TCP支持 |
| NFSv4 | 有状态,更安全,性能更好,内置挂载 |
不同版本功能不同。
无状态
NFS是无状态的(v2/v3):
- 服务器不维护客户端的状态
- 每个请求都是独立的
- 服务器不知道客户端在干什么
- 崩溃了恢复快
好处:
- 服务器简单
- 崩溃恢复快
- 客户端重试就行
坏处:
- 有些功能不好实现
- 比如文件锁
- 需要额外的协议
NFSv2/v3是无状态的。
29.5 NFS挂载
什么是挂载
挂载(Mount):
- 把远程的文件系统
- 挂到本地的一个目录
- 之后访问这个目录
- 就是访问远程的文件系统
挂载把远程文件系统接到本地。
挂载的过程
挂载的过程(v2/v3):
-
客户端要挂载
- 知道服务器地址和路径
-
找挂载服务的端口
- 问端口映射器
- 挂载服务在哪个端口
-
调用挂载过程
- 客户端调用挂载服务的挂载过程
- 说我要挂载这个路径
-
服务器验证
- 检查客户端能不能挂载
- 可以的话返回文件句柄
-
客户端拿到文件句柄
- 之后用这个句柄访问文件
- 挂载完成
挂载用挂载协议。
文件句柄
文件句柄(File Handle):
- 标识一个文件
- 服务器给客户端的
- 客户端用这个句柄访问文件
- 服务器知道是哪个文件
特点:
- 不透明
- 客户端不用管里面是什么
- 服务器自己知道就行
- 每个文件一个
文件句柄标识文件。
29.6 NFS的文件操作
常见的NFS操作
常见的NFS操作:
| 操作 | 说明 |
|---|---|
| GETATTR | 获取文件属性 |
| SETATTR | 设置文件属性 |
| LOOKUP | 查找文件 |
| READ | 读文件 |
| WRITE | 写文件 |
| CREATE | 创建文件 |
| REMOVE | 删除文件 |
| RENAME | 重命名 |
| MKDIR | 创建目录 |
| RMDIR | 删除目录 |
| READDIR | 读目录 |
| ACCESS | 检查权限 |
很多文件操作。
读文件的过程
读文件的过程:
-
客户端要读文件
- 知道文件名
-
LOOKUP找文件
- 从根目录开始找
- 一级一级找
- 找到文件,拿到文件句柄
-
READ读数据
- 用文件句柄
- 指定偏移和长度
- 读数据
-
服务器返回数据
- 客户端拿到数据
- 给应用
先找文件,再读。
无状态的影响
无状态的影响:
问题:
- 服务器崩溃了
- 客户端不知道
- 继续发请求
- 等服务器恢复了
- 请求还能继续
- 客户端只是觉得慢了一点
好处:
- 服务器恢复快
- 客户端不用重新挂载
- 透明
无状态让崩溃恢复简单。
29.7 小结
NFS概述
-
什么是NFS
- 网络文件系统
- 远程文件像本地一样
- 透明访问
-
特点
- 透明
- 无状态(v2/v3)
- 基于RPC
- UDP/TCP
-
好处
- 文件共享
- 集中存储
- 节省空间
RPC远程过程调用
-
什么是RPC
- 远程过程调用
- 像调用本地函数一样
-
工作方式
- stub函数
- 打包参数
- 网络传输
- 解包调用
- 返回结果
-
端口映射器
- 找RPC服务的端口
- 注册和查询
XDR外部数据表示
-
什么是XDR
- 标准数据格式
- 不同系统之间传数据
-
为什么需要
- 不同系统格式不一样
- 统一中间格式
-
特点
- 大端
- 4字节对齐
- 各种类型的编码
NFS架构
-
组成
- NFS协议:文件操作
- 挂载协议:挂载
- 端口映射器:找端口
-
版本
- v2:老,UDP,2GB限制
- v3:64位,TCP,更多功能
- v4:有状态,更安全
-
无状态
- 服务器不维护状态
- 每个请求独立
- 崩溃恢复快
NFS挂载
-
什么是挂载
- 把远程文件系统挂到本地目录
-
过程
- 找挂载端口
- 调用挂载
- 验证
- 返回文件句柄
-
文件句柄
- 标识文件
- 不透明
- 客户端用它访问
NFS文件操作
-
常见操作
- GETATTR, SETATTR
- LOOKUP, READ, WRITE
- CREATE, REMOVE, RENAME
- MKDIR, RMDIR, READDIR
-
读文件过程
- LOOKUP找文件
- READ读数据
-
无状态的好处
- 崩溃恢复快
- 透明
关键概念
-
NFS
- 网络文件系统
- 透明访问
-
RPC
- 远程过程调用
- stub
-
XDR
- 外部数据表示
- 标准格式
-
挂载
- 挂远程文件系统
- 文件句柄
-
无状态
- 服务器不维护状态
- 崩溃恢复快