题 在Linux中是否存在等同于/ dev / null的目录?


配置应用程序时,您经常可以使用 /dev/null 如果您希望应用程序读取空文件,请将其作为配置文件。但是,如果应用程序从目录中读取文件列表,则无法使用此技巧。你需要给它一个空目录来阅读。

我想知道:Linux是否有一个可以用于此类目的的默认空目录?我知道OpenSSH使用了/ var / empty一段时间了,我当然可以自己创建一个空目录,但也许FHS为此指定了一个标准目录?


72
2017-12-07 09:04




在我的系统上, /var/empty 不是空的,但包含一个名为的文件夹 sshd,所以你可能不想使用它。 - knub
只是一点:特殊方面 /dev/null 并非如此 读 至于 写作。  写入的数据 /dev/null 只是消失了。因此,等效的目录将是一个地方 mv yourfile /dev/empty 会导致删除您的文件。 - Wildcard
@Wildcard我认为你的意思 mv yourfile /dev/empty/。如果你这样做 mv yourfile /dev/empty,您正在尝试替换特殊目录。 - Rhymoid
@Jules不,不是。你不能初始化任何东西 /dev/null 和 dd 因为 dd 在写入单个字节之前会得到一个EOF。我想你在考虑 /dev/zero,通常用于填充或生成特定数量的零。 - Micheal Johnson
@MichealJohnson你是对的,我的错,我很困惑 /dev/null同 /dev/zero。 - Jules


答案:


FHS 没有提供“标准”空目录。

Linux系统通常提供目录 /var/empty,但此目录未在FHS中定义,实际上可能不为空。相反,某些守护进程将在此处创建自己的空目录。例如,openssh使用空目录 /var/empty/sshd 用于特权分离。

如果您对空目录的需求是暂时的,您可以自己创建一个空目录,作为子目录 /run 要么 /tmp。如果你在程序之外这样做,你可以使用 mktemp -d 为此,或使用 mkdtemp(3) 程序内部的C函数。虽然如果你 总是 需要空目录存在,考虑创建一个 /var/empty 就像openssh那样。

对于此用例,请在下创建目录 /tmp 可能是最合适的,但在实践中,你把它放在哪里并不重要。


62
2017-12-07 09:11



我不建议在下面创建子目录 /var/empty,因为任何使用它的程序(如OpenSSH) 默认配置)可能期望它实际上是空的。 (该 /var/empty/sshd 事情似乎是一个奇怪的RedHat-ism; Debian使用 /var/run/sshd 代替。) - Ilmari Karonen
@IlmariKaronen您链接的代码不支持您的OpenSSH期望的断言 /var/empty 是空的。有没有其他人可能会寻找这个? - Michael Hampton♦
@IlmariKaronen嗯,那份文件已经过时了。它指的是 /var/empty 但代码实际上使用 /var/empty/sshd。再试一次。 :) - Michael Hampton♦
@IlmariKaronen嗯。现在我认为你是正确的,在实际查看chroot()调用的源之后。令我惊讶的是,在openssh中会出现如此明显的愚蠢缺陷,Red Hat将不得不维持下游修正。 - Michael Hampton♦
我不知道这是一个“愚蠢的缺陷” - 在标准位置有一个保证空的root拥有目录,用作chroot监狱,对我来说似乎是一个非常好的主意。当然,RedHat必须通过在其下创建子目录来为每个人破坏它。因此,我对便携式代码的建议不会被使用 /var/empty 对于任何事情,因为你无法确定它在任何给定系统上的语义。创建自己的空目录,例如下 /var/run像Debian一样,似乎更明智。 - Ilmari Karonen


您可以使用 mktemp -d 默认情况下,使用安全权限创建一个新的空临时目录 /tmp/。该实用程序将输出新目录的路径 STDOUT,所以它在shell中很有用。

无论如何,它比系统单元文件更便携。


37
2017-12-07 11:04



是的,你可以,但如果必须在配置文件中指定该目录,这是不切实际的。你会想要一个永久的目录。 - roelvanmeer


这个Unix问题 有一些建议创建一个“黑洞”目录,包括一个 nullfs FUSE文件系统


19
2017-12-07 21:37



我不知道为什么当这是一个完美的答案时,mktemp / mkdtemp的答案如此重要。 nullfs相当于/ dev / null。 - chx


对于服务,systemd提供了选项 PrivateTmp 创造私人 /tmp 和 /var/tmp 不属于该服务的命名空间之外的进程共享的目录,哪些目录应为空(最初)。

[Service]
ExecStart=...
PrivateTmp=yes 

11
2017-12-07 10:20



该程序可能会创建其他临时文件,因此您无法假设 /tmp 只是因为它被命名空间才会是空的。 - Michael Hampton♦