第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的特点:

  1. 透明

    • 用起来和本地文件一样
    • 应用不用改
    • 操作系统层面支持
  2. 无状态

    • 服务器不维护客户端状态
    • 每个请求都是独立的
    • 服务器崩溃了恢复快
    • 客户端等服务器起来就行
  3. 基于RPC

    • 用RPC通信
    • 远程过程调用
    • 像调用本地函数一样调用远程的
  4. 用UDP或TCP

    • 早期用UDP
    • 后来也支持TCP

NFS透明、无状态、基于RPC。


本章讨论的内容

本章讨论的内容:

  • NFS的工作方式
  • RPC远程过程调用
  • XDR外部数据表示
  • NFS挂载
  • 文件访问
  • NFS的协议

本章介绍NFS协议。


29.2 RPC:远程过程调用

什么是RPC

RPC(Remote Procedure Call):

  • 远程过程调用
  • 调用远程计算机上的函数
  • 就像调用本地函数一样
  • 不用关心网络细节

RPC让远程调用像本地一样。


RPC的工作方式

RPC的工作方式:

  1. 客户端调用本地的stub函数

    • 看起来像普通函数
    • 实际上是stub
  2. stub把参数打包

    • 打包成网络消息
    • 序列化
    • 用XDR
  3. 发给服务器

    • 网络传输
    • UDP或TCP
  4. 服务器的stub收到

    • 解包
    • 反序列化
  5. 调用真正的函数

    • 服务器的实际函数
  6. 返回结果

    • 服务器stub打包结果
    • 发给客户端
    • 客户端stub解包
    • 返回给调用者

客户端stub→网络→服务器stub→真实函数。


RPC的好处

RPC的好处:

  • 简单
  • 像调用本地函数一样
  • 不用管网络细节
  • 不用自己打包解包
  • 开发方便

RPC简化了分布式编程。


RPC的端口映射

RPC的端口映射:

  • RPC服务的端口不固定
  • 怎么找到服务?
  • 用端口映射器(Portmapper)
  • 也叫rpcbind

过程:

  1. 服务启动,注册到端口映射器
    • 告诉它我是哪个程序,在哪个端口
  2. 客户端要调用服务
    • 先问端口映射器
    • 这个程序在哪个端口
  3. 端口映射器回答
    • 在某个端口
  4. 客户端连那个端口
    • 调用服务

端口映射器帮你找端口。


29.3 XDR:外部数据表示

什么是XDR

XDR(External Data Representation):

  • 外部数据表示
  • 标准的数据格式
  • 不同系统之间传数据
  • 统一格式
  • 不管你是什么系统,都按这个来

XDR是标准的数据格式。


为什么需要XDR

为什么需要XDR:

  • 不同系统数据格式不一样
  • 字节序不同(大端小端)
  • 数据类型大小不同
  • 对齐方式不同
  • 直接传过去对方看不懂

解决:

  • 都转换成XDR格式再传
  • 收到了再转成本地的
  • 中间格式统一
  • 大家都认识

XDR解决不同系统的兼容问题。


XDR的特点

XDR的特点:

  1. 大端字节序

    • 统一用大端
    • 也就是网络字节序
  2. 4字节对齐

    • 所有类型都对齐到4字节
    • 不够的补0
  3. 基本类型

    • int, 4字节
    • unsigned int, 4字节
    • bool, 4字节
    • enum, 4字节
    • 等等
  4. 变长类型

    • 字符串:长度+内容,对齐到4字节
    • 数组:长度+元素
    • 结构体:每个元素按顺序

XDR有固定的格式规则。


29.4 NFS的架构

NFS的组成

NFS的组成:

  1. NFS协议

    • 文件操作
    • 读文件、写文件、创建删除…
  2. 挂载协议(Mount)

    • 挂载文件系统
    • 建立连接
    • 获取文件句柄
  3. 端口映射器(Portmapper)

    • 找端口
    • RPC用的

NFS需要几个协议配合。


NFS的版本

NFS的版本:

版本说明
NFSv2最早,UDP,32位文件大小,最大2GB
NFSv364位文件大小,更大文件,更多操作,TCP支持
NFSv4有状态,更安全,性能更好,内置挂载

不同版本功能不同。


无状态

NFS是无状态的(v2/v3):

  • 服务器不维护客户端的状态
  • 每个请求都是独立的
  • 服务器不知道客户端在干什么
  • 崩溃了恢复快

好处:

  • 服务器简单
  • 崩溃恢复快
  • 客户端重试就行

坏处:

  • 有些功能不好实现
  • 比如文件锁
  • 需要额外的协议

NFSv2/v3是无状态的。


