Emplacement idiomatique pour les sockets basées sur des fichiers sur les systèmes Debian

13

J'écris un processus démon pour un système Debian Cqui utilise un socket de domaine Unix .

Si le répertoire de travail du processus démon est le répertoire racine, existe-t-il un répertoire idiomatique pour placer le socket sur le système de fichiers?

recursion.ninja
la source
Pourquoi ne laissez-vous pas cela être configurable?
BatchyX
3
@BatchyX Eh bien, une sorte de valeur par défaut (plutôt que de forcer chaque administrateur à prendre sa propre décision) peut certainement être agréable. :)
un CVn

Réponses:

17

Ils se trouvent généralement dans /tmpou un sous-répertoire de ceux-ci. Notez que tout /tmpest sujet à l'effacement à l'arrêt - pas qu'il soit nécessairement effacé, mais sachez que cela peut être , donc si vous l'utilisez, vérifiez si vous devez créer votre sous-répertoire à chaque fois. Vous voudrez utiliser un sous-répertoire si vous souhaitez restreindre l'accès via des autorisations, car il /tmpest lisible par tout le monde.

/runet /var/run(qui peuvent être liés par un lien symbolique) sont utilisés de la même manière, mais ils sont généralement montés en tant que systèmes de fichiers tmpfs - ce qui signifie qu'ils sont créés au démarrage et résident en mémoire , pas sur le disque (ne les utilisez donc pas comme un emplacement de vidage). quantité de données abondante). Pour un socket d'exécution, c'est probablement un bon choix.

Notez que /run, et tous les autres répertoires mentionnés ici sauf /tmp , ne sont accessibles en écriture que par root. Pour un processus système, c'est très bien, mais si l'application peut être exécutée par un utilisateur non privilégié, vous voulez soit utiliser /tmpou créer un répertoire permanent quelque part et définir des autorisations à ce sujet, soit utiliser un emplacement dans le $ HOME de l'utilisateur.

Il est possible de créer un répertoire dans /usr/share(ou /usr/local/share) lors de l'installation. Les répertoires et le contenu ne sont pas potentiellement récupérés à travers les initialisations comme ils le seraient dans /tmpou /run. Cependant, comme jordanm le fait remarquer dans les commentaires, il /usrpeut être monté en lecture seule et les directives de la hiérarchie du système de fichiers linux le reflètent . Bien sûr, il ne peut pas être en lecture seule lorsque votre application est installée, donc si vous êtes à l'aise pour y créer un socket, vous pouvez le laisser et l'utiliser plus tard (vous pourrez toujours écrire sur le socket même si le fichier est en lecture seule).

Si vous voulez un endroit persistant à travers les bottes qui ne sera pas monté en lecture seule, /etcc'est une valeur assez sûre, car il est souvent utilisé pour les configurations et reconfigurations à l'échelle du système. OTOH, il est possible d'avoir des systèmes où le périphérique sous-jacent à l'ensemble du système de fichiers racine est en lecture seule (par exemple, les systèmes intégrés), avec / tmp et / exécuté sur un autre périphérique (probablement: tmpfs en mémoire). Ainsi, les deux stratégies les plus robustes semblent être:

  • Installez le socket à un emplacement permanent lorsque l'application est installée.

  • Créez un répertoire dans /runou /var/runà l'exécution et placez-y le socket.

  • Faites la même chose qu'en /tmp.

L'avantage du premier est que, quoi qu'il en soit, une fois l'application installée, vous aurez un socket à utiliser. L'avantage du second est qu'il peut être plus propice à une programmation saine. L'avantage du troisième est qu'il ne nécessite pas de privilèges de superutilisateur. Il devrait être facile de passer d'une implémentation à une autre si vous changez d'avis plus tard.

Enfin, comme l'a mentionné BatchyX , vous devriez au moins offrir une option de configuration pour cela, en retombant sur votre choix de valeur par défaut.

boucle d'or
la source
2
/runou /var/runest également souvent utilisé pour les processus racine.
BatchyX
Droite. Ce sont encore plus tmp que /tmp. Je vais le modifier.
goldilocks
/usrpeut être monté en lecture seule. Les fichiers ne doivent jamais y être créés lors de l'exécution. Les autres suggestions sont bonnes.
jordanm
1
Merci à tous pour votre contribution, la discussion a été très informative. J'ai décidé de faire l'emplacement par défaut /tmp/.APPNAME/.APPSOCKcar le démon n'a pas besoin de données persistantes.
recursion.ninja
1
Une autre différence clé entre /tmpet /run, est que seul root a des autorisations d'écriture sur /run.
BatchyX