web-dev-qa-db-ja.com

/ dev / nullのような「ブラックホール」ディレクトリを作成するにはどうすればよいですか?

/dev/null "ディレクトリ(または"ブラックホール "ディレクトリ)に書き込まれるファイルは、実際には書き込まれず、単に消えるだけです。

大きな一時ファイルをディレクトリに書き込むアプリケーションがあります。私はファイルの名前を制御できず、これらのファイルの内容を本当に気にしません。これらのファイルを定期的に上書きするスクリプトを作成することもできますが、ファイルは非常に迅速に書き出され、ディスクがいっぱいになります。何か賢いものを探しています。アプリケーションがこれらのファイルを書き出すことをアプリケーションに「考えさせる」必要がありますが、実際には、書き込みはもう一方の端で破棄されています。

this 古い関連スレッドも参照してください。

84
dogbane

これは、私が知っているどのUNIXでもそのままではサポートされていませんが、 Fuse を使用すればほとんど何でもできます。少なくとも nullfs¹の1つの実装 があり、すべてのファイルが存在し、/dev/nullのように動作するファイルシステムです(これまでに見た唯一の実装ではありません)。

¹ * BSD nullfs と混同しないでください。これは bindfs に類似しています。

別のアプローチは、LD_PRELOADラッパーです。基本的にlibc.soの前に読み込まれる小さな共有ライブラリで、「open」への呼び出しをインターセプトして、予想されるファイルパスをチェックし、ターゲットディレクトリにある場合は「/ dev/null」に置き換えます。

これには、(a)完全にユーザー空間にいるという利点があります。カーネルハッキングは必要ありません。 (b)単一の誤ったアプリケーションにのみ影響を与える。

簡単な例は http://www.noah.org/wiki/LD_PRELOAD_notes にありますが、この場合は、 "open"および "creat"システムコールをインターセプトする必要があります。

8
Martin Kealey

プログラムが非常に愚かで、ログをオフにできない場合、ログファイルを開いた後もエラーをチェックしないのではないですか?ダミーの読み取り専用ファイルシステムをマウントしてみます(例:mount -o loop。)

1
alex

スクリプトを使用して定期的にファイルを削除するのは、十分な速さではないとあなたは言っています。アプリケーションが書き込みを完了して閉じるときに一時ファイルを削除するトリガーを使用できますか?その場合は、「inotify」APIを使用できます。

http://en.wikipedia.org/wiki/Inotify および https://github.com/rvoicilas/inotify-tools/wiki/ を参照)

1
Elliot Nelson

linuxカーネルでramfsの例に基づいてカーネルモジュールを作成しました。これは基本的にnullfsvfsと呼ばれるブラックホールファイルシステムです。 Fuseシステムの実装は、ユーザーからカーネル空間にデータをコピーする必要があり、カーネルモジュールとしての単純な実装と比較して非常に低速です。見る:

https://github.com/abbbi/nullfsvfs

1
michael