Existe-t-il un équivalent de répertoire / dev / null sous Linux?

84

Lors de la configuration d'une application, vous pouvez souvent utiliser /dev/nullcomme fichier de configuration si vous souhaitez que l'application lise un fichier vide. Toutefois, si l'application lit une liste de fichiers d'un répertoire, vous ne pouvez pas utiliser cette astuce. Vous devez lui donner un répertoire vide à lire.

Je me demandais: est-ce que Linux a un répertoire vide par défaut qui peut être utilisé à ces fins? Je sais que OpenSSH a utilisé / var / empty pendant un moment, et je peux bien sûr créer un répertoire vide moi-même, mais peut-être que la FHS a spécifié un répertoire standard pour cela?

Roelvanmeer
la source
8
Sur mon système, /var/emptyn’est pas vide, mais contient un dossier appelé sshd, de sorte que vous ne voulez probablement pas l’utiliser.
Knub
12
Juste un point: L'aspect spécial de la lecture/dev/null n'est pas tant pour la lecture que pour l' écriture. Les données écrites pour /dev/nulldisparaître. Ainsi, un répertoire équivalent serait un endroit où mv yourfile /dev/emptyle fichier serait supprimé.
Wildcard
4
@Wildcard je suppose que vous voulez dire mv yourfile /dev/empty/. Si vous le faites mv yourfile /dev/empty, vous essayez de remplacer le répertoire spécial.
Rhymoid
6
@ Jules Non, ce n'est pas. Vous ne pouvez rien initialiser avec /dev/nullet ddparce ddque vous obtiendrez un EOF avant même qu’il n’ait écrit un seul octet. Je pense que vous pensez à /dev/zero, qui est souvent utilisé pour remplir quelque chose ou générer un nombre spécifique de zéros.
Micheal Johnson
2
@ MichealJohnson vous avez raison, mon erreur, j'ai confondu /dev/nullavec /dev/zero.
Jules

Réponses:

66

La FHS ne fournit pas de répertoire vide "standard".

Il est courant que les systèmes Linux fournissent un répertoire /var/empty, mais ce répertoire n'est pas défini dans FHS et peut ne pas être vide. Au lieu de cela, certains démons vont créer leurs propres répertoires vides ici. Par exemple, openssh utilise le répertoire vide /var/empty/sshdpour la séparation des privilèges.

Si votre besoin d'un répertoire vide est transitoire, vous pouvez créer vous-même un répertoire vide, en tant que sous-répertoire de /runou /tmp. Si vous le faites en dehors du programme, vous pouvez l'utiliser mktemp -dou utiliser la mkdtemp(3)fonction C dans votre programme. Toutefois, si vous avez toujours besoin que le répertoire vide soit présent, pensez à en créer un sous /var/emptycomme le fait openssh.

Pour ce cas d'utilisation, la création d'un répertoire sous /tmpest probablement la meilleure solution, bien qu'en pratique, peu importe où vous le mettez.

Michael Hampton
la source
5
Je ne recommanderais pas de créer des sous-répertoires sous /var/empty, car tous les programmes qui l'utilisent (comme OpenSSH dans sa configuration par défaut ) peuvent s'attendre à ce qu'il soit réellement vide. (La /var/empty/sshdchose semble être un RedHat-isme bizarre; Debian l'utilise /var/run/sshdplutôt.)
Ilmari Karonen
3
@IlmariKaronen Le fragment de code que vous avez lié ne corrobore pas votre affirmation selon laquelle OpenSSH s'attend /var/emptyà être vide. Y a-t-il un endroit où l'on pourrait chercher cela?
Michael Hampton
2
@IlmariKaronen Hm, ce document est obsolète. Il fait référence à /var/emptymais le code utilise réellement /var/empty/sshd. Réessayer. :)
Michael Hampton
1
@IlmariKaronen Hmm. Maintenant, je pense que vous avez raison, après avoir examiné la source qui appelle chroot (). Je trouve étonnant qu’il y ait un défaut aussi manifestement stupide sous openssh que Red Hat devrait maintenir une correction en aval.
Michael Hampton
2
Je ne vois pas en quoi c'est une "faille stupide" - avoir un répertoire garanti vierge appartenant à la racine à un emplacement standard, destiné à être utilisé comme prison chroot, me semble être une très bonne idée. Bien sûr, RedHat devait aller le détruire pour tout le monde, en créant des sous-répertoires. En conséquence, ma recommandation pour le code portable serait de ne pas l'utiliser /var/emptypour quoi que ce soit, car vous ne pouvez pas être sûr de sa sémantique sur un système donné. Créer votre propre répertoire vide, par exemple sous /var/run, comme le fait Debian, semble plus judicieux.
Ilmari Karonen
37

Vous pouvez utiliser mktemp -dpour créer un nouveau répertoire temporaire vide avec des autorisations sécurisées, par défaut dans /tmp/. L'utilitaire affichera le chemin du nouveau répertoire STDOUT, il est donc utile dans le shell.

C'est plus portable qu'un fichier unité systemd de toute façon.

les poulains
la source
Oui, vous le pouvez, mais ce n'est pas pratique si ce répertoire doit être spécifié dans un fichier de configuration. Vous voudriez un répertoire permanent pour cela.
Roelvanmeer
22

Cette question Unix a quelques suggestions pour créer un répertoire "trou noir", y compris un système de fichiers nullfs FUSE .

200_success
la source
1
Je ne sais pas pourquoi la réponse mktemp / mkdtemp est si fortement votée alors que c’est la réponse parfaite. nullfs est l'équivalent de / dev / null.
Chx
11

Pour les services, systemd offre la possibilité PrivateTmpde créer des répertoires privés /tmpet /var/tmpnon partagés par des processus extérieurs à l'espace de noms de ce service et devant être vides (à l'origine).

[Service]
ExecStart=...
PrivateTmp=yes 
HBruijn
la source
7
Le programme peut créer d'autres fichiers temporaires, vous ne pouvez donc pas supposer /tmpqu'il sera vide simplement parce qu'il a été espacé.
Michael Hampton