
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 rsync
da --sparse
opção:
Por que rsync
a --sparse
opçã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_DATA
eSEEK_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
' --sparse
e --inplace
: ao escrever em um arquivo existenteportável, lacunas não podem ser criadas em dados existentes. --sparse
funciona 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 ofiemap
ioctl, 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-linux
suporte à inserção de furos 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 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 FICLONE
e FICLONERANGE
ioctls.