Laut FHS-3.0 , /tmp
ist für temporäre Dateien und /run
ist für den variablen Datenlaufzeit. Die Daten in /run
müssen beim nächsten Start gelöscht werden, was jedoch nicht erforderlich /tmp
ist. Programme dürfen jedoch nicht davon ausgehen, dass die Daten in /tmp
beim nächsten Programmstart verfügbar sind. All das scheint mir ziemlich ähnlich zu sein.
Was ist der Unterschied zwischen den beiden? Nach welchem Kriterium sollte ein Programm entscheiden, ob temporäre Daten abgelegt werden sollen /tmp
oder nicht /run
?
Laut FHS:
Programme können ein Unterverzeichnis von haben
/run
; Dies wird für Programme empfohlen, die mehr als eine Laufzeitdatei verwenden.
Dies zeigt an, dass die Unterscheidung zwischen "Systemprogrammen" und "gewöhnlichen Programmen" kein Kriterium ist, ebenso wenig wie die Lebensdauer des Programms (wie langlaufender oder kurzlaufender Prozess).
Obwohl die folgende Begründung in der FHS nicht gegeben ist, /run
wurde eingeführt, um das Problem zu überwinden, /var
das zu spät montiert wurde, so dass schmutzige Tricks erforderlich waren, um /var/run
früh genug verfügbar zu machen . Mit /run
der Einführung und der Beschreibung in der FHS scheint es jedoch keinen klaren Grund zu geben, beides /run
und zu haben /tmp
.
quelle
Antworten:
Kein Grund, sowohl / run als auch / tmp zu haben
Ich denke, du hast recht.
/tmp
ist im Wesentlichen veraltet, jetzt haben wir/run
. Wenn Ihr Programm dazu in der Lage ist (was erfordert, dass es als privilegierte Operation installiert wurde ), würden Sie heutzutage ein Unterverzeichnis von verwenden/run
. Dies ist aus Sicherheitsgründen.Beispielsweise wird der CUPS-Druckerdämon nicht als Root ausgeführt, sondern in der Regel von einem Betriebssystempaket installiert. Das Paket wird installiert
/usr/lib/tmpfiles.d/cups.conf
undsystemd-tmpfiles
erstellt ein Verzeichnis, auf das es zugreifen kann. Da sich das Verzeichnis unter befindet/run
, kann der Name nicht böswillig von einem nicht privilegierten Benutzer behauptet worden sein, im Gegensatz zu/tmp
dem, der von der Welt beschreibbar ist."Unprivilegierte Programme", die nicht
/run
direkt verwendet werden könnenDer eigentliche Unterschied besteht darin, ob Ihr Programm von einem beliebigen, nicht privilegierten Benutzer unter seiner eigenen Benutzer-ID ausgeführt wird. Im Allgemeinen möchten Sie es jedoch nicht verwenden
/tmp
, da andere nicht privilegierte Benutzer darauf zugreifen können. Sie würden es vorziehen, zu verwenden$XDG_RUNTIME_DIR
. In der Regel wird dies implementiert als/run/user/$(id -u)
- so dass es zufällig auch ein Unterverzeichnis von ist/run
. Die Lage ist jedoch nicht garantiert. Programme sollten immer die Umgebungsvariable verwenden./tmp
wäre nur für die Ad-hoc-Zusammenarbeit zwischen verschiedenen nichtprivilegierten Benutzern auf dem System nützlich. Solche Ad-hoc-Systeme sind anfällig für einen böswilligen Benutzer, der sich weigert, zusammenzuarbeiten, und verwöhnt Dinge für alle :). Ein Beispiel wären nicht privilegierte Benutzer, die sich dafür entscheiden, eine Version destalk
Daemons unter Verwendung eines Unix-Sockets auszuführen .Originalinformationen von Lennart Pöttering
Hinweis: In der nachstehenden Prüfliste von Pöttering wurde angegeben, dass
/tmp
dies für "kleine Dateien" nützlich ist, wohingegen diese/run
nur für "Kommunikationsprimitive" verwendet werden sollten. Ich glaube auch nicht, dass diese Unterscheidung wahr ist. Der Aushängeschild für/run
istudev
, und ich bin mir ziemlich sicher,/run/udev
enthält interne Datenbanken. Wenn Sie ein/run
Verzeichnis haben, möchte wohl niemand der behaupteten Unterscheidung folgen und ein anderes Verzeichnis erstellen , um Unordnung zu schaffen/tmp
. In der Praxis verwenden wir/run
heutzutage nur....
...
...
...
Wir kommen irgendwie mit dem altenIch habe falsch verstanden/tmp
Sockel davon, der vom X-Window-System verwendet wird, wie oben beschrieben.tmpfiles.d/x11.conf
. Sieht eher nach Kooperation aus :). Ich gehe davon aus, dass der Code geprüft wurde, sodass Denial-of-Service das Schlimmste ist, was passieren kann.quelle
/tmp
("die einzigen APIs für die Verwendung sollten mkstemp (), mkdtemp () (und friends) sein, um absolut sicher zu sein")./var/run
systemweit (z. B. zur Kommunikation mit der lokalen Datenbank), wird/tmp/
jetzt häufig pro Benutzer erstellt . Historisch war auch die Quote von / tmp unterschiedlich eingestellt. Und die Antwort vermisst, dass eine semantische Unterscheidung der Verwendung ebenfalls wichtig ist.Die Verzeichnisse
/tmp
und/usr/tmp
(später/var/tmp
) waren der Abladeplatz für alles und jeden. Der einzige Schutzmechanismus für Dateien in diesen Verzeichnissen ist das Sticky-Bit, das das Löschen oder Umbenennen von Dateien auf deren Eigentümer beschränkt. Wie marcelm in einem Kommentar betont hat, hindert grundsätzlich nichts daran, Dateien mit Namen zu erstellen, die von Diensten (wienginx.pid
odersshd.pid
) verwendet werden. (In der Praxis könnten die Startskripte solche gefälschten Dateien jedoch zuerst entfernen.)/run
wurde für nicht persistente Laufzeitdaten von langlebigen Diensten wie Sperren, Sockets, PID-Dateien und dergleichen erstellt. Da es für die Öffentlichkeit nicht beschreibbar ist, schützt es die Laufzeitdaten des Dienstes vor dem Durcheinander/tmp
und den Jobs, die dort aufräumen. In der Tat: Zwei von mir ausgeführte Distributionen (ohne Wortspiel) haben Berechtigungen 755/run
, während/tmp
und/var/tmp
(und/dev/shm
in diesem Fall) Berechtigungen 1777 haben.quelle
/tmp
- und um einen sicheren Hafen für diese Daten aus den verschiedenen Bereinigungsaufträgen zu schaffen, die durchgehend in Mitleidenschaft gezogen werden/tmp
./run
Sie sich die komplexe (naja ...) Verzeichnisstruktur an, die durch usw. verursachtudev
wurdeudisk
. Ich bin kein Experte für dieses spezielle Problem, aber ich denke, die Boot-Skripte (die als Superuser ausgeführt werden) haben alles eingerichtet./tmp/nginx.pid
aber es existiert bereits aufgrund eines fehlerhaften Programms./run/
verhindert dies, indem Berechtigungen zum Schreiben erforderlich sind./tmp
ist der Speicherort für die Erstellung temporärer Dateien und Verzeichnisse. Es kann nicht zum Speichern von "bekannten Namen" verwendet werden (dh Namen, die einem anderen Prozess bekannt sein könnten, ohne dass Sie den Namen irgendwie mitteilen müssen), da niemand den Besitz über den Namespace hat. jeder kann dort dateien anlegen. Als solches verwenden Sie es im Allgemeinen, wenn Sie ein Dienstprogramm haben, das eine Datei (dh keine Pipe oder ähnliches) als Eingabe oder Ausgabe benötigt, bei der ein beliebiger (zufällig generierter) Name funktioniert, solange Sie den Namen eingeben.Historisch gesehen haben einige Dinge (wie X) gegen dieses Prinzip verstoßen und bekannte Namen (wie
.X11-unix
) hinzugefügt/tmp
. Dies ist natürlich fehlerhaft und ermöglicht es jedem Benutzer, den Dienst zu tun, der dies erfordert, indem er einfach rennt, um zuerst eine Datei mit dem gewünschten Namen zu erstellen. Solche Dinge gehören unter/run
(oder gleichwertig,/var/run
wenn Sie Freedesktop.org revisionism nicht abonnieren). Noch besser wäre es natürlich, sie so zu reparieren, dass sie keine bekannten Namen in einem globalen Namespace verwenden, sondern stattdessen einen Pfadnamen weitergeben.quelle
.socket
Dateien einen neuen Schlüssel hinzufügen ... aber das hilft weder für ganze Verzeichnisse noch für neu installierte Dienste/run/
selbst wurde von FHS adoptiert, ich kann nicht sehen, wie es mit fd.o zu tun hat. Es sei denn, wir wollten uns wirklich über unspezifische Entwicklungsbemühungen beschweren, die zu beiden beigetragen haben./run
, sollte vermieden werden , dass das freigegebene/tmp
Verzeichnis mit noch mehr Dateien überladen wird .Nach dem Dateisystem-Hierarchie-Standard
/run
ist für die Laufzeit variable Daten, dh Informationen über das laufende System seit dem Neustart/tmp
ist ein generischer Ort für temporäre Dateien.Alles, was den Daemon-Status, angemeldete Benutzer, gemountete Wechseldatenträger usw. betrifft, würde eingehen,
/run
während temporäre Dateien, die von einem Programm erstellt wurden, eingehen/tmp
.Bearbeiten: wie im Kommentar unten von @JdeBP hingewiesen,
quelle
/tmp
"alte" Dateien löschen; ohne solche Mechanismen bestimmt für/run
. Daher die drakonische Grenze dessen, was Programme von der Lebensdauer von allem erwarten können, was eingegeben wird/tmp
. Während Programme erwarten können, dass Dateien länger/run
auf einem ständig aktualisierten System verbleiben, wird auch erwartet, dass sie dort mehr aufräumen.