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


42

よるとFHS-3.0/tmp一時ファイルのためのものであり、/run実行時の変数データのためです。のデータは/run、次のブート時に削除する必要がありますが、これはには必要ありませんが/tmp、プログラムは、データが/tmp次のプログラムの開始時に利用可能になると想定してはなりません。これはすべて私に非常に似ているようです。

だから、2つの違いは何ですか?プログラムはどの基準で一時データを入れるか入れるかを決定する/tmp必要があり/runますか?

FHSによると:

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

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

以下の理論的根拠はFHSに/runは記載されていません/varが、実装が遅すぎる問題を克服するために導入されました/var/run。しかし、今で/run導入され、FHSにその説明が与えられて、両方を持っている明確な理由があるとは思えない/run/tmp


11
/ tmpは、一時データの* nix標準の場所です。/ runは、一時データのポタリング標準の場所です。
マーク

後方互換性は常に理由です
...-バクリウ

回答:


16

/ runと/ tmpの両方を持つ理由はありません

あなたは正しいと思います。 /tmpは、本質的に廃止されました/run。あなたのプログラムがそうする立場にある場合(特権操作としてインストールする必要がある場合)、今日ではのサブディレクトリを使用します/run。これはセキュリティ上の理由によるものです。

たとえば、CUPS印刷デーモンはrootとして実行されませんが、通常はOSパッケージからインストールされます。パッケージがインストールされ/usr/lib/tmpfiles.d/cups.confsystemd-tmpfilesアクセス可能なディレクトリが作成されます。ディレクトリはの下/runにあるため、誰/tmpもが書き込み可能なのとは異なり、権限のないユーザーがその名前を悪意を持って要求することはできません。

/run直接使用できない「非特権プログラム」

本当の違いは、自分のユーザーIDの下で、任意の非特権ユーザーがプログラムを実行している場合です。ただし/tmp、他の非特権ユーザーがアクセスできるため、通常は使用しません。を使用することをお勧めします$XDG_RUNTIME_DIR。通常、これは/run/user/$(id -u)- として実装されるため、たまたまサブディレクトリに/runもなります。ただし、場所は保証されません。プログラムは常に環境変数を使用する必要があります。

/tmpシステム上の異なる特権のないユーザー間のアドホックな連携にのみ役立ちます。このようなアドホックシステムは、悪意のあるユーザーがすべての人に協力したり、物事を台無しにしたりすることに対して脆弱です。1つの例はtalk、Unixソケットを使用して、デーモンのバージョンを実行することを決定する非特権ユーザーです。

Lennart Poetteringのオリジナル情報

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

