Gibt es unter Linux ein Verzeichnis, das / dev / null entspricht?

84

Wenn Sie eine Anwendung konfigurieren, können Sie diese häufig /dev/nullals Konfigurationsdatei verwenden, wenn die Anwendung eine leere Datei lesen soll. Wenn die Anwendung jedoch eine Liste von Dateien aus einem Verzeichnis liest, können Sie diesen Trick nicht anwenden. Sie müssten ihm ein leeres Verzeichnis zum Lesen geben.

Ich habe mich gefragt: Hat Linux ein leeres Standardverzeichnis, das für solche Zwecke verwendet werden kann? Ich weiß, dass OpenSSH / var / empty für eine Weile verwendet hat, und ich kann natürlich selbst ein leeres Verzeichnis erstellen, aber vielleicht hat das FHS ein Standardverzeichnis dafür angegeben?

Roelvanmeer
quelle
8
Ist auf meinem System /var/emptynicht leer, sondern enthält einen Ordner mit dem Namen sshd, sodass Sie diesen wahrscheinlich nicht verwenden möchten.
Knub
12
Nur ein Punkt: Das Besondere /dev/nullist nicht so sehr für das Lesen als zum Schreiben. Daten, auf die geschrieben wurde, /dev/nullverschwinden. Ein Verzeichnisäquivalent wäre also ein Ort, an dem mv yourfile /dev/emptyIhre Datei gelöscht wird.
Wildcard
4
@Wildcard Ich nehme an du meinst mv yourfile /dev/empty/. In diesem mv yourfile /dev/emptyFall versuchen Sie, das spezielle Verzeichnis zu ersetzen.
Rhymoid
6
@Jules Nein, das ist es nicht. Sie können mit /dev/nullund nichts initialisieren, ddda ddsie eine EOF erhalten, bevor sie überhaupt ein einziges Byte geschrieben hat. Ich denke, Sie denken an das /dev/zero, was oft verwendet wird, um etwas mit einer bestimmten Anzahl von Nullen zu füllen oder diese zu erzeugen.
Micheal Johnson
2
@MichealJohnson du hast recht, mein Fehler, würde ich verwirrt /dev/nullmit /dev/zero.
Jules

Antworten:

66

Das FHS bietet kein "normales" leeres Verzeichnis.

Es ist üblich, dass Linux-Systeme ein Verzeichnis bereitstellen. /var/emptyDieses Verzeichnis ist jedoch nicht in FHS definiert und darf eigentlich nicht leer sein. Stattdessen erstellen bestimmte Daemons hier ihre eigenen leeren Verzeichnisse. Beispielsweise verwendet openssh das leere Verzeichnis /var/empty/sshdzur Trennung von Berechtigungen.

Wenn Sie nur vorübergehend ein leeres Verzeichnis benötigen, können Sie selbst ein leeres Verzeichnis als Unterverzeichnis von /runoder erstellen /tmp. Wenn Sie dies außerhalb des Programms tun, können Sie dies verwenden mktemp -doder die mkdtemp(3)C-Funktion in Ihrem Programm verwenden. Wenn Sie jedoch immer ein leeres Verzeichnis benötigen, sollten Sie eines /var/emptywie bei openssh erstellen.

Für diesen Anwendungsfall /tmpist es wahrscheinlich am besten , ein Verzeichnis unter zu erstellen , obwohl es in der Praxis nicht sehr wichtig ist, wo Sie es ablegen.

Michael Hampton
quelle
5
Ich würde nicht empfehlen, Unterverzeichnisse unter zu erstellen /var/empty, da alle Programme, die es verwenden (wie OpenSSH in seiner Standardkonfiguration ), erwarten können, dass es tatsächlich leer ist. (Das /var/empty/sshdDing scheint ein seltsamer RedHat-Ismus zu sein; /var/run/sshdstattdessen verwendet Debian .)
Ilmari Karonen
3
@IlmariKaronen Der Code, den Sie verlinkt haben, unterstützt Ihre Behauptung, dass OpenSSH erwartet /var/empty, leer zu sein, nicht. Gibt es irgendwo anders, wo man das suchen könnte?
Michael Hampton
2
@IlmariKaronen Hm, das Dokument ist veraltet. Es bezieht sich auf /var/emptyden tatsächlich verwendeten Code /var/empty/sshd. Versuch es noch einmal. :)
Michael Hampton
1
@IlmariKaronen Hmm. Ich denke, Sie haben Recht, nachdem Sie sich die Quelle angesehen haben, die chroot () aufruft. Ich finde es erstaunlich, dass es in OpenSh einen offensichtlich dummen Fehler geben würde, für den Red Hat eine nachgelagerte Korrektur vornehmen müsste.
Michael Hampton
2
Ich verstehe nicht, wie es ein "dummer Fehler" ist - ein garantiert leeres Stammverzeichnis an einem Standardspeicherort für die Verwendung als Chroot-Gefängnis scheint mir eine perfekte Idee zu sein. Natürlich musste RedHat es für alle ruinieren, indem es Unterverzeichnisse darunter erstellte. Daher würde ich für portablen Code empfehlen, ihn für nichts zu verwenden /var/empty, da Sie sich hinsichtlich der Semantik auf einem bestimmten System nicht sicher sind. /var/runSinnvoller erscheint es, ein eigenes leeres Verzeichnis, z. B. unter , zu erstellen, wie es Debian tut.
Ilmari Karonen
37

Mit können Sie mktemp -dein neues leeres temporäres Verzeichnis mit sicheren Berechtigungen in erstellen /tmp/. Das Dienstprogramm gibt den Pfad des neuen Verzeichnisses aus STDOUT, sodass es in der Shell nützlich ist.

Es ist ohnehin portabler als eine System-Unit-Datei.

oals
quelle
Ja, das könnten Sie, aber das ist unpraktisch, wenn dieses Verzeichnis in einer Konfigurationsdatei angegeben werden muss. Du würdest ein permanentes Verzeichnis dafür haben wollen.
Roelvanmeer
22

Diese Unix-Frage enthält einige Vorschläge zum Erstellen eines "Blackhole" -Verzeichnisses , einschließlich eines nullfs-FUSE-Dateisystems .

200_erfolg
quelle
1
Ich weiß nicht, warum die Antwort mktemp / mkdtemp so heftig gestimmt wird, wenn dies die perfekte Antwort ist. nullfs ist das Äquivalent von / dev / null.
chx
11

Für Dienste bietet systemd die Möglichkeit PrivateTmp, private /tmpund /var/tmpVerzeichnisse zu erstellen , die von Prozessen außerhalb des Namespaces für diesen Dienst nicht gemeinsam genutzt werden und die (anfangs) leer sein sollten.

[Service]
ExecStart=...
PrivateTmp=yes 
HBruijn
quelle
7
Das Programm erstellt möglicherweise andere temporäre Dateien. Sie können also nicht davon ausgehen /tmp, dass sie leer sind, nur weil sie einen Namespace haben.
Michael Hampton