web-dev-qa-db-ja.com

/ tmpと/ runの違いは何ですか?

FHS-3. によると、/tmpは一時ファイル用、/runはランタイム変数データ用です。 /runのデータは次回の起動時に削除する必要がありますが、/tmpの場合は不要ですが、プログラムは/tmpのデータが次回のプログラム起動時に利用可能であると想定してはなりません。これはすべて私によく似ています。

では、2つの違いは何ですか?一時データを/tmpに入れるか/runに入れるかをプログラムが判断する基準はどれですか。

FHSによると:

プログラムには/runのサブディレクトリがある場合があります。これは、複数のランタイムファイルを使用するプログラムに推奨されます。

これは、「システムプログラム」と「通常のプログラム」の区別が基準ではなく、プログラムの寿命(長期実行プロセスと短期実行プロセスなど)でもないことを示しています。

次の根拠はFHSには記載されていませんが、/runの実装が遅すぎたため、/varを早く利用できるようにするためにダーティトリックが必要になるという問題を解決するために/var/runが導入されました。ただし、現在/runが導入されており、FHSでの説明を考慮すると、/run/tmpの両方を使用する明確な理由はないようです。

44
Dirk Herrmann

/ 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デーモンのバージョンを実行することを決定する非特権ユーザーです。

元の情報 Lennart Poetteringから

注:以下のPoetteringのチェックリストでは、/tmpは「小さなファイル」に役立つと主張されていますが、/runは「通信プリミティブ」にのみ使用する必要があります。この区別も当てはまらないと思います。 /runの投稿者はudevであり、/run/udevに内部データベースが含まれていると確信しています。 /runディレクトリを作成したら、/tmpを乱雑にするために、主張された区別に従ってanotherディレクトリを作成したいと思う人はいないと思います。したがって、実際には、今日/runを使用します。

通信を確立するためには安定した名前が必要ですが、安定した名前はDoS攻撃の扉を開くため、通信目的での世界書き込み可能な共有名前空間(/ tmpなど)の使用は常に問題がありました。これは、初期ブート中に特定のサービス用に保護されたアプリごとのディレクトリを確立することで部分的に修正できます(X11の場合と同様)。ただし、これは問題を部分的にのみ修正します。これは、すべてのパッケージのインストールの後に再起動する場合にのみ正しく機能するためです。

...

別のFedora機能(Fedora 17の場合)は、さまざまなサービスの/ tmp名前空間を分離することにより、多くのシステムサービスの/ tmpのセマンティクスを変更して、それらをより安全にしました

...

/ tmpは必ずしも共有ネームスペースではなくなったため、通常は通信プリミティブの場所としては不適切です。

...

[/ run]はtmpfsであることが保証されているため、ブート時に自動的にフラッシュされます。それ以上の自動クリーンアップは行われません。

...

Linuxアプリケーション開発者が使用する適切なディレクトリを選択する方法をおおまかに示します。

  1. ソケット(または他の通信プリミティブ)を置く場所が必要であり、コードは特権付きで実行されます。/runの下のサブディレクトリを使用します。 (または/ var/runの下に追加の互換性があります。)
  2. ソケット(または他の通信プリミティブ)を配置する場所が必要であり、コードは特権なしで実行されます。$ XDG_RUNTIME_DIRの下のサブディレクトリを使用します。
  3. より大きなダウンロードとダウンロードを実行し、権限なしで実行するための場所が必要です。$ XDG_DOWNLOAD_DIRを使用してください。
  4. 永続的で非特権的に実行されるキャッシュファイルを置く場所が必要です。$ XDG_CACHE_HOMEを使用してください。
  5. 上記のいずれにも該当せず、永続性を必要としない小さなファイルを配置する必要があります。/tmpにフォールバックを指定して$ TMPDIRを使用します。そして、mkstemp()、およびmkdtemp()を使用し、自社開発のものは何も使用しません。
  6. それ以外の場合は、/ var/tmpのフォールバックで$ TMPDIRを使用します。 mkstemp()/ mkdtemp()も使用します。

