Onde as alças de arquivos abertos vão quando elas morrem?

15

O que acontece com os arquivos que são excluídos enquanto eles têm um identificador de arquivo aberto?

Eu tenho pensado nisso desde que eu descobri que eu poderia deletar um arquivo de vídeo enquanto ele tocava no MPlayer e ele ainda tocaria até o fim. De onde vem os dados? Ainda vem do disco rígido? Será copiado para a RAM depois que eu deletei o arquivo?

Se ainda estiver no disco rígido, o que acontece se eu encher o sistema de arquivos enquanto o programa estiver sendo executado lendo o que é essencialmente espaço não alocado? Se estiver em buffer na RAM, o que acontece se eu descarregar os buffers?

O que acontece se o arquivo estiver em um compartilhamento NFS - ele está armazenado no servidor? (Isso não é um risco de segurança - DoS por toneladas de identificadores de arquivos remotos abertos?)

Fazer um lsof -n |grep '(deleted)' às vezes produz resultados interessantes; se eu estou atualizando pacotes que trocam arquivos de biblioteca compartilhada, então executar programas que estavam usando essas bibliotecas ainda será capaz de usá-los como se nada tivesse mudado.

Pergunta bônus: existe alguma maneira de recuperar os dados dos mortos nesta situação?

    
por amphetamachine 18.12.2011 / 05:17

3 respostas

12

Os inodes ainda persistem no disco, embora não existam mais hard links para os inodes. Eles serão excluídos quando o descritor de arquivo estiver fechado. Até lá, o arquivo pode ser modificado normalmente, exceto operações que exigem um nome de arquivo / link físico.

debugfs e ferramentas semelhantes podem ser usadas para recuperar o conteúdo dos inodes.

    
por 18.12.2011 / 05:25
5

O kernel faz referência à contagem de referências ao inode. Veja minha resposta para O que acontece quando eu fecho () um descritor de arquivo ? .

A exclusão de arquivos abertos provavelmente não é mais um mecanismo DOS do que apenas abrir arquivos. O ulimit em arquivos abertos fornece alguma proteção contra essa tentativa do DOS. Aplica-se a todos os arquivos abertos, excluídos ou não.

    
por 18.12.2011 / 06:33
5

Um arquivo só é apagado no sistema de arquivos uma vez que todas as referências a ele desaparecem. Ambos os nomes e identificadores abertos contam como referências. Enquanto o arquivo estiver aberto em um programa, ele não será excluído, embora a maioria dos sistemas não permita que você recrie um nome para ele.

Os dados ainda estão na unidade, mas o arquivo está marcado como tendo uma contagem de links de 0. Se o sistema travar, o fsck na próxima reinicialização saberá que deve excluir os dados. Isso não leva a uma negação de serviço mais do que um arquivo não excluído.

Você não pode recriar um link para o arquivo em um sistema Linux padrão, até onde eu saiba (curto de ignorar o driver do sistema de arquivos com debugfs ou métodos similares), mas você pode recuperar o conteúdo facilmente: cat /proc/12345/fd/42 onde 12345 é o ID do processo que tem o arquivo aberto e 42 é o número do descritor de arquivo.

Por meio do NFS, quando você exclui um arquivo que ainda está aberto em algum cliente, o servidor NFS renomeia o arquivo no servidor, mas não o exclui até que todos os clientes tenham liberado o arquivo. Na minha experiência, o novo nome é .nfs… , embora eu não saiba se o nome é o mesmo em todas as implementações do NFS.

    
por 19.12.2011 / 00:24