~によるとFHS-3.0、/tmp
一時ファイル用、/run
ランタイム変数データ用。/run
のデータは、次回の起動時に削除する必要があり、必要はありません/tmp
。ただし、プログラムは、次回プログラムの開始時にデータを/tmp
使用できるとは想定できません。これらすべてが私と非常に似ているようです。
それでは、2つの違いは何ですか?プログラムは、どの基準に従って一時データを入れるか取り出すかを決定する/tmp
必要がありますか/run
?
FHSデータによると:
プログラムにはサブディレクトリがあります
/run
。これは、複数のランタイムファイルを使用するプログラムにお勧めします。
これは、「システムプログラム」と「一般プログラム」の区別が標準ではなく、プログラムのライフサイクル(例えば、長期実行プロセス対短期実行プロセス)でもないことを意味します。
FHSは以下のような根拠を示していませんが、遅すぎて設置してダーティトリックを早期に提供する必要がある問題を/run
克服するために導入されました。しかし、今や導入され、FHSで説明されているので、両方を持つ明確な理由がないようです。/var
/var/run
/run
/run
/tmp
答え1
カタログ/tmp
と/usr/tmp
(以降/var/tmp
)は、すべてとすべての人のためのゴミ箱でした。これらのディレクトリ内のファイルに対する唯一の保護メカニズムは、所有者がファイルを削除または名前変更することを制限する固定ビットです。 marcelmがコメントで指摘したように、原則として、誰かがサービスが使用する名前(たとえば、nginx.pid
または)でファイルを生成するのを防ぐ方法はありませんsshd.pid
。 (しかし、実際には、起動スクリプトが最初にこれらの偽のファイルを削除する可能性があります。)
/run
ロック、ソケット、PIDファイルなどの長寿命の非持続的なランタイムデータを提供するように構築されています。一般の人々が書くことができないため、サービスの実行時データを複雑でクリーンアップ/tmp
する努力から保護します。事実:私が実行している2つのディストリビューション(悪意のあるものではありません)は755の権限を持ち/run
(/tmp
その問題/var/tmp
については/dev/shm
)1777の権限を持っています。
答え2
/tmp
一時ファイルとディレクトリが作成される場所。誰も名前空間の所有権を持っていないため、「よく知られている名前」(つまり、名前を渡さずに他のプロセスが認識できる名前)を保存するために使用することはできません。したがって、通常、ファイル(パイプなどではない)を入力または出力として要求するユーティリティがある場合に使用され、(任意に生成された)名前は渡す限り機能します。
歴史的に、Xなどの一部の項目はこの原則に違反し、DoSなどのよく知られた名前を.X11-unix
付けました/tmp
。これを行うにはサービスが必要です。これらのコンテンツは/run
(または/var/run
あなたがFreedesktop.org修正主義に加入していない場合と同じです)。もちろん、より良い方法は、これを修正し、グローバルネームスペースでよく知られている名前を使用せずに代わりにパス名を渡すことです。
答え3
/runと/tmpの両方を持つ理由はありません。
そちらが合うと思います。あなたのプログラムがこれを行うことができる場合(これはデフォルトでは廃止/tmp
されました。)/run
インストール済み特権タスクとして)今、/run
セキュリティ上の理由から。
たとえば、CUPS 印刷デーモンは root として実行されませんが、通常はオペレーティングシステムパッケージからインストールされます。パッケージはアクセス可能なディレクトリをインストールして/usr/lib/tmpfiles.d/cups.conf
作成します。systemd-tmpfiles
ディレクトリは下にあるため/run
、誰でも書き込み可能なディレクトリとは異なり、権限のないユーザーは悪意のある名前を奪うことはできません/tmp
。
直接使用できない/run
「無許可のプログラム」
実際の違いは、自分のユーザーIDで権限のないユーザーがプログラムを実行しているかどうかです。ただし、/tmp
権限のない他のユーザーがアクセスできるため、まだ一般的に使用したくありません。を使用することをお勧めします$XDG_RUNTIME_DIR
。通常これは - で実装されるので、 のサブディレクトリに/run/user/$(id -u)
なります。/run
ただし、場所は保証されません。プログラムは常に環境変数を使用する必要があります。
/tmp
システムが権限のない複数のユーザー間の一時的な共同作業にのみ役立ちます。これらの一時的なシステムは、協力を拒否し、すべての人の仕事を台無しにする悪意のあるユーザーに脆弱です。たとえば、権限のないユーザーがtalk
Unixソケットを使用してデーモンバージョンを実行することを決定した場合があります。
オリジナルデータ レナルト・ペトリングで
以下のPoetteringリストでは、これは/tmp
「小さなファイル」には便利ですが、/run
「通信の基本要素」にのみ役立つと主張しています。私もこのような区分は正しくないと思います。ポスターの少年は/run
内部データベースを含んでいるとudev
確信しています。ディレクトリ/run/udev
があれば、/run
誰も主張された区別に従い、ディレクトリを作成したくないでしょう。その他ディレクトリ、混乱/tmp
。だから実際には/run
now直播账号を使います。
誰でも使用できる共有名前空間[/tmp]を使用した通信では、通信を確立するには安定した名前が必要ですが、安定した名前はDoS攻撃に対するドアを開いているため常に問題になっています。これは、初期起動中に特定のサービスに対して保護されたアプリケーション固有のディレクトリを設定することで部分的に変更できます(X11の場合と同様)。ただし、これはパッケージごとにインストール後に再起動した場合にのみ機能するため、問題を部分的にのみ解決します。
...
もう1つのFedora機能(Fedora 17用)は、さまざまなサービスの/ tmp名前空間を分離し、より安全にするために多くのシステムサービスの/ tmpの意味を変更します。
...
/ tmpはもはや共有名前空間ではないため、通常は通信の基本要素に適した場所ではありません。
...
[/run]はtmpfsで保証されているため、起動時に自動的に更新されます。それ以上に自動クリーンアップは発生しません。
...
以下は、あなた(Linuxアプリケーション開発者)が正しいディレクトリを選択することをお勧めする方法のおおよそのガイドです。
- ソケット(またはその他の通信基本要素)を配置し、コードを権限で実行できる場所が必要です。 /runの下のサブディレクトリを使用してください。 (またはさらなる互換性のために/ var / runの下にあります。)
- ソケット(またはその他の通信基本要素)を配置し、コードが許可されていない方法で実行される場所が必要です。 $XDG_RUNTIME_DIRの下のサブディレクトリを使用してください。
- より大きなダウンロードと進行中のダウンロードを保存し、不正な方法で実行できる場所が必要です。 $ XDG_DOWNLOAD_DIRを使用してください。
- 永続的で非特権的な方法で実行する必要があるキャッシュファイルを保存する場所が必要です。 $XDG_CACHE_HOMEを使用してください。
- 上記のいずれも適用されません。永続性を必要としない小さなファイルを入れる必要があります。 $TMPDIR を使用し、/tmp にフォールバックを使用します。そして、ホームブレンドを使わずにmkstemp()とmkdtemp()を使用してください。
- それ以外の場合は、/ var / tmpで$ TMPDIRとfallbackを使用してください。 mkstemp()/mkdtemp() も使用できます。
上記のルールは推奨事項にすぎません。これらの規則は、そのトピックについて知っているすべてを考慮し、現在および将来のリリースで見られる問題を回避します。これらの規則に従うようにプロジェクトを更新し、新しいコードを書くときはそれを念頭に置いてください。
私たちが強調したいのは、/tmpと/var/tmpが実際に一般的にユースケースに適した選択肢ではないということです。これらのディレクトリは有効な用途に使用されますが、実際には他のディレクトリがより良い場所になる可能性があります。したがって、注意して他のオプションを検討してください。ただし、/tmp または /var/tmp を選択する場合は、少なくとも mkstemp()/mkdtemp() を使用する必要があります。
私が間違って見ました/tmp
上記のように、私たちはXウィンドウシステムで使用されている従来のソケットからやや外れています。tmpfiles.d/x11.conf
。依存的な協力のように見えます:)。コードがレビューされたため、サービス拒否が発生する可能性がある最悪の状況であると仮定します。
答え4
ファイルシステム階層標準によると、
/run
ランタイム変数データ(例:再起動後に実行中のシステムに関する情報)/tmp
一時ファイルの共通位置です。
したがって、デーモンの状態、ログインしたユーザー、マウントされたリムーバブルデバイスなどに関するすべての内容が入り、/run
プログラムで生成された一時ファイルは/tmp
。
編集:@JdeBPが以下のコメントで指摘したように、
FHSは、「古い」ファイルを定期的に削除する定期的なクローンジョブ設定を可能にします。したがって、
/tmp
これらのメカニズムは使用するように設計されていません/run
。したがって、プログラムには、保存するすべてのアイテムの寿命に厳しい制限があります/tmp
。プログラムは、継続的に実行されているシステムでファイルがより長く維持されることを期待できますが、システム/run
でより多くのクリーンアップが必要です。