为什么在内核中而不是用户空间中实现Linux NFS服务器?


33

我只是想知道为什么Linux NFS服务器是在内核中而不是在用户空间应用程序中实现的?

我知道一个用户空间NFS守护程序存在,但这不是提供NFS服务器服务的标准方法。

我认为将NFS服务器作为用户空间应用程序运行将是首选方法,因为它可以通过在用户空间而不是内核中运行守护程序来提供更高的安全性。它也适合做一件事情并做得很好的通用Linux原理(并且守护程序不应成为内核的工作)。
实际上,我能想到的在内核中运行的唯一好处是上下文切换可以提高性能(这是有争议的原因)。

那么,有没有任何成文的理由说明为什么按原样实施?我尝试四处搜寻,但找不到任何东西。


似乎有很多混乱,请注意,我不是在问有关挂载文件系统的问题,我是在问有关提供网络文件系统服务器端的问题。有一个非常明显的区别。在本地挂载文件系统需要在内核中支持文件系统(如果没有)(例如samba或unfs3)。


NFS是一个文件系统。用户空间文件系统驱动程序必须使用FUSE,这通常会使性能降低。
jordanm 2012年

@jordanm不,他们没有。实际上,您无法通过FUSE运行网络文件系统(NFS,CIFS / samba,coda等)。FUSE用于在本地计算机上挂载文件系统,而不是为它们服务。
Patrick

没错,我的声明仅适用于客户。
jordanm 2012年

@jordanm甚至没有那么不幸。您可以不使用FUSE挂载文件系统。无论如何,FUSE是一项相对较新的技术,网络文件系统的客户端早在FUSE之前就已存在:-)。FUSE只是提供了一种支持内核未提供的文件系统的方式(不是故意的,只是希望消除误解:-P)
Patrick

2
@StarNamer您仍在谈论客户端。我说的是服务器。您可以运行unfs3(这是一个NFS服务器)而无需任何内核支持。
Patrick

Answers:


25

unfs3据我所知已经死了;Ganesha是目前最活跃的用户空间NFS服务器项目,尽管尚未完全成熟。

尽管Samba服务于不同的协议,但它是在用户空间中运行的成功文件服务器的一个示例。

我没有看到最近的性能比较。

其他一些问题:

  • 普通应用程序通过路径名查找文件,但是nfsd需要能够通过文件句柄查找它们。这很棘手,需要文件系统的支持(并非所有文件系统都可以支持它)。过去不可能从用户空间执行此操作,但是最近添加了内核 name_to_handle_at(2)open_by_handle_at(2)系统调用。
  • 我似乎记得阻止文件锁定调用是一个问题。我不确定这些天用户空间服务器如何处理它们。(您是否在等待锁的服务器线程被占用,还是轮询?)
  • 较新的文件系统语义(更改属性,委托,共享锁)可以首先在内核中更轻松地实现(理论上,它们大多数还没有实现)。
  • 您不需要手动检查权限,配额等,而是想要更改uid并依靠通用内核vfs代码来执行此操作。Linux有一个系统调用(setfsuid(2))应该执行此操作。由于种种原因,我忘记了,我认为在服务器中使用它比应该使用的要复杂得多。

通常,内核服务器的优势是与vfs和导出的文件系统更紧密的集成。我们可以通过提供更多的内核接口(例如文件句柄系统调用)来弥补这一点,但这并不容易。另一方面,如今人们想要导出的某些文件系统(例如gluster)实际上主要生活在用户空间中。内核nfsd可以使用FUSE导出这些文件,但是对于新功能,可能还需要扩展FUSE接口,并且可能存在性能问题。

简短版:好问题!


2
读者应注意,Bruce是linux NFS服务器的维护者,所以大概他知道他在说什么。:)
Dan Pritts 2014年

@derfian仅供参考-您可能想在此评论一下unfs3还活着并搬到Github”的意思
ms-ati

我评论以上内容是因为@derfian或StackOverflow用户(unix.stackexchange.com/users/23034/derfian)是unfs3的维护者,并且最近宣布它还没有死,例如,在此Github评论中
ms-ati

对于由NFS维护人员编写的来说,这个答案非常模糊。
Torsten Bronger


8

Starnamer是正确的(我是Beta测试人员之一)。

将其放到内核中是一种尝试提高超乎寻常的性能(主要是针对PCNFS客户端)的尝试,而一旦解决了该问题,就没有人再次关注它。

在内核中拥有NFS有很多缺陷,其中最重要的是它不能很好地与触摸同一文件系统的其他任何东西配合使用(存在严重的腐败风险),但那时(1993-4)我们没有没有意识到这将成为一个问题。

我们更年轻,更愚蠢,等等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.