Selon FHS-3.0 , il /tmp
s’agit de fichiers temporaires et de /run
données variables au moment de l’exécution. Les données d' entrée /run
doivent être supprimées au prochain démarrage, ce qui n'est pas obligatoire pour /tmp
, mais les programmes ne doivent pas encore supposer que les données d' /tmp
entrée seront disponibles au prochain démarrage du programme. Tout cela me semble assez similaire.
Alors, quelle est la différence entre les deux? Par quel critère devrait un programme décider de mettre les données temporaires dans /tmp
ou en /run
?
Selon la FHS:
Les programmes peuvent avoir un sous-répertoire de
/run
; cela est encouragé pour les programmes qui utilisent plusieurs fichiers d'exécution.
Cela indique que la distinction entre "programmes système" et "programmes ordinaires" n'est pas un critère, pas plus que la durée de vie du programme (comme, processus long ou court).
Bien que le raisonnement suivant ne soit pas expliqué dans la FHS, il a /run
été introduit pour résoudre le problème qui a /var
été mis en place trop tard, de sorte que des astuces compliquées étaient nécessaires pour être /var/run
disponibles suffisamment tôt. Cependant, maintenant avec /run
son introduction, et compte tenu de sa description dans le FHS, il ne semble pas être une raison évidente d'avoir les deux /run
et /tmp
.
la source
Réponses:
Aucune raison d'avoir les deux / run et / tmp
Je pense que tu as raison.
/tmp
est essentiellement obsolète maintenant, nous avons/run
. Si votre programme est en mesure de le faire (ce qui nécessite qu'il soit installé en tant qu'opération privilégiée), vous utiliserez alors un sous-répertoire de/run
. C'est pour des raisons de sécurité.Par exemple, le démon d'impression CUPS ne s'exécute pas en tant que root mais est généralement installé à partir d'un package de système d'exploitation. Le paquet s'installe
/usr/lib/tmpfiles.d/cups.conf
etsystemd-tmpfiles
crée un répertoire auquel il peut accéder. Étant donné que le répertoire est en dessous/run
, le nom ne peut pas avoir été réclamé de manière malveillante par un utilisateur non privilégié, contrairement à/tmp
ce qui est en écriture pour le monde entier."Programmes non privilégiés" qui ne peuvent pas utiliser
/run
directementLa vraie différence réside dans le fait que votre programme est exécuté par un utilisateur arbitraire non privilégié, sous son propre ID utilisateur. Mais vous ne voulez généralement pas utiliser
/tmp
, car d’autres utilisateurs non privilégiés peuvent y accéder. Vous préférez utiliser$XDG_RUNTIME_DIR
. Généralement, ceci est implémenté comme/run/user/$(id -u)
- il se trouve qu’il s’agit également d’un sous-répertoire/run
. L'emplacement n'est pas garanti cependant; les programmes doivent toujours utiliser la variable d'environnement./tmp
ne serait utile que pour une coopération ad hoc entre différents utilisateurs non privilégiés du système. De tels systèmes ad-hoc sont vulnérables au refus d'un utilisateur malveillant de coopérer et de gâter tout le monde :). Un exemple serait les utilisateurs non privilégiés qui décideraient d'exécuter une version dutalk
démon, en utilisant un socket Unix.Information originale de Lennart Poettering
Notez que la liste de contrôle de Poettering ci-dessous indique que
/tmp
cela serait utile pour les "petits fichiers", alors/run
qu'il ne devrait être utilisé que pour les "primitives de communication". Je ne pense pas que cette distinction soit vraie non plus. Le posteur pour/run
estudev
, et je suis à peu près sûr,/run/udev
inclut des bases de données internes. Une fois que vous avez un/run
répertoire, je ne pense pas que quiconque veuille suivre la distinction revendiquée et créer un autre répertoire, pour encombrer/tmp
. Donc, en pratique, nous utilisons simplement de/run
nos jours....
...
...
...
Nous nous débrouillons un peu avec leJ'ai mal lu/tmp
socket hérité utilisé par le système X Window, comme décrit ci-dessus.tmpfiles.d/x11.conf
. On dirait plus que ça dépend de la coopération :). Je suppose que le code a été vérifié, de sorte que le déni de service est le pire qui puisse arriver.la source
/tmp
("les seules API à utiliser doivent être mkstemp (), mkdtemp () (et amis) pour être totalement sûr")./var/run
système (par exemple pour communiquer avec la base de données locale),/tmp/
est maintenant créée par utilisateur . Historiquement, le quota de / tmp était également différent. Et la réponse manque qu'une distinction sémantique d'utilisation est également importante.Les annuaires
/tmp
et/usr/tmp
(plus tard/var/tmp
) étaient le dépotoir pour tout et pour tout le monde. Le seul mécanisme de protection des fichiers de ces répertoires est le "sticky bit" qui limite la suppression ou le changement de nom des fichiers à leurs propriétaires. Comme l'a souligné marcelm dans un commentaire, rien n'empêche en principe de créer des fichiers avec des noms utilisés par des services (tels quenginx.pid
ousshd.pid
). (Cependant, dans la pratique, les scripts de démarrage peuvent supprimer d’abord ces faux fichiers.)/run
a été établi pour les données d'exécution non persistantes de services de longue durée tels que les verrous, les sockets, les fichiers pid, etc. Comme il n’est pas accessible en écriture pour le public, il protège les données d’exécution du service du désordre/tmp
et les tâches qui y sont nettoyées. En effet: deux distributions que je lance (sans jeu de mots) ont des autorisations 755 sur/run
, tandis que/tmp
et/var/tmp
(et/dev/shm
d'ailleurs) ont des autorisations 1777.la source
/tmp
, ainsi que de fournir un abri sûr pour ces données à partir des divers travaux de nettoyage qui piétinent/tmp
./run
la structure complexe (bien ...) des répertoires causée parudev
,udisk
etc./tmp/nginx.pid
mais il existe déjà à cause d'un programme qui se comporte mal./run/
empêche cela en exigeant des privilèges pour écrire dans./tmp
est l'emplacement de création des fichiers temporaires et des répertoires. Il n'est pas utilisable pour stocker des "noms connus" (c'est-à-dire des noms dont un autre processus peut avoir connaissance sans que vous ayez à lui transmettre le nom) parce que personne n'est propriétaire de l'espace de noms; n'importe qui peut y créer des fichiers. En tant que tel, vous l'utilisez généralement lorsque vous avez un utilitaire nécessitant un fichier (c.-à-d. Pas un tuyau) comme entrée ou sortie, où tout nom (généré aléatoirement) fonctionnera aussi longtemps que vous le passerez.Historiquement, certaines choses (comme X) ont violé ce principe et ont mis des noms connus (comme
.X11-unix
) dans/tmp
. Ceci est bien sûr bogué et permet à tout utilisateur de créer un fichier avec le nom souhaité en premier. De telles choses appartiennent à/run
(ou équivalent/var/run
si vous ne vous abonnez pas au révisionnisme Freedesktop.org). Bien sûr, il serait même préférable de les empêcher de ne pas utiliser de noms connus dans un espace de noms global, mais plutôt de les contourner.la source
.socket
fichiers systemd ... mais cela n’aide en rien les répertoires entiers, ni les services nouvellement installés/run/
elle-même a été adoptée par FHS, je ne vois pas en quoi cela aurait un rapport avec fd.o. À moins que nous ne voulions vraiment nous plaindre, ce sont des efforts de développement non spécifiés qui ont contribué à la fois./run
, il peut être préférable d’éviter d’encombrer le/tmp
répertoire partagé avec encore plus de fichiers.Selon la norme de hiérarchie du système de fichiers,
/run
est pour les données variables d'exécution c.-à-d. des informations sur le système en cours depuis le redémarrage/tmp
est un endroit générique pour les fichiers temporaires.Ainsi, tout ce qui concerne l'état du démon, les utilisateurs connectés, les périphériques amovibles montés, etc. serait inséré pendant
/run
que les fichiers temporaires créés par un programme y seraient insérés/tmp
.Edit: comme l'a souligné @JdeBP dans le commentaire ci-dessous,
la source
/tmp
"anciens" fichiers; sans de tels mécanismes destinés à/run
. D'où la limite draconienne à ce que les programmes peuvent attendre de la durée de vie de tout ce qui est mis en place/tmp
. Alors que les programmes peuvent s’attendre à ce que les fichiers durent plus longtemps/run
sur un système continuellement en place, ils sont également censés s’organiser davantage après eux-mêmes.