我只是想知道为什么Linux NFS服务器在内核中实现而不是用户空间应用程序?
我知道userspace NFS daemon存在,但它不是提供NFS服务器服务的标准方法.
我认为将NFS服务器作为用户空间应用程序运行将是首选方法,因为它可以提供额外的安全性,在用户空间而不是内核中运行守护进程.它也适合普通的Linux主体做一件事并做得很好(并且守护进程不应该是内核的工作).
事实上,我能想到的在内核中运行的唯一好处是上下文切换带来的性能提升(这是一个值得商榷的原因).
那么有没有任何记录的原因,为什么它的实现方式呢?我试着用谷歌搜索但找不到任何东西.
似乎有很多混乱,请注意我不是在询问有关挂载文件系统的问题,我在询问是否提供了网络文件系统的服务器端.有一个非常明显的区别.在本地挂载文件系统需要支持内核中的文件系统,前提是它不支持(例如samba或unfs3).
解决方法:
据我所知,unfs3已经死了; Ganesha是目前最活跃的用户空间NFS服务器项目,虽然还不完全成熟.
虽然它提供不同的协议,但Samba是一个成功的例子
在用户空间中运行的文件服务器.
我没有看到最近的性能比较.
其他一些问题:
>普通应用程序按路径名查找文件,但nfsd需要能够
通过filehandle查找它们.这很棘手,需要得到支持
文件系统(并非所有文件系统都可以支持它).在过去它不是
可以从用户空间执行此操作,但已添加了更新的内核
name_to_handle_at(2)和open_by_handle_at(2)系统调用.
>我似乎记得阻止文件锁定调用是一个问题;我不确定
这些天用户空间服务器如何处理它们. (你绑定一个服务器线程
等待锁定,还是你的民意调查?)
>较新的文件系统语义(更改属性,委托,共享锁)
可以实施
在内核中更容易(理论上 – 它们大部分还没有).
>您不希望手动检查权限,配额等
你想改变你的uid并依赖普通的内核vfs代码来做
那. Linux有一个系统调用(setfsuid(2))应该这样做.对于
我忘记的原因,我认为在服务器中使用它更加复杂
比应该的.
通常,内核服务器的优势是与vfs和导出的文件系统更紧密地集成.我们可以通过提供更多内核接口(例如文件句柄系统调用)来弥补这一点,但这并不容易.另一方面,现在人们想要导出的一些文件系统(如gluster)实际上主要存在于用户空间中.这些可以由内核nfsd使用FUSE导出 – 但是对于较新的功能可能还需要对FUSE接口进行扩展,并且可能存在性能问题.
简短版:好问题!
标签:linux,kernel,nfs
来源: https://codeday.me/bug/20190808/1623303.html