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

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

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

  • faça um furo dentro da lima removendo parte de seu interior
  • investigar a estrutura, por exemplo, gerar uma sequência de pares denotando o início e o fim de blocos contínuos de dados separados
  • dividir o arquivo em dois em algum momento, reatribuindo o intervalo de blocos (ou seja, sem mover os dados reais)
  • investigar inodes e outros aspectos relevantes? (talvez seja possível atribuir alguns blocos a vários arquivos no modo copy-on-write?)

Contexto:

Pergunta original que me veio à cabeça e cheguei depois man rsyncda --sparseopção:

Por que rsynca --sparseopção está em conflito com --inplace?

É uma limitação da API de chamadas do sistema de arquivos?

Do ponto de vista da estrutura de dados, se o arquivo esparso de origem for visto como uma sequência de blocos de dados não contínuos, eu esperaria que a sincronização "r" desalocasse no destino os intervalos que não existem na origem, alocasse os ausentes, descanse atualize adequadamente (mesmo com o algoritmo de hash rolante rsync padrão, tratando todas as sequê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

não é possível sobrescrever dados de forma esparsa.

Responder1

Arquivos esparsos são projetados para serem transparentes para o espaço do usuário: buracos são criados buscando áreas não utilizadas 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 ainda não - comoapontouporStéphane Chazelas, pelo menos Solaris e Linux suportam o SEEK_DATAeSEEK_HOLE lseek(2)sinalizadores que permitem que os programas do espaço do usuário encontrem falhas, e esses sinalizadores podem seradicionado ao POSIXem algum ponto.

Isto explica a incompatibilidade entre as opções rsync' --sparsee --inplace: ao escrever em um arquivo existenteportável, lacunas não podem ser criadas em dados existentes. --sparsefunciona reescrevendo o arquivo inteiro, pulando sequências (longas) de zeros, o que resulta em arquivos esparsos em sistemas operacionais e sistemas de arquivos que os suportam.

No Linux, você pode recuperar detalhes da dispersão dos arquivos usando ofiemapioctl, e e2fsprogs'filefrag(8); verInformações detalhadas sobre arquivos esparsos no Linux. No lado da escrita, você pode usarfallocate(2)(e o práticofallocate(1)utilitário) para fazer furos em um arquivo existente, tornando-o esparso se os furos cobrirem blocos inteiros. O suporte depende do sistema de arquivos — apenas XFS, btrfs, ext4 e tmpfs atualmente suportam essas operações. Kernels recentes (desde 4.1) emuitoversões recentes do util-linuxsuporte à inserção de furos em arquivos, deslocando o conteúdo após o furo ( fallocate -i, introduzido em util-linux2.30 que deve ser lançado em breve).

Suas duas últimas perguntas são sobre cirurgia do sistema de arquivos e não tenho certeza se existe alguma chamada de sistema genérica ou ioctl disponível para realizar tais operações. reflink-sistemas de arquivos compatíveis permitem que os arquivos compartilhem seu conteúdo; isso pode ser conseguido usandoo FICLONEe FICLONERANGEioctls.

informação relacionada