removeu um arquivo vagrant e agora eu vejo .nfs0000000000b869e300000001?

12

Eu adicionei um arquivo e agora vejo:

$ l
total 64
-rw-rw-r-- 1 502 17229 Sep 17 16:42 page_object_methods.rb
drwxrwxr-x 7 502   238 Sep 18 18:41 ../
-rw-rw-r-- 1 502 18437 Sep 18 18:41 new_page_object_methods.rb
-rw-r--r-- 1 502 16384 Sep 18 18:42 .nfs0000000000b869e300000001
drwxrwxr-x 5 502   170 Sep 21 13:48 ./
13:48:11 *vagrant* ubuntu-14 selenium_rspec_conversion

e se eu tentar removê-lo ...

$ rm .nfs0000000000b869e300000001
rm: cannot remove ‘.nfs0000000000b869e300000001’: Device or resource busy

O que isso indica? O que devo fazer

    
por Michael Durrant 21.09.2015 / 15:51

3 respostas

10

Um arquivo pode ser excluído enquanto está aberto por um processo. Quando isso acontece, a entrada de diretório é excluída, mas o arquivo em si (o inode e o conteúdo) permanece para trás; o arquivo só é realmente excluído quando não tem mais links e não é aberto por nenhum processo.

O NFS é um protocolo sem estado: as operações podem ser realizadas independentemente das operações anteriores. É possível até que o servidor seja reinicializado e, assim que ele voltar a ficar on-line, os clientes continuarão acessando os arquivos como antes. Para que isso funcione, os arquivos precisam ser designados por seus nomes, não por um manipulado obtido pela abertura do arquivo (que o servidor esqueceria quando for reinicializado).

Coloque os dois juntos: o que acontece quando um arquivo é aberto por um cliente e excluído? O arquivo precisa continuar tendo nome, para que o cliente que o tenha aberto ainda possa acessá-lo. Mas quando um arquivo é deletado, espera-se que mais nenhum arquivo com esse nome apareça depois. Assim, os servidores do NFS transformam a exclusão de um arquivo aberto em uma renomeação: o arquivo é renomeado para .nfs… ( .nfs seguido por uma sequência de letras e dígitos).

Você não pode excluir esses arquivos (se tentar, tudo o que acontece é que um novo .nfs… aparece com um sufixo diferente). Eles acabarão por desaparecer quando o cliente que tiver o arquivo aberto o fechar. (Se o cliente desaparecer antes de fechar o arquivo, pode demorar um pouco até que o servidor perceba).

    
por 22.09.2015 / 03:07
0

Algum outro processo provavelmente ainda está usando o arquivo (ou seja, possui um identificador de arquivo aberto). Ignore o arquivo ou use lsof ou algo parecido para tentar descobrir qual processo tem esse arquivo aberto (ou reinicie tudo!).

    
por 21.09.2015 / 16:34
0

Como o NFS é "sem estado", é preciso haver uma maneira de emular o método UNIX de abrir um arquivo e, em seguida, removê-lo mantendo um filehandle aberto.

Qualquer operação de arquivo NFS causa a cadeia:

open(); seek-last-off(); doit(); close();

para ser executado e esta é a razão pela qual o NFS sobrevive a uma reinicialização do servidor.

Uma vez que o processo no cliente que o arquivo aberto antigo encerra, o arquivo desaparecerá.

Servidores de arquivos corretamente implementados executarão um script a cada noite, removendo todos os arquivos com mais de uma semana. A razão é que, caso o cliente reinicialize enquanto mantém esse arquivo, o arquivo permanecerá para sempre.

    
por 21.09.2015 / 17:01