De acordo com o FHS-3.0 , /tmp
é para arquivos temporários e /run
para dados variáveis em tempo de execução. Os dados /run
devem ser excluídos na próxima inicialização, o que não é necessário /tmp
, mas os programas ainda não devem assumir que os dados /tmp
estarão disponíveis no próximo início do programa. Tudo isso parece muito parecido comigo.
Então qual é a diferença entre os dois? Por qual critério um programa deve decidir se coloca /tmp
ou não dados temporários /run
?
De acordo com a ESF:
Os programas podem ter um subdiretório de
/run
; isso é recomendado para programas que usam mais de um arquivo de tempo de execução.
Isso indica que a distinção entre "programas do sistema" e "programas comuns" não é um critério, nem a vida útil do programa (como processo de execução longa versus execução curta).
Embora a lógica a seguir não seja dada na ESF, /run
foi introduzida para superar o problema que /var
foi montado tarde demais, de modo que truques sujos eram necessários para /var/run
disponibilizar com antecedência suficiente. No entanto, agora, ao /run
ser apresentado, e dada sua descrição na ESF, não parece haver uma razão clara para ter ambos /run
e /tmp
.
fonte
Respostas:
Não há razão para ter ambos / run e / tmp
Eu acho que você está certo.
/tmp
está essencialmente obsoleto agora temos/run
. Se o seu programa estiver em condições de fazê-lo (o que exige que ele tenha sido instalado como uma operação privilegiada), hoje em dia você usaria um subdiretório/run
. Isto é por razões de segurança.Por exemplo, o daemon de impressão CUPS não é executado como root, mas geralmente é instalado a partir de um pacote do SO. O pacote instala
/usr/lib/tmpfiles.d/cups.conf
esystemd-tmpfiles
cria um diretório que ele pode acessar. Como o diretório está sob/run
, o nome não pode ter sido reivindicado maliciosamente por um usuário sem privilégios, diferente do/tmp
que é gravável no mundo."Programas não privilegiados" que não podem ser usados
/run
diretamenteA distinção real é se o seu programa estiver sendo executado por um usuário arbitrário e sem privilégios, com seu próprio ID de usuário. Mas você geralmente ainda não deseja usar
/tmp
, porque pode ser acessado por outros usuários não privilegiados. Você prefere usar$XDG_RUNTIME_DIR
. Normalmente, isso é implementado como/run/user/$(id -u)
- portanto, também é um subdiretório/run
. A localização não é garantida; programas sempre devem usar a variável de ambiente./tmp
seria útil apenas para cooperação ad-hoc entre diferentes usuários não privilegiados no sistema. Esses sistemas ad-hoc são vulneráveis a um usuário mal-intencionado que se recusa a cooperar e estraga tudo para todos :). Um exemplo seria usuários sem privilégios que decidem executar uma versão dotalk
daemon, usando um soquete unix.Informação original de Lennart Poettering
Observe que a lista de verificação de Poettering abaixo alegou que
/tmp
seria útil para "arquivos pequenos", enquanto que/run
deveria ser usada apenas para "primitivas de comunicação". Também não acho que essa distinção seja verdadeira. O garoto-propaganda de/run
éudev
, e tenho certeza que/run/udev
inclui bancos de dados internos. Depois de ter um/run
diretório, acho que ninguém quer seguir a distinção reivindicada e criar outro diretório, para desordenar/tmp
. Então, na prática, usamos apenas/run
hoje em dia....
...
...
...
Nós meio que escapamos doEu interpretei errado/tmp
soquete herdado usado pelo sistema X window, como descrito acima.tmpfiles.d/x11.conf
. Parece mais com a cooperação :). Presumo que o código foi auditado, de modo que a negação de serviço é a pior coisa que pode acontecer.fonte
/tmp
("as únicas APIs para usá-lo devem ser mkstemp (), mkdtemp () (e amigos) para ser totalmente seguro")./var/run
é um sistema amplo (por exemplo, para se comunicar com o banco de dados local),/tmp/
agora é criado por usuário . Historicamente, também a cota de / tmp foi definida diferente. E a resposta perde que uma distinção semântica de uso também é importante.Os diretórios
/tmp
e/usr/tmp
(mais tarde/var/tmp
) costumavam ser o depósito de lixo para tudo e para todos. O único mecanismo de proteção para arquivos nesses diretórios é o bit que restringe a exclusão ou renomeação de arquivos para seus proprietários. Como o marcelm apontou em um comentário, não há, em princípio, nada que impeça alguém de criar arquivos com nomes usados pelos serviços (comonginx.pid
ousshd.pid
). (Na prática, os scripts de inicialização podem remover esses arquivos falsos primeiro.)/run
foi estabelecido para dados de tempo de execução não persistentes de serviços de longa duração, como bloqueios, soquetes, arquivos pid e similares. Como não é gravável para o público, protege os dados de tempo de execução do serviço da bagunça/tmp
e dos trabalhos que são limpos lá. Na verdade: duas distribuições que eu corro (sem trocadilhos) têm permissões 755/run
, enquanto/tmp
e/var/tmp
(e,/dev/shm
nesse caso) têm permissões 1777.fonte
/tmp
- Também para fornecer um porto seguro para os dados mencionados, dos vários trabalhos de limpeza que ocorrem normalmente/tmp
./run
e confira o complexo estrutura de diretório (bem ...) causada porudev
,udisk
etc. Eu não sou um especialista sobre esta questão particular, mas eu acho que os scripts de inicialização (que são executados como superusuário) configurar tudo./tmp/nginx.pid
mas ele já existe por causa de algum programa que se comporta mal./run/
evita isso exigindo privilégios nos quais gravar./tmp
é o local para criação de arquivos e diretórios temporários. Não é útil armazenar "nomes conhecidos" (ou seja, nomes que outro processo poderia ter conhecimento sem que você tivesse que transmitir o nome de alguma forma) porque ninguém possui propriedade sobre o espaço para nome; qualquer um pode criar arquivos lá. Como tal, você geralmente o utiliza quando possui um utilitário que precisa de um arquivo (por exemplo, não um canal ou outro) como entrada ou saída, onde qualquer nome (gerado aleatoriamente) funcionará desde que você o passe.Historicamente, algumas coisas (como X) violaram esse princípio e colocaram nomes conhecidos (como
.X11-unix
)/tmp
. Obviamente, isso é um buggy e permite que qualquer usuário faça o serviço de DoS, precisando simplesmente fazê-lo correndo para criar um arquivo com o nome desejado primeiro. Essas coisas pertencem a/run
(ou equivalentemente,/var/run
se você não assinar o revisionismo do Freedesktop.org). É claro que o melhor seria corrigi-los para não usar nomes conhecidos em um espaço para nome global, mas passar um nome de caminho.fonte
.socket
arquivos ... mas isso não ajuda para diretórios inteiros, nem para os serviços recém-instalados/run/
em si foi adotado pela ESF, não vejo como isso tem a ver com a fd.o. A menos que realmente pretendamos reclamar, há esforços de desenvolvimento não especificados que contribuíram para ambos./run
, sob , ele pode optar por evitar sobrecarregar o/tmp
diretório compartilhado com mais arquivos.De acordo com o padrão de hierarquia do sistema de arquivos,
/run
é para dados variáveis de tempo de execução, ou seja, informações sobre o sistema em execução desde a reinicialização/tmp
é um local genérico para arquivos temporários.Portanto, qualquer coisa relacionada ao status do daemon, usuários conectados, dispositivos removíveis montados etc. entraria
/run
enquanto os arquivos temporários criados por um programa entrariam/tmp
.Edit: como apontado por @JdeBP no comentário abaixo,
fonte
/tmp
arquivos "antigos"; sem esses mecanismos destinados/run
. Daí o limite draconiano sobre o que os programas podem esperar da vida de qualquer coisa colocada/tmp
. Embora os programas possam esperar que os arquivos permaneçam mais tempo em/run
um sistema continuamente ativo, também é esperado que eles se arrumam mais lá.