Linuxに/ dev / nullに相当するディレクトリはありますか?


84

アプリケーションを構成するときに、アプリケーションに/dev/null空のファイルを読み取らせたい場合、多くの場合、構成ファイルとして使用できます。ただし、アプリケーションがディレクトリからファイルのリストを読み取る場合、このトリックは使用できません。読むには空のディレクトリを与える必要があります。

私は疑問に思っていました:Linuxにはそのような目的に使用できるデフォルトの空のディレクトリがありますか?OpenSSHがしばらく/ var / emptyを使用したことは知っています。もちろん、空のディレクトリを自分で作成することもできますが、FHSはこのために標準ディレクトリを指定しているのでしょうか。


8
私のシステムで/var/emptyは、空ではありませんが、という名前のフォルダーが含まれているsshdため、おそらく使用したくないでしょう。
ノブ16

12
ほんの一点:の特別な側面は、書く/dev/nullことよりも読むことの方が重要ではありません に書き込まれたデータは/dev/null消えます。したがって、同等のディレクトリはmv yourfile /dev/empty、ファイルを削除する場所になります。
ワイルドカード

4
@Wildcardあなたが意味すると思いますmv yourfile /dev/empty/。あなたが行う場合はmv yourfile /dev/empty、あなたは特別なディレクトリを交換しようとしています。
ライモイド16

6
@Julesいいえ、そうではありません。あなたが何かを初期化することはできません/dev/nullし、ddためddそれも1バイトを書かれている前にEOFを取得します。私はあなたが考えていると思う/dev/zero、それはしばしば何かを埋めたり、特定の数のゼロを生成するために使用されます。
マイケルジョンソン

2
@MichealJohnsonあなたは正しい、私の間違い、私はと混同/dev/nullしていた/dev/zero
ジュール

回答:


66

FHSはない「標準」空のディレクトリを提供していません。

Linuxシステムではディレクトリを提供するのが一般的です/var/emptyが、このディレクトリはFHSで定義されておらず、実際には空ではない場合があります。代わりに、特定のデーモンはここに独自の空のディレクトリを作成します。たとえば、opensshは/var/empty/sshd特権の分離に空のディレクトリを使用します。

空のディレクトリの必要性が一時的な場合は、/runまたはのサブディレクトリとして空のディレクトリを自分で作成できます/tmp。プログラム外mktemp -dでこれを行う場合、これに使用するかmkdtemp(3)、プログラム内でC関数を使用できます。ただし、空のディレクトリが常に存在する必要がある場合は/var/empty、opensshと同じように空のディレクトリを作成することを検討してください。

この使用例で/tmpは、ディレクトリを作成するのがおそらく最適ですが、実際にはどこに配置するかはそれほど重要ではありません。


5
でサブディレクトリを作成することはお勧めしません。サブディレクトリ/var/emptyを使用するプログラム(デフォルト構成の OpenSSHなど)が実際に空であると想定する可能性があるためです。(これ/var/empty/sshdは奇妙なRedHat-ismのようです/var/run/sshd
。Debian

3
@IlmariKaronenリンクしたコードは、OpenSSH /var/emptyが空であることを期待しているという主張をサポートしていません。これを探すかもし​​れない他の場所はありますか?
マイケルハンプトン

2
@IlmariKaronen Hm、その文書は古くなっています。を参照します/var/emptyが、コードは実際に使用し/var/empty/sshdます。再試行する。:)
マイケルハンプトン

1
@IlmariKaronenうーん さて、chroot()呼び出しを行うソースを実際に見て、あなたは正しいと思います。opensshに明らかに愚かな欠陥があり、Red Hatがダウンストリームの修正を維持しなければならないのは驚くべきことです。
マイケルハンプトン

2
それがどのように「愚かな欠陥」であるかわかりません。chroot刑務所として使用するために、標準の場所に空のルート所有ディレクトリを保証することは、私にとって完全に良い考えのようです。もちろん、RedHatは、その下にサブディレクトリを作成することで、すべての人のためにそれを破壊する必要がありました。そのため、/var/empty特定のシステムでセマンティクスを確認できないため、ポータブルコードに対する私の推奨事項は、何にも使用しないことです。/var/runDebianのように、たとえばunderに独自の空のディレクトリを作成する方が賢明です。
イルマリカロネン16

37

を使用mktemp -dして、デフォルトで、安全な権限を持つ新しい空の一時ディレクトリを作成できます/tmp/。ユーティリティは、新しいディレクトリのパスをに出力するSTDOUTため、シェルで役立ちます。

とにかくsystemdユニットファイルよりも移植性があります。


はい、可能ですが、そのディレクトリを構成ファイルで指定する必要がある場合、それは実用的ではありません。そのための永続的なディレクトリが必要になります。
roelvanmeer


11

サービスの場合、systemdは、そのサービスの名前空間外のプロセスで共有されず、空の(最初は)PrivateTmpプライベート/tmpおよび/var/tmpディレクトリを作成するオプションを提供します。

[Service]
ExecStart=...
PrivateTmp=yes 

7
プログラムは他の一時ファイルを作成する可能性があるため、/tmp名前空間になっているだけで空になるとは考えられません。
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.