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
e systemd-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
diretamente
A 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 do talk
daemon, usando um soquete unix.
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.
O uso de namespaces compartilhados graváveis em todo o mundo [como / tmp] para fins de comunicação sempre foi problemático, pois para estabelecer a comunicação você precisa de nomes estáveis, mas os nomes estáveis abrem as portas para ataques de DoS. Isso pode ser corrigido parcialmente, estabelecendo diretórios por aplicativo protegidos para determinados serviços durante a inicialização antecipada (como fazemos no X11), mas isso corrige apenas parcialmente o problema, pois isso funciona corretamente se todas as instalações de pacotes forem seguidas por uma reinicialização.
...
Outro recurso do Fedora (para o Fedora 17) mudou a semântica do / tmp para muitos serviços do sistema para torná-los mais seguros, isolando os namespaces / tmp dos vários serviços
...
Como / tmp não é mais necessariamente um espaço para nome compartilhado, geralmente é inadequado como local para primitivas de comunicação.
...
[/ run] tem a garantia de ser um tmpfs e, portanto, é liberado automaticamente nas botas. Nenhuma limpeza automática é feita além disso.
...
Aqui está um guia aproximado de como sugerimos que você (um desenvolvedor de aplicativos Linux) escolha o diretório certo para usar:
- Você precisa de um local para colocar seu soquete (ou outra primitiva de comunicação) e seu código é privilegiado: use um subdiretório abaixo / execute. (Ou abaixo de / var / run para compatibilidade extra.)
- Você precisa de um local para colocar seu soquete (ou outra primitiva de comunicação) e seu código é executado sem privilégios: use um subdiretório abaixo de $ XDG_RUNTIME_DIR.
- Você precisa de um local para colocar seus downloads e downloads maiores em andamento e executar sem privilégios: use $ XDG_DOWNLOAD_DIR.
- Você precisa de um local para colocar arquivos de cache que devem ser persistentes e executados sem privilégios: use $ XDG_CACHE_HOME.
- Nada disso se aplica e você precisa colocar um arquivo pequeno que não precise de persistência: use $ TMPDIR com um fallback em / tmp. E use mkstemp () e mkdtemp () e nada caseiro.
- Caso contrário, use $ TMPDIR com um fallback em / var / tmp. Use também mkstemp () / mkdtemp ().
Observe que essas regras acima são sugeridas apenas por nós. Essas regras levam em consideração tudo o que sabemos sobre esse tópico e evitam problemas com distribuições atuais e futuras, tanto quanto podemos vê-las. Por favor, considere atualizar seus projetos para seguir essas regras e tenha em mente se você escrever um novo código.
Uma coisa que gostaríamos de enfatizar é que / tmp e / var / tmp com mais frequência do que não são, na verdade, a escolha certa para a sua utilização. Existem usos válidos desses diretórios, mas muitas vezes outro diretório pode realmente ser o melhor lugar. Portanto, tenha cuidado, considere as outras opções, mas se você optar por / tmp ou / var / tmp, certifique-se de usar mkstemp () / mkdtemp ().
Nós meio que escapamos do /tmp
soquete herdado usado pelo sistema X window, como descrito acima. Eu interpretei errado 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.