29.5 NFS挂载

什么是挂载

挂载(Mount):

  • 把远程的文件系统
  • 挂到本地的一个目录
  • 之后访问这个目录
  • 就是访问远程的文件系统

挂载把远程文件系统接到本地。


挂载的过程

挂载的过程(v2/v3):

  1. 客户端要挂载

    • 知道服务器地址和路径
  2. 找挂载服务的端口

    • 问端口映射器
    • 挂载服务在哪个端口
  3. 调用挂载过程

    • 客户端调用挂载服务的挂载过程
    • 说我要挂载这个路径
  4. 服务器验证

    • 检查客户端能不能挂载
    • 可以的话返回文件句柄
  5. 客户端拿到文件句柄

    • 之后用这个句柄访问文件
    • 挂载完成

挂载用挂载协议。


文件句柄

文件句柄(File Handle):

  • 标识一个文件
  • 服务器给客户端的
  • 客户端用这个句柄访问文件
  • 服务器知道是哪个文件

特点:

  • 不透明
  • 客户端不用管里面是什么
  • 服务器自己知道就行
  • 每个文件一个

文件句柄标识文件。


29.6 NFS的文件操作

常见的NFS操作

常见的NFS操作:

操作说明
GETATTR获取文件属性
SETATTR设置文件属性
LOOKUP查找文件
READ读文件
WRITE写文件
CREATE创建文件
REMOVE删除文件
RENAME重命名
MKDIR创建目录
RMDIR删除目录
READDIR读目录
ACCESS检查权限

很多文件操作。


读文件的过程

读文件的过程:

  1. 客户端要读文件

    • 知道文件名
  2. LOOKUP找文件

    • 从根目录开始找
    • 一级一级找
    • 找到文件,拿到文件句柄
  3. READ读数据

    • 用文件句柄
    • 指定偏移和长度
    • 读数据
  4. 服务器返回数据

    • 客户端拿到数据
    • 给应用

先找文件,再读。


无状态的影响

无状态的影响:

问题:

  • 服务器崩溃了
  • 客户端不知道
  • 继续发请求
  • 等服务器恢复了
  • 请求还能继续
  • 客户端只是觉得慢了一点

好处:

  • 服务器恢复快
  • 客户端不用重新挂载
  • 透明

无状态让崩溃恢复简单。


29.7 小结

NFS概述

  1. 什么是NFS

    • 网络文件系统
    • 远程文件像本地一样
    • 透明访问
  2. 特点

    • 透明
    • 无状态(v2/v3)
    • 基于RPC
    • UDP/TCP
  3. 好处

    • 文件共享
    • 集中存储
    • 节省空间

RPC远程过程调用

  1. 什么是RPC

    • 远程过程调用
    • 像调用本地函数一样
  2. 工作方式

    • stub函数
    • 打包参数
    • 网络传输
    • 解包调用
    • 返回结果
  3. 端口映射器

    • 找RPC服务的端口
    • 注册和查询

XDR外部数据表示

  1. 什么是XDR

    • 标准数据格式
    • 不同系统之间传数据
  2. 为什么需要

    • 不同系统格式不一样
    • 统一中间格式
  3. 特点

    • 大端
    • 4字节对齐
    • 各种类型的编码

NFS架构

  1. 组成

    • NFS协议:文件操作
    • 挂载协议:挂载
    • 端口映射器:找端口
  2. 版本

    • v2:老,UDP,2GB限制
    • v3:64位,TCP,更多功能
    • v4:有状态,更安全
  3. 无状态

    • 服务器不维护状态
    • 每个请求独立
    • 崩溃恢复快

NFS挂载

  1. 什么是挂载

    • 把远程文件系统挂到本地目录
  2. 过程

    • 找挂载端口
    • 调用挂载
    • 验证
    • 返回文件句柄
  3. 文件句柄

    • 标识文件
    • 不透明
    • 客户端用它访问

NFS文件操作

  1. 常见操作

    • GETATTR, SETATTR
    • LOOKUP, READ, WRITE
    • CREATE, REMOVE, RENAME
    • MKDIR, RMDIR, READDIR
  2. 读文件过程

    • LOOKUP找文件
    • READ读数据
  3. 无状态的好处

    • 崩溃恢复快
    • 透明

关键概念

  1. NFS

    • 网络文件系统
    • 透明访问
  2. RPC

    • 远程过程调用
    • stub
  3. XDR

    • 外部数据表示
    • 标准格式
  4. 挂载

    • 挂远程文件系统
    • 文件句柄
  5. 无状态

    • 服务器不维护状态
    • 崩溃恢复快

NFS网络文件系统