通信を目的とした世界書き込み可能な共有名前空間[/ tmpなど]の使用には、常に問題があります。通信を確立するには安定した名前が必要ですが、安定した名前はDoS攻撃の扉を開きます。これは、初期ブート中に特定のサービスの保護されたアプリごとのディレクトリを確立することで部分的に修正できます(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()を使用してください。

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


8
この答えはあらゆる種類の間違いです。
R ..

@R ..、それを拡張することに注意してください?
ワイルドカード

はい、すでに回答しました。(コメントとして始まったが、私はそれがより多くの答えであることに気づいた。)
R ..

あなたが取り組んでいたと思う私の現在の答えの主な弱点は、技術的には、XDG_RUNTIME_DIRの正しい処理が任意の* nixに移植可能である必要があることです(「同様の機能を持つ代替ディレクトリにフォールバック」)、これが実際に意味することは非常にあいまいです。ポータブルユーティリティプログラムの場合は、明確に定義された標準/tmpを使用することをお勧めします(「使用するためのAPIはmkstemp()、mkdtemp()(および友人)のみで完全に安全である必要があります」)。
sourcejedi

回答もよくあるケースです:/var/runシステム全体(たとえば、ローカルデータベースと通信するため)で、ユーザーごとに/tmp/作成されることがよくあります。歴史的に、/ tmpのクォータも異なって設定されていました。そして、答えは、使用の意味の区別も重要であることを忘れています。
ジャコモカテナッツィ

23

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

/runロック、ソケット、pidファイルなどの長寿命サービスの非永続ランタイムデータ用に確立されました。一般向けには書き込みできないため、サービスランタイムデータを混乱/tmpやクリーンアップするジョブから保護します。確かに:私が実行する2つのディストリビューション(しゃれは意図されていません)には755のアクセス許可がありますが/run/tmpおよび/var/tmp(さらに/dev/shm言えば)アクセス許可は1777です。


3
サービスランタイムデータを混乱から分離するためだけに存在します。/tmpまた、全体にわたって踏みにじるさまざまなクリーンアップジョブからのデータに安全な港を提供するためにもあります/tmp
桂佐藤

許可に関する情報をありがとう。ただし、FHSによれば、「プログラムには/ runのサブディレクトリがある場合があります。これは、複数のランタイムファイルを使用するプログラムに推奨されます。」-これは、「長寿命サービス」の基準と、制限されたアクセス許可のためにプログラムがサブディレクトリを作成できないことの両方に矛盾しているようです。
ダークハーマン

@DirkHerrmannいいえ、そうではありません。見て/runと(...よく)錯体をチェックアウトディレクトリ構造に起因するudevudiskなど私は、この特定の問題の専門家ではないが、私は(スーパーユーザーとして実行されます)ブートスクリプトセットのすべてのアップを推測します。
カウンター

2
「/ runは技術的には必要ありません。/tmpの混乱からサービスランタイムデータを分離するためだけに存在します。」-良いことです。したがって、特権のないプロセスは、システムサービスが使用したい名前をしゃがむことができません。nginxが使用したい場合はちょっとダメですが、/tmp/nginx.pidプログラムの誤動作のために既に存在しています。/run/書き込み権限を要求することでこれを防ぎます。
-marcelm

18

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

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


「一時ファイル」についてさらに定義してくれてありがとう。「パス名を渡す」ことは、調整ポイントを確立する方法を説明するとは思わないが。つまり、通常は環境変数を使用します。動作させるのに十分な数のソケットとパイプ(一般的な使用)があるように見えます。(部分的には、多くのことが同じdbusソケットで実行されるため)。ただし、プログラムデフォルトでハードコードされたパスに設定されていない場合、環境を設定するのは面倒なようです。あなたはsystemdにする新しいキー追加することができます.socketファイルを...しかし、それは全体のディレクトリのヘルプをしていない、また、新しくインストールされたサービスのために
sourcejedi

2
/run/それ自体がFHSに採用されたため、fd.oとどう関係があるかわかりません。私たちが本当に不満を言うのが、両方に貢献した不特定の開発努力でない限りです。
sourcejedi

ここでの最初の答えは、書かれている質問に対する最良の答えだと思います。私はそれを考慮することによってさらに改善されるだろうと思う:下_Whenソフトウェアは、専用のディレクトリなどへの書き込みアクセス権を持っている/run、それは共有混乱を避けるために選んだのかもしれないが、/tmpまだ多くのファイルとディレクトリを。
sourcejedi

「fd.o」とは何ですか?
TRiG

7

Filesystem Hierarchy Standardによると、

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

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

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

FHSは/tmp、「古い」ファイルを定期的にパージするcronジョブの従来のセットアップなどを可能にします。そのようなメカニズムはありません/run。それゆえに、どんなプログラムが入れられたものの寿命にプログラムが期待できるかに関する厳しい制限/tmp。プログラムは/run、継続的に稼働するシステム上でファイルの寿命を延ばすことを期待できますが、プログラム自体がそこにある後は整頓することも期待されています。


4
この回答やその他の回答では指摘されていないものの、FHSに記載されているもので、回答を改善したいものが1つあり/tmpます。そのようなメカニズムはありません/run。それゆえに、どんなプログラムが入れられたものの寿命にプログラムが期待できるかに関する厳しい制限/tmp。プログラムは/run、継続的に稼働するシステム上でファイルの寿命を延ばすことを期待できますが、プログラム自体がそこにある後は整頓することも期待されています。
JdeBP

1
プロセスが終了するとすぐに、消えた(またはロービングガベージデーモンによって削除されることを許可された)もののプロセスごとのディレクトリがあると便利です。
オムニファリアス

1
@Omnifariousでは、RuntimeDirectory = :-) を使用して、systemdサービスの動作を取得できます。
sourcejedi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.