Existe um diretório equivalente a / dev / null no Linux?


84

Ao configurar um aplicativo, geralmente você pode usar /dev/nullcomo arquivo de configuração se desejar que o aplicativo leia um arquivo vazio. Mas, se o aplicativo ler uma lista de arquivos de um diretório, você não poderá usar esse truque. Você precisaria fornecer um diretório vazio para ler.

Eu queria saber: o Linux tem um diretório vazio padrão que pode ser usado para tais fins? Sei que o OpenSSH usou / var / empty por um tempo e, é claro, posso criar um diretório vazio, mas talvez o FHS tenha especificado um diretório padrão para isso?


8
No meu sistema, /var/emptynão está vazio, mas contém uma pasta chamada sshd, portanto você provavelmente não deseja usá-lo.
tipo protuberância

12
Apenas um ponto: o aspecto especial de /dev/nullnão é tanto para a leitura como para a escrita. Os dados gravados /dev/nullapenas desaparecem. Portanto, um diretório equivalente seria um local onde mv yourfile /dev/emptyresultaria na exclusão do seu arquivo.
Curinga

4
@Wildcard Presumo que você quer dizer mv yourfile /dev/empty/. Se fizer isso mv yourfile /dev/empty, você está tentando substituir o diretório especial.
Rhymoid

6
@ Jules Não, não é. Você não pode inicializar nada com /dev/nulle ddporque ddreceberá um EOF antes mesmo de escrever um único byte. Eu acho que você está pensando /dev/zero, que geralmente é usado para preencher algo com ou gerar um número específico de zeros.
Micheal Johnson

2
@MichealJohnson você está certo, o meu erro, eu confundido /dev/nullcom /dev/zero.
Jules

Respostas:


66

O FHS não fornece diretório vazio "padrão".

É comum que os sistemas Linux forneçam um diretório /var/empty, mas esse diretório não está definido no FHS e pode não estar realmente vazio. Em vez disso, certos daemons criarão seus próprios diretórios vazios aqui. Por exemplo, o openssh usa o diretório vazio /var/empty/sshdpara a separação de privilégios.

Se sua necessidade de um diretório vazio for transitória, você mesmo poderá criar um diretório vazio, como um subdiretório de /runou /tmp. Se você estiver fazendo isso fora do programa, poderá usá mktemp -d-lo ou usar a mkdtemp(3)função C dentro do seu programa. Embora se você sempre precise que o diretório vazio esteja presente, considere criar um sob /var/emptycomo o openssh.

Nesse caso de uso, a criação de um diretório em /tmpprovavelmente é o melhor ajuste, embora na prática não importe muito onde você o coloca.


5
Eu não recomendaria a criação de subdiretórios sob /var/empty, pois qualquer programa que o utilize (como o OpenSSH em sua configuração padrão ) pode esperar que ele esteja realmente vazio. (A /var/empty/sshdcoisa parece ser um RedHat-ismo estranho; Debian usa /var/run/sshdem seu lugar.)
Ilmari Karonen

3
@IlmariKaronen O pedaço de código que você vinculou não suporta sua afirmação de que o OpenSSH espera /var/emptyestar vazio. Existe algum outro lugar que alguém possa procurar por isso?
Michael Hampton

2
@IlmariKaronen Hm, esse documento está desatualizado. Refere-se a, /var/emptymas o código realmente usa /var/empty/sshd. Tente novamente. :)
Michael Hampton

11
@IlmariKaronen Hmm. Agora acho que você está certo, depois de realmente olhar para a fonte que chama chroot (). Acho incrível que exista uma falha obviamente estúpida no openssh, que a Red Hat teria que manter uma correção a jusante.
Michael Hampton

2
Não vejo como é uma "falha estúpida" - ter um diretório de propriedade de raiz vazio garantido em um local padrão, para ser usado como uma prisão chroot, parece uma boa idéia para mim. Obviamente, o RedHat teve que arruiná-lo para todos, criando subdiretórios sob ele. Como resultado, minha recomendação para código portátil seria não usar /var/emptypara nada, pois você não pode ter certeza de sua semântica em nenhum sistema. Criar seu próprio diretório vazio, por exemplo /var/run, sob , como o Debian, parece mais sensato.
Ilmari Karonen

37

Você pode usar mktemp -dpara criar um novo diretório temporário vazio com permissões seguras, por padrão em /tmp/. O utilitário exibirá o caminho do novo diretório STDOUT, por isso é útil no shell.

É mais portátil do que um arquivo de unidade systemd de qualquer maneira.


Sim, você poderia, mas isso é impraticável se esse diretório precisar ser especificado em um arquivo de configuração. Você gostaria de um dir permanente para isso.
roelvanmeer


11

Para serviços, o systemd fornece a opção PrivateTmpde criar diretórios particulares /tmpe /var/tmpque não são compartilhados por processos fora do espaço de nomes para esse serviço e que devem estar vazios (inicialmente).

[Service]
ExecStart=...
PrivateTmp=yes 

7
O programa pode criar outros arquivos temporários, portanto, você não pode assumir /tmpque estará vazio apenas porque foi colocado no namespace.
Michael Hampton
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.