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

15

Hoje, o diretório /tmp é preenchido em uma máquina no trabalho. 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 criou um link simbólico /tmp -> /new/tmp .

Quando ele copiou os arquivos (na verdade, isso foi outra pessoa, não eu!) ele não usou -a , então 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 , então foi o padrão 0755. Isso não causou nenhum problema, e mesmo o modo tweaking e os bits de propriedade falharam em restaurar a máquina para um estado operacional aceitável. Acabei tendo que eliminar tudo em /tmp e reinicializar.

O diretório /tmp continha vários sockets, pipes e outras coisas, já que um monte de gente roda o Gnome através do VNC, e eu uso o screen que tem seus próprios pipes.

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

    
por Greg Hewgill 07.01.2011 / 03:58

1 resposta

19

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.

  1. Mantenha todos os arquivos existentes em /tmp , exceto para 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 a próxima etapa irá sombrear /tmp . Pode haver diferentes implementações de montagens de união que não exigem essa etapa.
  4. 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
    
por 07.01.2011 / 09:33