在Linux中是否有一个等效于/ dev / null的目录?


84

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

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


8
在我的系统上,/var/empty它不是空的,但包含一个名为的文件夹sshd,因此您可能不想使用该文件夹。
knub

12
只是一个点:特殊用途方面/dev/null是没有这么多的阅读写作。 写入的数据/dev/null消失了。因此,等效目录将是mv yourfile /dev/empty导致删除文件的地方。
通配符

4
@Wildcard我想你是说mv yourfile /dev/empty/。如果这样做mv yourfile /dev/empty,则尝试替换特殊目录。
Rhymoid '16

6
@Jules不,不是。您无法使用/dev/null和初始化任何东西,dd因为dd在写入单个字节之前会获得EOF。我认为您正在考虑/dev/zero,它通常用于填充某些东西或生成特定数量的零。
米歇尔·约翰逊

2
@MichealJohnson你是对的,我的错误,我会感到困惑/dev/null/dev/zero
Jules

Answers:


66

FHS不提供“标准”的空目录。

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

如果您临时需要一个空目录,则可以自己创建一个空目录,作为/run或的子目录/tmp。如果要在程序外部执行此操作,则可以使用mktemp -d它,也可以在mkdtemp(3)程序内部使用C函数。尽管如果您始终需要空目录,请考虑/var/empty像在openssh 下创建一个目录。

对于此用例,在下面创建目录/tmp可能是最合适的,尽管在实践中放置目录并不重要。


5
我不建议在下创建子目录/var/empty,因为任何使用它的程序(例如,默认配置中的 OpenSSH )都可能期望它实际上为空。(/var/empty/sshd事情似乎是一种怪异的RedHat主义; Debian则使用了/var/run/sshd。)
Ilmari Karonen

3
@IlmariKaronen您所链接的部分代码不支持您断言OpenSSH预期/var/empty为空。还有其他地方可以找这个吗?
迈克尔·汉普顿

2
@IlmariKaronen嗯,该文件已过时。它引用,/var/empty但代码实际使用/var/empty/sshd。再试一次。:)
迈克尔·汉普顿

1
@IlmariKaronen嗯。现在,在实际查看chroot()调用的源代码之后,我认为您是对的。我感到惊讶的是,openssh中会存在如此明显的愚蠢缺陷,以至于Red Hat必须对其进行下游纠正。
迈克尔汉普顿

2
我看不出它是什么“愚蠢的缺陷”-在我的标准位置上,有一个保证空的root拥有的目录,用作chroot监狱,对我来说似乎是个好主意。当然,RedHat必须通过在其下创建子目录去破坏每个人。结果,我对可移植代码的建议是不要/var/empty用于任何东西,因为您不能确定其在任何给定系统上的语义。在/var/runDebian 下创建自己的空目录(例如在下)似乎更明智。
Ilmari Karonen

37

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

无论如何,它比systemd单位文件更可移植。


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


11

对于服务,systemd提供了PrivateTmp创建私有/tmp/var/tmp目录的选项,这些私有和目录不会被该服务的名称空间之外的进程共享,并且应为空(最初)。

[Service]
ExecStart=...
PrivateTmp=yes 

7
该程序可能会创建其他临时文件,因此您不能/tmp仅仅因为它已被命名空间而不能假定其为空。
迈克尔·汉普顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.