文件锁定发布说明¶
Andy Walker <andy@lysaker.kvaerner.no>
1997年5月12日
1. 新增功能?¶
1.1 损坏的 Flock 模拟¶
在 1.3.x 系列内核中,内核中旧的 flock(2) 模拟被替换为正确的 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 中删除。