Quais são as funções para manipular arquivos esparsos no Linux?

2

Quais são as funções para manipular arquivos esparsos no Linux? (digamos em C, notas sobre outros sistemas altamente bem-vindos) por exemplo:

  • faça um buraco dentro do arquivo removendo parte do seu interior
  • estrutura de pesquisa, por exemplo gerar seqüência de pares denotando começos e fins de blocos contínuos separados de dados
  • dividir o arquivo em dois em algum momento, reatribuindo o intervalo de blocos (isto é, sem mover os dados reais)
  • investigar inodes e outros aspectos relevantes? (talvez possível atribuir alguns blocos a vários arquivos na maneira de copiar-escrever?)

Contexto:

A pergunta original que me veio à mente e à qual cheguei foi depois de man rsync de --sparse option:

Por que a opção rsync de --sparse está em conflito com --inplace ?

A limitação da chamada de sistema de arquivos api?

Do ponto de vista da estrutura de dados, se o arquivo esparso de origem for visto como uma sequência de blocos não contínuos de dados, do que seria de esperar da sincronização "r" para desalocar no destino os intervalos que não existem na origem, aloque os ausentes os outros, atualize a atualização de acordo (mesmo com o algoritmo hash padrão de rsync, tratando todas as seqüências restantes como uma, ou executando separadamente em cada uma).

Referência:

man rsync
   -S, --sparse
          Try to handle sparse files efficiently so they take up less space on the destination.  Conflicts with --inplace because it's

not possible to over- write data in a sparse fashion.

    
por Grzegorz Wierzowiecki 21.05.2017 / 14:57

1 resposta

10

Os arquivos esparsos são projetados para serem transparentes para o espaço do usuário: os furos são criados buscando áreas não utilizadas passadas e são lidos como blocos de zeros. Eles não podem ser detectados usando APIs de espaço de usuário padrão, pelo menos não ainda - como apontado por Stéphane Chazelas Pelo menos, o Solaris e o Linux suportam o SEEK_DATA e o SEEK_HOLE lseek(2) sinalizadores que permitem que os programas userspace encontrem buracos, e esses sinalizadores podem ser adicionados ao POSIX em algum momento.

Isso explica a incompatibilidade entre as opções rsync ' --sparse e --inplace : ao gravar em um arquivo existente portável , não é possível criar furos nos dados existentes. --sparse funciona reescrevendo todo o arquivo, pulando sequências de zeros (longas), o que resulta em arquivos esparsos em SOs e sistemas de arquivos que os suportam.

No Linux, você pode recuperar detalhes da dispersão dos arquivos usando o fiemap ioctl e e2fsprogs ' filefrag(8) ; consulte Informações detalhadas sobre arquivos esparsos no Linux . Do lado da escrita, você pode usar fallocate(2) (e o prático fallocate(1) utilitário) para fazer furos em um arquivo existente, tornando-o esparso se os furos cobrem todo blocos. O suporte depende do sistema de arquivos - apenas o XFS, o btrfs, o ext4 e o tmpfs atualmente suportam essas operações. Kernels recentes (desde 4.1) e muito versões recentes de util-linux suportam a inserção de falhas em arquivos, deslocando o conteúdo após o furo ( fallocate -i , introduzido em util-linux 2.30 que deve ser lançado em breve) .

Suas duas últimas perguntas são de cirurgia de sistema de arquivos, e não tenho certeza se há alguma chamada de sistema genérica ou ioctl disponível para realizar essas operações. Os sistemas de arquivos reflink -compatible permitem que os arquivos compartilhem seus conteúdos; Isso pode ser feito usando FICLONE e FICLONERANGE ioctls .

    
por 21.05.2017 / 15:42