技术编程|低调的 Linux 文件系统家族( 十 )


当 Linux 启动时会在多用户之前运行 shell 脚本 /etc/rc。 可以将挂载远程文件系统的命令写入该脚本中 , 这样就可以在允许用户登陆之前自动挂载必要的远程文件系统 。 大部分 Linux 版本是支持 自动挂载 的 。 这个特性会支持将远程目录和本地目录进行关联 。
相对于手动挂载到 /etc/rc 目录下 , 自动挂载具有以下优势
如果列出的 /etc/rc 目录下出现了某种故障 , 那么客户端将无法启动 , 或者启动会很困难、延迟或者伴随一些出错信息 , 如果客户根本不需要这个服务器 , 那么手动做了这些工作就白费了 。
允许客户端并行的尝试一组服务器 , 可以实现一定程度的容错率 , 并且性能也可以得到提高 。
如果列出的 /etc/rc 目录下出现了某种故障 , 那么客户端将无法启动 , 或者启动会很困难、延迟或者伴随一些出错信息 , 如果客户根本不需要这个服务器 , 那么手动做了这些工作就白费了 。
允许客户端并行的尝试一组服务器 , 可以实现一定程度的容错率 , 并且性能也可以得到提高 。
另一方面 , 我们默认在自动挂载时所有可选的文件系统都是相同的 。 由于 NFS 不提供对文件或目录复制的支持 , 用户需要自己确保这些所有的文件系统都是相同的 。 因此 , 大部分的自动挂载都只应用于二进制文件和很少改动的只读的文件系统 。
第二个 NFS 协议是为文件和目录的访问而设计的 。 客户端能够通过向服务器发送消息来操作目录和读写文件 。 客户端也可以访问文件属性 , 比如文件模式、大小、上次修改时间 。 NFS 支持大多数的 Linux 系统调用 , 但是 open 和 close 系统调用却不支持 。
不支持 open 和 close 并不是一种疏忽 , 而是一种刻意的设计 , 完全没有必要在读一个文件之前对其进行打开 , 也没有必要在读完时对其进行关闭 。
?
NFS 使用了标准的 UNIX 保护机制 , 使用 rwx 位来标示 所有者(owner) 、 组(groups) 、 其他用户。 最初 , 每个请求消息都会携带调用者的 groupId 和 userId , NFS 会对其进行验证 。 事实上 , 它会信任客户端不会发生欺骗行为 。 可以使用公钥密码来创建一个安全密钥 , 在每次请求和应答中使用它验证客户端和服务器 。
NFS 实现
即使客户端和服务器的代码实现是独立于 NFS 协议的 , 大部分的 Linux 系统会使用一个下图的三层实现 , 顶层是系统调用层 , 系统调用层能够处理 open 、 read 、 close 这类的系统调用 。 在解析和参数检查结束后调用第二层 ,虚拟文件系统 (VFS) 层 。

技术编程|低调的 Linux 文件系统家族
本文插图

【技术编程|低调的 Linux 文件系统家族】VFS 层的任务是维护一个表 , 每个已经打开的文件都在表中有一个表项 。 VFS 层为每一个打开的文件维护着一个 虚拟i节点, 简称为 v - node 。 v 节点用来说明文件是本地文件还是远程文件 。 如果是远程文件的话 , 那么 v - node 会提供足够的信息使客户端能够访问它们 。 对于本地文件 , 会记录其所在的文件系统和文件的 i-node, 因为现代操作系统能够支持多文件系统 。 虽然 VFS 是为了支持 NFS 而设计的 , 但是现代操作系统都会使用 VFS , 而不管有没有 NFS 。


推荐阅读