ファイルロック・リリースノート Andy Walker 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 翻訳者: 川崎 貴彦