FHS-3. によると、/tmp
は一時ファイル用、/run
はランタイム変数データ用です。 /run
のデータは次回の起動時に削除する必要がありますが、/tmp
の場合は不要ですが、プログラムは/tmp
のデータが次回のプログラム起動時に利用可能であると想定してはなりません。これはすべて私によく似ています。
では、2つの違いは何ですか?一時データを/tmp
に入れるか/run
に入れるかをプログラムが判断する基準はどれですか。
FHSによると:
プログラムには
/run
のサブディレクトリがある場合があります。これは、複数のランタイムファイルを使用するプログラムに推奨されます。
これは、「システムプログラム」と「通常のプログラム」の区別が基準ではなく、プログラムの寿命(長期実行プロセスと短期実行プロセスなど)でもないことを示しています。
次の根拠はFHSには記載されていませんが、/run
の実装が遅すぎたため、/var
を早く利用できるようにするためにダーティトリックが必要になるという問題を解決するために/var/run
が導入されました。ただし、現在/run
が導入されており、FHSでの説明を考慮すると、/run
と/tmp
の両方を使用する明確な理由はないようです。
私はあなたが正しいと思います。 /tmp
は基本的に廃止され、/run
が追加されました。プログラムがそうする立場にある場合(特権操作としてinstalledがインストールされている必要があります)、今日ではサブディレクトリを使用します/run
の。これはセキュリティ上の理由によるものです。
例えば。 CUPS印刷デーモンはrootとして実行されませんが、通常はOSパッケージからインストールされます。パッケージは/usr/lib/tmpfiles.d/cups.conf
をインストールし、systemd-tmpfiles
はアクセス可能なディレクトリを作成します。ディレクトリは/run
の下にあるため、世界中で書き込み可能な/tmp
とは異なり、権限のないユーザーが悪意を持って名前を要求することはできません。
/run
を直接使用できない「非特権プログラム」本当の違いは、プログラムが自分のユーザーIDで任意の非特権ユーザーによって実行されているかどうかです。ただし、他の権限のないユーザーがアクセスできるため、通常は/tmp
を使用する必要はありません。 $XDG_RUNTIME_DIR
を使用することをお勧めします。通常、これは/run/user/$(id -u)
として実装されるため、/run
のサブディレクトリにもなります。ただし、場所は保証されていません。プログラムは常に環境変数を使用する必要があります。
/tmp
は、システム上の権限のないさまざまなユーザー間のアドホックな連携にのみ役立ちます。このようなアドホックシステムは、悪意のあるユーザーが協力することを拒否し、万人のために物事を台無しにすることに対して脆弱です。 1つの例は、UNIXソケットを使用してtalk
デーモンのバージョンを実行することを決定する非特権ユーザーです。
注:以下のPoetteringのチェックリストでは、/tmp
は「小さなファイル」に役立つと主張されていますが、/run
は「通信プリミティブ」にのみ使用する必要があります。この区別も当てはまらないと思います。 /run
の投稿者はudev
であり、/run/udev
に内部データベースが含まれていると確信しています。 /run
ディレクトリを作成したら、/tmp
を乱雑にするために、主張された区別に従ってanotherディレクトリを作成したいと思う人はいないと思います。したがって、実際には、今日/run
を使用します。
通信を確立するためには安定した名前が必要ですが、安定した名前はDoS攻撃の扉を開くため、通信目的での世界書き込み可能な共有名前空間(/ tmpなど)の使用は常に問題がありました。これは、初期ブート中に特定のサービス用に保護されたアプリごとのディレクトリを確立することで部分的に修正できます(X11の場合と同様)。ただし、これは問題を部分的にのみ修正します。これは、すべてのパッケージのインストールの後に再起動する場合にのみ正しく機能するためです。
...
別のFedora機能(Fedora 17の場合)は、さまざまなサービスの/ tmp名前空間を分離することにより、多くのシステムサービスの/ tmpのセマンティクスを変更して、それらをより安全にしました
...
/ tmpは必ずしも共有ネームスペースではなくなったため、通常は通信プリミティブの場所としては不適切です。
...
[/ run]はtmpfsであることが保証されているため、ブート時に自動的にフラッシュされます。それ以上の自動クリーンアップは行われません。
...
Linuxアプリケーション開発者が使用する適切なディレクトリを選択する方法をおおまかに示します。
- ソケット(または他の通信プリミティブ)を置く場所が必要であり、コードは特権付きで実行されます。/runの下のサブディレクトリを使用します。 (または/ var/runの下に追加の互換性があります。)
- ソケット(または他の通信プリミティブ)を配置する場所が必要であり、コードは特権なしで実行されます。$ XDG_RUNTIME_DIRの下のサブディレクトリを使用します。
- より大きなダウンロードとダウンロードを実行し、権限なしで実行するための場所が必要です。$ XDG_DOWNLOAD_DIRを使用してください。
- 永続的で非特権的に実行されるキャッシュファイルを置く場所が必要です。$ XDG_CACHE_HOMEを使用してください。
- 上記のいずれにも該当せず、永続性を必要としない小さなファイルを配置する必要があります。/tmpにフォールバックを指定して$ TMPDIRを使用します。そして、mkstemp()、およびmkdtemp()を使用し、自社開発のものは何も使用しません。
- それ以外の場合は、/ var/tmpのフォールバックで$ TMPDIRを使用します。 mkstemp()/ mkdtemp()も使用します。
上記のルールは私たちによってのみ提案されていることに注意してください。これらのルールは、このトピックについて私たちが知っているすべてを考慮に入れて、それらを見ることができる限り、現在および将来のディストリビューションに関する問題を回避します。これらのルールに従うようにプロジェクトを更新することを検討してください。新しいコードを作成する場合は、それらを覚えておいてください。
ここで強調したいことの1つは、/ tmpと/ var/tmpは実際にはユースケースに適した選択肢ではないということです。これらのディレクトリの有効な使用法がありますが、別のディレクトリが実際に適切な場所である場合がよくあります。したがって、注意して他のオプションを検討してください。ただし、/ tmpまたは/ var/tmpを使用する場合は、少なくともmkstemp()/ mkdtemp()を使用してください。
上で説明したように、Xウィンドウシステムで使用されているレガシー/tmp
ソケットを使いこなすことができます。tmpfiles.d/x11.conf
を誤って読みました。それは協力に依存しているように見えます:)。私はコードが監査されていると思います。サービス拒否は起こりうる最悪の事態です。
/tmp
と/usr/tmp
(後の/var/tmp
)ディレクトリは、かつてはすべての人とすべての人のゴミ捨て場でした。これらのディレクトリ内のファイルに対する唯一の保護メカニズムは、そのファイルの削除または名前の変更を所有者に制限するスティッキービットです。 marcelmがコメントで指摘したように、原則として、サービスが使用する名前(nginx.pid
やsshd.pid
など)でファイルを作成することを妨げるものはありません。 (ただし、実際には、起動スクリプトがそのような偽のファイルを最初に削除する可能性があります。)
/run
は、ロック、ソケット、pidファイルなど、長期間有効なサービスの非永続的なランタイムデータ用に確立されました。公開できないため、サービスのランタイムデータを/tmp
の混乱やそこでクリーンアップするジョブから保護します。確かに、私が実行する2つのディストリビューション(しゃれは意図されていません)は/run
に対する権限755を持っていますが、/tmp
および/var/tmp
(さらに言えば/dev/shm
)は権限1777を持っています。
/tmp
は、一時ファイルとディレクトリを作成する場所です。 「既知の名前」(つまり、何らかの方法で名前を伝えることなく別のプロセスが認識できる名前)の格納には使用できません。これは、誰も名前空間の所有権を持たないためです。誰でもファイルを作成できます。そのため、入力または出力としてファイル(つまり、パイプなどではない)を必要とするユーティリティがあり、名前を渡す限り、任意に(ランダムに生成された)名前が機能するユーティリティを使用している場合に、一般的に使用します。
歴史的に、(Xのような)いくつかのものがこの原則に違反し、よく知られている名前(.X11-unix
など)を/tmp
に入れていました。これはもちろんバグが多く、最初に目的の名前でファイルを作成するために競争するだけで、すべてのユーザーがサービスをDoSする必要があります。そのようなものは/run
に属します(Freedesktop.org修正主義に加入していない場合は/var/run
と同等です)。もちろん、グローバルネームスペースで既知の名前を使用せずに、パス名を渡すように修正することをお勧めします。
ファイルシステム階層標準によれば、
/run
は、ランタイム変数データ、つまり再起動以降の実行中のシステムに関する情報です/tmp
は一時ファイルの一般的な場所です。したがって、デーモンのステータス、ログインしているユーザー、マウントされたリムーバブルデバイスなどに関するものはすべて/run
に入り、プログラムによって作成された一時ファイルは/tmp
に入ります。
編集:下のコメントで@JdeBPが指摘したように、
FHSでは、「古い」ファイルの
/tmp
を定期的にパージするcronジョブの従来の設定などが可能です。/run
向けのメカニズムはありません。したがって、プログラムが/tmp
に入れられたものの存続期間に期待できるものに対する厳格な制限。プログラムは、継続的に稼働しているシステムの/run
でファイルがより長く存続することを期待できますが、それら自体の後に整理されていることも期待されます。