上記のルールは私たちによってのみ提案されていることに注意してください。これらのルールは、このトピックについて私たちが知っているすべてを考慮に入れて、それらを見ることができる限り、現在および将来のディストリビューションに関する問題を回避します。これらのルールに従うようにプロジェクトを更新することを検討してください。新しいコードを作成する場合は、それらを覚えておいてください。

ここで強調したいことの1つは、/ tmpと/ var/tmpは実際にはユースケースに適した選択肢ではないということです。これらのディレクトリの有効な使用法がありますが、別のディレクトリが実際に適切な場所である場合がよくあります。したがって、注意して他のオプションを検討してください。ただし、/ tmpまたは/ var/tmpを使用する場合は、少なくともmkstemp()/ mkdtemp()を使用してください。

上で説明したように、Xウィンドウシステムで使用されているレガシー/tmpソケットを使いこなすことができます。tmpfiles.d/x11.confを誤って読みました。それは協力に依存しているように見えます:)。私はコードが監査されていると思います。サービス拒否は起こりうる最悪の事態です。

16
sourcejedi

/tmp/usr/tmp(後の/var/tmp)ディレクトリは、かつてはすべての人とすべての人のゴミ捨て場でした。これらのディレクトリ内のファイルに対する唯一の保護メカニズムは、そのファイルの削除または名前の変更を所有者に制限するスティッキービットです。 marcelmがコメントで指摘したように、原則として、サービスが使用する名前(nginx.pidsshd.pidなど)でファイルを作成することを妨げるものはありません。 (ただし、実際には、起動スクリプトがそのような偽のファイルを最初に削除する可能性があります。)

/runは、ロック、ソケット、pidファイルなど、長期間有効なサービスの非永続的なランタイムデータ用に確立されました。公開できないため、サービスのランタイムデータを/tmpの混乱やそこでクリーンアップするジョブから保護します。確かに、私が実行する2つのディストリビューション(しゃれは意図されていません)は/runに対する権限755を持っていますが、/tmpおよび/var/tmp(さらに言えば/dev/shm)は権限1777を持っています。

23
countermode

/tmpは、一時ファイルとディレクトリを作成する場所です。 「既知の名前」(つまり、何らかの方法で名前を伝えることなく別のプロセスが認識できる名前)の格納には使用できません。これは、誰も名前空間の所有権を持たないためです。誰でもファイルを作成できます。そのため、入力または出力としてファイル(つまり、パイプなどではない)を必要とするユーティリティがあり、名前を渡す限り、任意に(ランダムに生成された)名前が機能するユーティリティを使用している場合に、一般的に使用します。

歴史的に、(Xのような)いくつかのものがこの原則に違反し、よく知られている名前(.X11-unixなど)を/tmpに入れていました。これはもちろんバグが多く、最初に目的の名前でファイルを作成するために競争するだけで、すべてのユーザーがサービスをDoSする必要があります。そのようなものは/runに属します(Freedesktop.org修正主義に加入していない場合は/var/runと同等です)。もちろん、グローバルネームスペースで既知の名前を使用せずに、パス名を渡すように修正することをお勧めします。

ファイルシステム階層標準によれば、

  • /runは、ランタイム変数データ、つまり再起動以降の実行中のシステムに関する情報です
  • /tmpは一時ファイルの一般的な場所です。

したがって、デーモンのステータス、ログインしているユーザー、マウントされたリムーバブルデバイスなどに関するものはすべて/runに入り、プログラムによって作成された一時ファイルは/tmpに入ります。

編集:下のコメントで@JdeBPが指摘したように、

FHSでは、「古い」ファイルの/tmpを定期的にパージするcronジョブの従来の設定などが可能です。 /run向けのメカニズムはありません。したがって、プログラムが/tmpに入れられたものの存続期間に期待できるものに対する厳格な制限。プログラムは、継続的に稼働しているシステムの/runでファイルがより長く存続することを期待できますが、それら自体の後に整理されていることも期待されます。

7
dr_