JF Linux Kernel 2.6 Documentation: /usr/src/linux/Documentation/filesystems/locks.txt

filesystems/locks.txt

ファイルロック・リリースノート [プレインテキスト版]


                      ファイルロック・リリースノート

                Andy Walker <andy@lysaker.kvaerner.no>

                           1997 年 5 月 12 日


1. What's New?
--------------

1.1 破棄された Flock エミュレーション
-------------------------------------

カーネル内の古い flock(2) エミュレーションは、1.3.x 系のカーネルに
おいて、適切な BSD 互換 flock(2) サポートに置き換えられました。2.1.x
系カーネルのリリースでは、古いエミュレーションのサポートは完全に削除
されたので、このお荷物を運んでいく必要はもうありません。

このことは、誰にとっても問題とはならないはずです。なぜなら、いずれに
しても 2.1.x 系カーネルを使用している人は全て、C ライブラリを適切な
バージョンへとアップデートしているはずだからです ("linux/Documentation/
Changes" ファイルを参照してください)。


1.2 再度、ロックの混合使用を許可する
------------------------------------

1.2.1 典型的な問題 - Sendmail
-----------------------------

sendmail は古い flock() エミュレーションを使用できなかったので、導入
されている sendmail の多くは、flock() のかわりに fcntl() を使用して
います。例えば、Slackware 3.0 がそうです。これにより、sendmail がエイ
リアスファイルを再構築するように設定された場合に、他の捕えにくい問題が
幾つか発生しました。Sendmail は aliases.dir ファイルを fcntl() でロック
しようとしましたが、同時に、GDBM ルーチンはこのファイルを flock() で
ロックしようとしました。1.3.96 以前のカーネルでは、これが原因で、時間
超過または非常に重いメール負荷により、デッドロックしたプロセスと共に
最終的にはカーネルも完全にロックしてしまうというデッドロックが発生する
結果となりました。

1.2.2 解決方法
--------------

多くの実験と議論を経て、私が選んだ解決方法は、flock() と fcntl() が
お互いのことを気にかけないようにする、というものです。両方とも存在でき、
それぞれお互いに影響を与えることはありません。

二つのロック形式を協調動作させることを望んだのですが、競合条件とデッド
ロック条件があまりに多過ぎたため、現在のものが唯一の現実的な解でした。
これは、例えば SunOS 4.1.x やその他複数の商用 Unix と同じ立場となります。
協調動作をする flock() と fcntl() をサポートする OS は、fcntl() を使って
flock() をエミュレートする OS だけですが、そうすることによる問題が全て
つきまとうことになります。


1.3 マウントオプションとしての強制ロック
----------------------------------------

'Documentation/mandatory.txt' で述べられているように、今回のリリース
以前では、強制ロックは、マウントされるファイルシステムすべてで有効と
なる、全般的な設定オプションでした。このやり方には、多くの危険が内在
しており、それは、強制ロックが存在するファイルを読み込むように指示
することで NFS サーバをフリーズさせることができる、ということだけに
とどまりませんでした。

今回のカーネルリリースから、マウントオプション 'mand' と 'nomand' を
使用することにより、ファイルシステムごとに強制ロックのオン・オフが
できるようになりました。デフォルトでは、強制ロックは許可されません。
意図するところは、強制ロックは、固有の要求が上がってきたときにロー
カルファイルシステムでのみ有効にすべきである、ということです。

更新されたバージョンの mount(8) が入手できるまでは、mount のソース
コード (Rick Faith の util-linux-2.5 パッケージと共に配布されるバー
ジョンに基づくもの) に次のパッチをあてる必要があるかもしれません。

*** mount.c.orig        Sat Jun  8 09:14:31 1996
--- mount.c     Sat Jun  8 09:13:02 1996
***************
*** 100,105 ****
--- 100,107 ----
    { "noauto", 0, MS_NOAUTO    },      /* 明示的にしかマウントできない */
    { "user",   0, MS_USER      },      /* 一般ユーザによるマウントを許可する */
    { "nouser", 1, MS_USER      },      /* 一般ユーザによるマウントを許可しない */
+   { "mand",   0, MS_MANDLOCK  },      /* このファイルシステム上で強制ロックを許可する */
+   { "nomand", 1, MS_MANDLOCK  },      /* このファイルシステム上で強制ロックを許可しない */
    /* ここに新しいオプションを加える */
  #ifdef MS_NOSUB
    { "sub",    1, MS_NOSUB     },      /* サブマウントを許可する */

------------------------------------------------------------
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日:   2004/04/17
翻訳者:   川崎 貴彦 <takahiko(a)hakubi.co.jp>

Linux カーネル 2.6 付属文書一覧へ戻る