NFS(Network File System)

不是传统意义上的文件系统,而是访问远程文件系统的协议

定义:

网络文件系统,1984由Sun微系统(已被甲骨文公司收购)发布, 通过网络共享目录,让网络上的其他服务器能够挂载访问共享目录内的数据(一般共享视频,图片等静态数据)。

实现原理

  1. NFS协议:使用远程过程访问(RPC)机制,NFS使用一种无状态协议(服务器端不跟踪过去请求,在NFS4已经是有状态了)- 这将简化崩溃后的恢复。所需要做的仅仅是重新提交最后一个请求,这种方式下,客户端无法对崩溃后恢复的服务器和运行慢的服务器进行区分。新文件系统接口,修改了原始Unix文件系统接口,以便将NFS实现为Unix文件系统的扩展,通过将通用文件系统操作与特定实现分离,NFS被内置到Unix内核中。有了这个,内核可以以相同的方式处理所有文件系统和节点,并且可以轻松地将新文件系统添加到内核中,
  2. 虚拟文件系统(VFS)接口:定义可以在文件系统上执行的操作。
  3. 虚拟节点(vnode)接口:定义可以对文件系统中的文件执行的操作。vnode是一种逻辑结构,用于抽象文件或目录是由本地文件系统还是远程文件系统实现的。从这个意义上讲,应用程序必须“只”看到vnode接口,文件的实际位置(本地或远程文件系统)与应用程序无关。此外,该接口允许计算机透明地访问本地不同类型的文件系统(即ext2,ext3,Reiserfs,msdos,proc等)
  4. NFS客户端:使用一个挂载程序,通过一个远程文件系统识别信息-主机:路径,将RPC发送到主机并请求一个(1)路径的文件句柄和(2)服务器网络地址。将本地文件系统中的挂载点标记为与主机地址:路径对关联的远程文件系统。

NFS远程过程调用事例

NFS客户端用户使用RPC实现每个文件操作

fd <- OPEN ("f", READONLY)READ (fd, buf, n)CLOSE (fd)  
### 一个应用程序打开文件"f",发送一个读请求,然后关闭该文件

  1. 虚拟文件系统发现文件"f"在远程文件系统,并且发送请求到NFS客户端。
  2. NFS客户端向NFS服务端发送一个查找请求(LOOKUP(dirth, "f"),将文件句柄(dirth)和要读的文件名传递给远程文件系统。
  3. NFS服务器接收LOOKUP请求,从dirth中提取文件系统标识符和inode号,并要求标识的文件系统在dirth中查找inode号并查找本地目录inode信息。
  4. NFS服务器在由inode编号标识的目录中搜索文件"f"。 如果找到文件,服务器会为"f"创建一个句柄并将其发送回客户端。
  5. NFS客户端在程序的文件描述符表中分配第一个未使用的条目,在该条目中存储对f的文件句柄的引用,并将条目的索引(fd)返回给用户程序。
  6. 接下来,用户程序调用READ(fd,buf,n)
  7. NFS客户端发送RPCREAD(fh,0,n)。
  8. NFS服务器通过fh查找其inode,读取数据并将其以回复消息的方式发送
  9. 当用户程序调用以关闭文件(CLOSE(fd))时,NFS客户端不会发出RPC,因为程序没有修改该文件。

名词解释

  1. fd:文件描述符(file descriptor)的缩写。在网络编程中,fd通常指的是套接字(socket)的文件描述符,用于标识一个网络连接
  2. RPC:Remote Procedure Call 远程过程调用 能使客户端执行其他系统中程序的一种机制
  3. 句柄:是整个编程的基础。句柄是指一个唯一的整数值,一个 4 字节(在 64 位程序中为 8 字节)长值,用于标识应用程序中的不同对象或实例,例如窗口、按钮、图标、滚动条、输出设备、控件或文件等。应用程序可以通过句柄访问相应对象的信息;

句柄控制对象的原理

问题

Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄

句柄控制对象的原理

系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。

程序运行到某时刻的内存快照:

形象解释

身份证(把手)是唯一的,都代表一个特定的实体(对象)。每个人都有一个唯一的身份证号码,通过它我们可以去派出所查看地址登记簿。无论您的地址如何更改,只要您更改地址,您都会去警察局注册并更新您的新地址,这样我们就可以通过身份证号在地址登记簿中找到你的地址,从而找到你这个人。

参考链接:

  1. 一篇文章弄明白什么是NFS文件系统
  2. 深入理解Linux传统的System Call I/O
  3. 套接字(socket)基本知识与工作原理
  4. 句柄的概念详解
posted on 2023-07-19 14:53  /小小白/  阅读(38)  评论(0编辑  收藏  举报