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


81

" /dev/null"ディレクトリ(または "ブラックホール"ディレクトリ)を作成して、そこに書き込まれたファイルが実際には書き込まれず、消えてしまうようにします。

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

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



私は自分自身に同じ質問をし、作成に失敗したディレクトリに同じ名前を使用しました。
ixtmixilix

回答:


48

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

¹ と混同しないように* BSDのNULLFSに似ている、bindfs


ファンタスティック-私はの一部としてこれを使用していたSOの答え
フィルLelloの

1
そのプログラムでコンパイルエラーが発生する人々へのメモ:g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`私のために働いた。
ixtmixilix

他の実装を教えていただけますか?見つからないため
Freedo

@Freedo多くの人が学習の練習としてそれをやったのではないかと考えており、それは維持されていません。彼らはもうウェブ上にないかもしれません。
ジル

7

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

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

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


3
...アプリケーションと仮定するとシステムがない直接経由して、libcを経由して呼び出すんint 0x80/ syscall/ sysenter他/何でも。
ルスラン

1

これらのログをオフに切り替えられないほどプログラムが愚かである場合、ログファイルを開いた後にエラーをチェックしないこともありますか?ダミーの読み取り専用ファイルシステムをマウントしてみます(たとえば、を使用mount -o loop)。


残念ながら、このアプローチは機能しません。このファイルに書き込めない場合、アプリケーションは終了します。
ドッグベイン

1

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

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


1
多くのシステムでは、プロセスが開いているファイルを削除すると、そのディレクトリエントリが削除されますが、ファイル自体は、それを使用する最後のプロセスによって閉じられるまでディスク上に残ります。プロセスはファイルを書き込んだ後、先頭にシークし、それらを読み戻す可能性があります。そのため、OSは単にデータを破棄することはできません。
interfect

0

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

https://github.com/abbbi/nullfsvfs


-8

そのディレクトリにシンボリックリンクするだけです /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/null、ディレクトリである必要はありません。プログラムがへの書き込みを試みても~/.logs/log1.dump、それはそのままに入り/dev/nullます。
Google Chromeのキャッシュに対してこれを行います。しばらくすると、Chromeが非常に大きくなり、Chromeの起動に数分かかるためです。


3
シンボリックリンクはディレクトリではなくファイルであるため、これは機能しません。TRYINGをecho hello > ~/.logs/log1.dump提供します~/.logs/log1.dump: Not a directory。ただし、echo hello > ~/.logs.logsはファイルであるため機能します。
dogbane

2
冗談でしょう。$ ln -s /dev/null dev-null; touch dev-null/zzz私に与えるtouch: cannot touch 'dev-null/zzz': Not a directory
アレックスアレックス

1
先ほど言ったように、Chromeでも機能します。キャッシュへの書き込みを防ぎます。それがaskerのプログラムをクラッシュさせる場合、明らかにファイルポインターがNULLかどうかをチェックしません。
jonescb

6
ファイルを開くときにエラーが発生した場合、Chromeは書き込みをスキップします。ダンプファイルまたは書き込み先のディレクトリから書き込み権限を削除することにより、同じ効果を得ることができます
。– KeithB

確かに、ディレクトリのアクセス許可を変更する方がより意味があります。
jonescb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.