
/dev/null
ディレクトリ(または「ブラックホール」ディレクトリ)を作成して、そこに書き込まれたすべてのファイルが実際には記録されずに消えるようにしたいと思います。
ディレクトリに大きな一時ファイルを書き込むアプリケーションがあります。私はファイル名を制御することはできず、そのファイルの内容にはあまり興味がありません。定期的にこれらのファイルを削除するスクリプトを書くことができますが、ファイルは非常に高速に記録され、ディスクがいっぱいになります。私はよりスマートなものを探しています。実際には、書き込みがもう一方の端から削除されても、アプリケーションがこれらのファイルを書いていると思うようにします。
また見てくださいこれ古い関連スレッド。
答え1
私が知っている限り、UNIXではデフォルトではサポートされていませんが、ほとんどすべてのことができます。ヒューズ。少なくともnullfs1の実装、すべてのファイルが存在し、同様に動作するファイルシステムです/dev/null
(これが私が見た唯一の実装ではありません)。
^ 比較しないでください*BSDナルフ、これは次のようになります。ファイルシステムバインディング。
答え2
もう一つのアプローチはLD_PRELOAD
ラッパーです。デフォルトでは、libc.soの前にロードし、何かへopen()
の呼び出しを傍受して予想されるファイルパスを確認し、/dev/null
それを置き換えてターゲットディレクトリに存在することを確認する小さな共有ライブラリです。
これの利点は、(a)完全にユーザースペースにあります。カーネルハッキングは必要ありません。 (b)障害のある単一のアプリケーションにのみ影響します。
簡単な例は次のとおりです。http://www.noah.org/wiki/LD_PRELOAD_notesaccess()
しかし、あなたの場合は、open()
&creat()
システムコールを傍受したいと思います。より完全な実装のためにchdir()
、、、accessat()
およびopenat()
その他の項目を傍受することもできます。
答え3
私は基本的に、nullfsvfsというブラックホールファイルシステムであるLinuxカーネルのramfsの例に基づいてカーネルモジュールを作成しました。 FUSEシステムを実装するには、ユーザー空間からカーネル空間にデータをコピーする必要があります。これは、カーネルモジュールとして直接実装するよりもかなり遅いです。望むより:
答え4
プログラムがこれらのログを閉じることができないほど愚かな場合、ログファイルを開いた後もエラーをチェックしないのではないでしょうか。仮想読み取り専用ファイルシステムをマウントしようとしています(例:mount -o loop
.)