Quando um arquivo é liberado em um sistema de arquivos ext?

1

Introdução

Até recentemente, eu pensava que no sistema de arquivos ext, inodes têm contadores de referência que contam o número de vezes que o arquivo é referenciado por uma entrada de diretório ou um descritor de arquivo.

Depois, aprendi que o contador de referência conta apenas o número de entradas de diretório que fazem referência a ele. Para falsificar isso, eu li a contagem de referência de um arquivo de vídeo usando ls -l . Foi 1 como eu esperava porque não criei nenhum link adicional para ele. Em seguida, abri o arquivo de vídeo com um player de vídeo e executei o mesmo comando novamente. Para minha surpresa, a contagem de referência ainda era 1. Portanto, falhei em falsificar.

No entanto, posso continuar assistindo ao vídeo depois de remover sua única entrada de diretório. Ao abrir um arquivo de vídeo grande e excluir sua entrada de diretório, a quantidade de espaço de armazenamento livre no sistema de arquivos não é alterada. Ele só muda (pelo tamanho do arquivo de vídeo) quando o player chega ao final do vídeo e fecha o descritor de arquivo ou o player se encerra (dependendo do player de vídeo usado).

Pergunta

Quais são as condições exatas para um arquivo ser liberado em um sistema de arquivos ext? Estou interessado em como é tratado em ext2, ext3 e ext4. Existem diferenças dependendo do kernel usado ou de outras partes do sistema operacional?

    
por UTF-8 07.02.2017 / 20:48

2 respostas

4

Você está confundindo dois contadores diferentes: o contador de links do sistema de arquivos e o contador de referência do descritor de arquivos.

  1. O contador de links do sistema de arquivos conta quantos links para um inode estão no próprio sistema de arquivos. O inode é a estrutura que contém os metadados do arquivo. Nos sistemas de arquivos ext *, esse contador é armazenado no próprio sistema de arquivos.

    Você pode verificar quantos links tem um inode usando ls -l . Além disso, você pode usar ls -i para obter o número de inode de um arquivo. Por exemplo. tente multiplicar os links para um arquivo usando ln e verifique se todos os links têm o mesmo número de inode.

    andcoz@tseenfoo:~/refcount> ls -li
    total 40
    2248813 -rw-r--r-- 1 andcoz users 40960  7 feb 21.34 test
    andcoz@tseenfoo:~/refcount> ln test test2
    andcoz@tseenfoo:~/refcount> ln test test3
    andcoz@tseenfoo:~/refcount> ls -li
    total 120
    2248813 -rw-r--r-- 3 andcoz users 40960  7 feb 21.34 test
    2248813 -rw-r--r-- 3 andcoz users 40960  7 feb 21.34 test2
    2248813 -rw-r--r-- 3 andcoz users 40960  7 feb 21.34 test3
    
  2. O contador de referência do descritor de arquivo conta quantas vezes um arquivo é aberto por um processo ou, mais formalmente, quantos descritores de arquivo fazem referência a esse inode. Esta informação é armazenada na memória do kernel.

    Você pode obter uma aproximação desse valor usando o comando fuser . Este comando lista todos os processos que possuem um arquivo aberto. Observe que um único processo pode abrir o mesmo arquivo várias vezes, portanto, o tamanho da lista de fusores é menor ou, geralmente, igual ao contador de referência.

    andcoz@tseenfoo:~/refcount> tail -f test &
    [3] 4226
    andcoz@tseenfoo:~/refcount> fuser test
    /home/andcoz/refcount/test:  4226
    andcoz@tseenfoo:~/refcount> tail -f test2 &
    [4] 4354
    andcoz@tseenfoo:~/refcount> fuser test
    /home/andcoz/refcount/test:  4226  4354
    

Um arquivo é removido do sistema de arquivos quando ambos os contadores são zero.

    
por 07.02.2017 / 21:55
1

O arquivo é liberado quando a contagem de links passa para zero, ou seja, a última entrada de diretório é removida E o último processo com um descritor de arquivo aberto no arquivo o fecha de maneira explícita ou implícita ao sair. Esta é a semântica padrão do Unix e se aplica a todos os sistemas de arquivos Linux, incluindo Ext, Ext 2, Ext 3 e Ext 4.

    
por 07.02.2017 / 21:19