LWN: NFS和Samba对Linux kernel还有什么新功能需求吗?

Common needs for Samba and NFS

By Jake Edge

May 15, 2019

LSFMM

Amir Goldstein在2019 Linux Storage, Filesystem, and Memory-Management Summit的最后一天,主持了Samba和NFS的相关讨论。Samba和NFS是Linux生态中两个最主要的网络文件系统。这个讨论会议主要想了解,Samba和NFS是否还迫切希望kernel增加哪些功能?Amir已经有一些想法,也想听听会议上聚集的这些文件系统专家的意见。

他最近开始研究kernel NFS daemon (knfsd),他的公司提供的NAS device的客户很少有人用NFS,大多数都是在用Samba (也就是常说的SMB)。他希望这两个文件系统都能对其他操作系统有更好的支持。

他首先问一些Samba开发者,他们有没有觉得让Linux kernel增加他们需要的功能很困难?从反馈上来看,他感觉Samba开发者好像都被kernel社区开发者给吓退了。他认为最后一次Samba开发者提出功能需求的时候,“他们采用的方法不对”。那次提出的是希望VFS层增加一些Samba特有的功能,例如阻止对某个特定文件的读、写。VFS maintainer(维护者)认为这种改动不合理,无法接受。

而跟NFS开发者进行的讨论中,大家都认为Samba和NFS应该多交流,找到共同点,来推动kernel支持。有些功能,要么是只能在kernel实现,要么是在kernel实现会具有巨大的优势。这样如果能提出一组能实现大家目的的较少的改动,就很有可能被kernel community接受并合入。

他举得第一个例子是opportunistic locks (OpLocks)。Samba文件系统里,当一个用户使用到某个文件的时候,就会申请OpLocks。获取到这个锁之后,就意味着这个用户可以持续不断的操作这个文件,不需要把它的改动随时flush回server端。当其他客户端也访问这个文件的时候,server会收回OpLock。之中模式可以让拥有OpLocks的文件访问非常高效,对系统性能很重要。

Samba使用OpLocks是有严格条件的,就是这块文件系统只用samba暴露出去的情况。比如说,如果同时也有一个NFS server把相同的一片filesystem区域export出去了,那么Samba就不会利用OpLocks机制来加速。这样非常合理,为了数据一致性损失了性能。此外,OpLocks也有two levels,Samba要用的话就两个level都用。

Steve French也提到了一些类似的限制。OpLocks是利用一个key来做区分的,也允许level-1的lock升级到level 2,不过Linux根本不支持这种升级。他不清楚NFS会不会升级lock。Trond Myklebust补充说NFS协议也支持升级,不过Linux同样没有实现这个功能。

Goldstein就在想怎样能让Samba和NFS都支持level 2的OpLocks。他想六月份先去Samba conference (sambaXP)搜集一下大家的反馈。如果要做的话,至少要像Bruce Fields此前在NFS会议中讲的那样,能够跟踪文件系统操作中的各个client客户端,管理好他们拥有的OpLocks以及租期。

针对目录来说,情况更加复杂一些。Goldstein在开发一个能让目录的改动触发通知的机制。他利用了一些hook来发出同步通知消息(synchronous notification)。不过有开发者担心暴露这些信息会有一些安全问题。所以最后可能会用类似OpLocks的租约管理的方式,增加一个timeout,在对端没有回应的时候能够关闭。

Myklebust介绍了NFS使用租期(leases)方式碰到的一个问题,就是time out超时之后不会自动被监测到。这样如果错过了通知时间窗(notification window),文件描述符(file descriptor)就会被关闭,或者被系统拒绝所有对这个文件的访问。这时候就需要采取一些恢复措施。Goldstein说他没有定下来用什么方案解决,只是先把问题提出来,希望大家有更好方案。

接下来,就是文件被打开时候如果指明了share modes,该怎么办。share modes有好几种设置,可以让其他打开这个文件的用户不能读或者写。5年前就有一组patch为了支持这个功能,在VFS层来检查并确保这些share modes生效。而Goldstein认为NFS和Samba应该能创造一组仅有它们两个文件系统使用的lock,来确保两者更好的兼容。可以像是BSP的flock()接口一样。每当调用open()接口的时候,可以用O_DENYWRITE和O_DENYREAD等flag来请求专有访问权限,但是只有在支持这些flag的文件系统上才会强制实行。

Ted Ts’o觉得还是需要有个文档来介绍一下目前碰到的各种问题。尤其是能帮助大家理解,如果不支持这些新功能,就会有什么大麻烦。Samba目前运行的挺不错的,所以更要跟kernel developer好好仔细介绍清楚,为什么Samba需要那些新功能,才能让patch被接受。

Goldstein觉得目前主要是跟其他文件系统介绍一下他的想法和计划,短期内并不指望有很多工作展开。希望能收集到更多可行的建议。