it-swarm-pt.tech

Como (com segurança) mover / tmp para um volume diferente?

Hoje, o diretório /tmp Foi preenchido em uma máquina em funcionamento. O problema era que estava na partição raiz que não era muito grande. Para corrigir isso, um colega de trabalho criou um diretório /new/tmp Em outro lugar, copiou todo o conteúdo para o novo diretório, removeu o original /tmp E fez um link simbólico /tmp -> /new/tmp.

Quando ele copiou os arquivos (na verdade, isso era outra pessoa, não eu!), Ele não usou -a; Portanto, o proprietário de cada arquivo em /new/tmp Era root. Além disso, ele não definiu as permissões do diretório /new/tmp, Por isso era o padrão 0755. Isso não causava problemas e nem mesmo o modo de ajustes e os bits de propriedade falhavam em restaurar a máquina a um estado aceitável de funcionamento. Acabei tendo que colocar tudo em /tmp E reiniciar.

O diretório /tmp Continha vários soquetes e canos e outros enfeites, já que muitas pessoas executam o Gnome no VNC, e eu uso o screen que possui seus próprios canos.

Existe uma maneira segura de mover um diretório /tmp Para um volume diferente em um sistema em execução? Não sei ao certo o que eu teria feito para manter tudo funcionando. Estou particularmente curioso sobre o que acontece com tubos e tomadas.

17
Greg Hewgill

Em máquinas "clientes", a maneira segura de mover /tmp é reiniciar. Aqui, por cliente, quero dizer qualquer coisa que execute programas que coloquem soquetes em /tmp, em particular servidores X e tela.

O novo /tmp definitivamente precisa ter as permissões corretas (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 ocorre porque na maioria das vezes, programas que colocam coisas em /tmp abra os arquivos. Se você copiar o arquivo, ele copiará o conteúdo, mas os programas ainda terão os arquivos antigos abertos. Você pode alcançá-los com um depurador (ptrace), mas isso será muito mais complicado do que reiniciar, e com muitos programas, tudo o que você faria é travá-los de qualquer maneira.

Se seu /tmp está cheio e você deseja mudar para um novo ao vivo, é necessário reiniciar todos os programas que possuem arquivos abertos lá. Como isso significa reiniciar as sessões do X e da tela, não é muito melhor do que reiniciar.

Você deve poder mudar para novos programas, mas manter os arquivos abertos existentes no lugar usando um união de montagem . (O princípio é sensato, mas nunca tentei, portanto pode haver problemas inesperados.) Aqui está uma maneira de fazer isso no Linux.

  1. Mantenha todos os arquivos existentes em /tmp exceto alguns grandes selecionados manualmente.
  2. Crie um /tmp.new (modo 1777).
  3. Expor /tmp em um caminho diferente: mount --bind / /.root.only. Isso é necessário porque o próximo passo será sombreado /tmp. Pode haver implementações de montagem de união diferentes que não exigem esta etapa.
  4. Faça um monte de união de /.root.only/tmp e /tmp.new, montado em /tmp. Dessa forma, novos arquivos criados em /tmp será escrito em /tmp.new, mas arquivos em /.root.only/tmp também são visíveis em /tmp. Uma possibilidade é nionfs-Fuse : unionfs-Fuse /tmp.new:/.root.only/tmp /tmp.

Se você não deseja acessar a raiz da união de união (por exemplo, porque não está disponível na sua plataforma ou porque há muitos problemas), pelo menos não exclua o diretório antigo. Mova 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 soquetes ou tubos em /tmp a menos que você defina TMPDIR ou diga a eles onde procurar.)

mv /tmp /tmp.old && mkdir /tmp
20