Em máquinas "cliente", a maneira segura de mover /tmp
é reinicializar. Aqui, por cliente, quero dizer qualquer coisa que rode programas que colocam soquetes em /tmp
, em particular servidores e telas X.
O novo /tmp
definitivamente precisa ter as permissões certas (1777), caso contrário você não pode esperar ter um sistema em funcionamento.
Para /tmp
, você praticamente não pode copiar nenhum arquivo. Isso acontece porque, na maioria das vezes, programas que colocam coisas em /tmp
abrem os arquivos. Se você copiar o arquivo, ele copia o conteúdo, mas os programas ainda têm os arquivos antigos abertos. Você pode ser capaz de acessá-los com um depurador ( ptrace
), mas isso será muito mais complicado do que reinicializar e, com muitos programas, tudo o que você faria seria travá-los de qualquer maneira.
Se o seu /tmp
estiver cheio e você quiser mudar para um novo, você precisa reiniciar todos os programas que possuem arquivos abertos. Como isso significa reiniciar as sessões de X e de tela, não é muito melhor do que reinicializar.
Você deve poder mudar para novos programas, mas manter os arquivos abertos existentes usando uma montagem de união (O princípio é bom, mas eu nunca tentei, então pode haver problemas inesperados.) Aqui está uma maneira de fazer isso no Linux.
- Mantenha todos os arquivos existentes em
/tmp
, exceto para alguns grandes selecionados manualmente. - Crie um
/tmp.new
(modo 1777). - Expor
/tmp
em um caminho diferente:mount --bind / /.root.only
. Isso é necessário porque a próxima etapa irá sombrear/tmp
. Pode haver diferentes implementações de montagens de união que não exigem essa etapa. - Faça uma montagem de união de
/.root.only/tmp
e/tmp.new
, montada em/tmp
. Dessa forma, os novos arquivos criados em/tmp
serão gravados em/tmp.new
, mas os arquivos em/.root.only/tmp
também estarão visíveis em/tmp
. Uma possibilidade é unionfs-fuse :unionfs-fuse /tmp.new:/.root.only/tmp /tmp
.
Se você não quiser ir para a raiz da montagem de união (por exemplo, porque não está disponível em sua plataforma ou porque é um problema demais), pelo menos não exclua o diretório antigo. Mova-a para que os programas em execução continuem usando o diretório antigo e os novos programas usem o novo. (É claro que novos programas não poderão se comunicar com programas antigos por meio de sockets ou pipe em /tmp
, a menos que você defina TMPDIR
ou indique onde procurar.)
mv /tmp /tmp.old && mkdir /tmp