文件锁发布说明¶
Andy Walker <andy@lysaker.kvaerner.no>
1997年5月12日
1. 新特性?¶
1.1 损坏的Flock模拟¶
内核中的旧 flock(2) 模拟在1.3.x系列的内核中被替换为正确的BSD兼容的 flock(2) 支持。随着2.1.x内核系列的发布,对旧模拟的支持已完全删除,因此我们无需永远携带此包袱。
这不应该给任何人带来问题,因为使用2.1.x内核的每个人都应该已将其C库更新到合适的版本(请参阅文件“编译内核的最低要求”。)
1.2 再次允许混合锁¶
1.2.1 典型问题 - Sendmail¶
由于 sendmail 无法使用旧的 flock() 模拟,因此许多 sendmail 安装使用 fcntl() 而不是 flock()。例如,Slackware 3.0 就是如此。如果 sendmail 配置为重建别名文件,则会出现一些其他微妙的问题。 Sendmail 尝试使用 fcntl() 锁定 aliases.dir 文件,同时 GDBM 例程尝试使用 flock() 锁定此文件。 在 1.3.96 之前的内核中,这可能导致死锁,随着时间的推移或在非常大的邮件负载下,最终会导致内核因死锁进程而完全锁定。
1.2.2 解决方案¶
经过大量的实验和讨论后,我选择的解决方案是使 flock() 和 fcntl() 锁彼此忽略。 两者都可以存在,并且都不会对另一个产生任何影响。
我希望两种锁定方式能够协同工作,但是存在太多的竞争和死锁情况,以至于当前的解决方案是唯一可行的解决方案。 这使我们处于与 SunOS 4.1.x 和其他一些商业 Unix 相同的位置。 唯一支持协同 flock()/fcntl() 的操作系统是那些使用 fcntl() 模拟 flock() 的操作系统,这带来了所有隐含的问题。
1.3 作为挂载选项的强制锁定¶
在此版本之前,强制锁定是一个适用于所有已挂载文件系统的通用配置选项。 这存在许多固有的危险,其中最重要的是能够通过要求 NFS 服务器读取存在强制锁的文件来冻结 NFS 服务器。
该选项已在 Kernel v5.14 中删除。