Linux Kernel 2.6 Documentation:
/usr/src/linux/Documentation/filesystems/locks.txt
filesystems/locks.txt
ファイルロック・リリースノート
[プレインテキスト版]
- 原著作者: Andy Walker <andy@lysaker.kvaerner.no>
- 翻訳者: 川崎 貴彦 <takahiko(a)hakubi.co.jp>
- バージョン: 2.6.5
- 翻訳日時: 2004/04/17
ファイルロック・リリースノート
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 付属文書一覧へ戻る