O que acontece com os arquivos que são excluídos enquanto eles têm um identificador de arquivo aberto para eles?
Eu me pergunto isso desde que descobri que poderia excluir um arquivo de vídeo enquanto ele estava sendo reproduzido no MPlayer e ele ainda seria reproduzido até o fim. De onde ele está puxando os dados? Ainda está vindo do disco rígido? Ele foi copiado para a RAM depois que eu excluí o arquivo?
Se ainda estiver no disco rígido, o que acontecerá se eu encher o sistema de arquivos enquanto o programa estiver executando a leitura do espaço essencialmente não alocado? Se estiver armazenado em buffer na RAM, o que acontece se eu liberar os buffers?
O que acontece se o arquivo estava em um compartilhamento NFS - ele está armazenado no servidor? (Isso não é um risco à segurança - DoS por toneladas de identificadores abertos de arquivos remotos?)
Fazer um, lsof -n |grep '(deleted)'
às vezes, produz resultados interessantes; se estou atualizando pacotes que trocam arquivos de biblioteca compartilhada, a execução de programas que estavam usando essas bibliotecas ainda poderá usá-los como se nada tivesse mudado.
Pergunta bônus: Existe alguma maneira de recuperar os dados dos mortos nessa situação?
fonte
/proc
é específico do Linux (como estádebugfs
)./proc
. Os links físicos funcionam apenas no mesmo sistema de arquivos, não entre sistemas de arquivos e, como/proc
é um sistema de arquivos não gravável separado, você não pode criar links físicos nele. Você pode copiar o arquivo/proc
embora.O kernel faz referência, contando com 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 é um mecanismo DOS mais eficaz do que apenas a abertura de arquivos. Os
ulimit
arquivos abertos fornecem alguma proteção contra essa tentativa do DOS. Aplica-se a todos os arquivos abertos, excluídos ou não.fonte
Um arquivo é apagado apenas no sistema de arquivos uma vez que todas as referências a ele desaparecem. Os nomes e os 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, tanto quanto eu sei (além de ignorar o driver do sistema de arquivos com
debugfs
métodos semelhantes), mas pode recuperar o conteúdo facilmente:cat /proc/12345/fd/42
onde 12345 é o ID do processo que possui o arquivo aberto e 42 é o número do descritor de arquivo.No 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.fonte