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 .