Mam rzadki plik, w którym przydzielone są tylko niektóre bloki:
~% du -h --apparent-size example
100K example
~% du -h example
52K example
Chciałbym wiedzieć, które bloki pliku są faktycznie przydzielone. Czy istnieje interfejs wywołania systemowego lub jądra, którego można użyć do uzyskania listy przydziałów lub dziur w pliku?
Samo sprawdzenie wystarczająco długiego ciągu zer (podejście używane przez GNU cp, rsync itp.) Nie działa poprawnie:
~% cp example example1
~% du -h example1
32K example1
Wykrył inne sekwencje zer, które faktycznie zostały przydzielone.
źródło
--fibmap
tegohdparm
narzędzia. Zobacz instrukcję.Istnieje kolekcja programów python zwanych sparseutils, które używają
SEEK_HOLE
iSEEK_DATA
do określania, które sekcje pliku są reprezentowane jako dziury, a które są danymi. Użycie jest dość proste.mksparse
można go użyć do wygenerowania rzadkiego pliku zgodnie z określonym układem.sparsemap
Program może być używany do drukowania układu do stdout:źródło
To zależy od systemu plików. Nie wierzę, że jest to wezwanie, a może dlatego wiele narzędzi nie radzi sobie dobrze z kopiowaniem rzadkich plików. Łańcuch narzędzi GNU używa wyszukiwania dużych bloków zer, ponieważ pozwala im to usunąć nieużywane przydzielone bloki. Wiele narzędzi do kopiowania przekształci rzadki plik w plik z przydzielonymi wszystkimi blokami.
Prawdopodobnie będziesz musiał otworzyć i-węzeł i przeanalizować wynik. Format i-węzła zależy od systemu plików. Niektóre systemy plików mogą mieć część danych w samym i-węźle.
źródło
SEEK_DATA
iSEEK_HOLE
parametrówlseek()
, takich jak w Solarisie: opensolarisforum.org/man/man2/lseek.html