Podemos alocar furos de arquivo para outro arquivo?

0

Com referência à Programação Avançada no Ambiente Unix, os furos de arquivos são criados quando tentamos buscar o final do arquivo e escrever algo. Por exemplo,

    int x = lseek(fd,1639,SEEK_END);
    int y = write(fd,buff,100);

Se você considerar o exemplo acima e supor que o arquivo tinha anteriormente algum conteúdo, para que o deslocamento do arquivo atual esteja em algum lugar à frente do início do arquivo. Agora, procuramos o final do arquivo usando a função lseek (como no exemplo acima) e escrevemos um buffer buff de tamanho 100 para o arquivo. Como você sabe, um buraco será criado no arquivo.

Então, o Unix pode alocar este buraco para algum outro arquivo? Ou, em outras palavras, esse buraco está disponível para alocação?

    
por Shanif Ansari 25.08.2017 / 18:21

1 resposta

3

Primeiro de tudo, o que é um buraco em um arquivo? É apenas o conjunto de dados para zero sem ser explicitamente escrito como tal. Quando você seek 1639 bytes após o final do arquivo e grava 100 bytes nele, seu arquivo aumentou 1639 + 100 bytes. Então, você criou um buraco, mas esse buraco está preenchido com zeros.

Se esse buraco for grande o suficiente, certos sistemas de arquivos (como ext ) permitem que você poupe esse espaço não alocando os blocos correspondentes no disco. Ou seja Se o seu seek for escrever um ou mais blocos de zeros, os blocos não serão alocados no disco e isso criará buracos reais na lista de blocos que contêm os dados do arquivo. Isso é o que chamamos de arquivo esparso .

O tamanho de um bloco depende da maneira como seu FS é formatado. Hoje em dia com ext é geralmente 4096 bytes. Isso significa que, com sua busca de 1639 bytes, você não está criando um arquivo esparso e 1639 zeros serão gravados no disco. OTOH, com blocos de 4096 bytes, se você procura pelo menos 8191 (2 * 4096 - 1) bytes, pode ter a certeza de criar pelo menos um.

Como os blocos não são realmente alocados e preenchidos com zeros, isso faz com que seu arquivo use menos espaço em disco e sua operação de gravação seja muito mais rápida. Obviamente, para responder à sua pergunta, o espaço em disco poupado está disponível para outros arquivos.

Na verdade, a melhor demonstração não requer um programa em C:

$ df -h /tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda4        38G   28G  7.5G  80% /

$ time dd of=/tmp/foo bs=1M seek=$((1024*1024*10)) count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 4.741e-05 s, 0.0 kB/s

real    0m0.002s
user    0m0.000s
sys 0m0.000s

$ ls -lh /tmp/foo
-rw-r--r-- 1 xhienne xhienne 10T Aug 25 20:08 /tmp/foo

$ df -h /tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda4        38G   28G  7.5G  80% /

Aqui eu criei um arquivo de 10 TB (cheio de zeros) em alguns milissegundos em uma partição que tem apenas 7 GB ou mais de espaço livre (que ainda está disponível).

    
por 25.08.2017 / 20:17