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?

roelvanmeer
fonte
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.

Michael Hampton
fonte
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.

Oals
fonte
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
22

Esta questão do Unix tem algumas sugestões para criar um diretório "blackhole", incluindo um sistema de arquivos nullfs FUSE .

200_success
fonte
11
Não sei por que a resposta mktemp / mkdtemp é tão fortemente votada quando essa é a resposta perfeita. nullfs é o equivalente a / dev / null.
chx
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 
HBruijn
fonte
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