Jak wyświetlić „rzadkość” pliku?

15

Jak wyprowadzić, ile rozmiaru nominalnego pliku jest faktycznie wypełnione danymi? Podobnie vmtouchjak pokazuje, ile plików jest aktualnie w pamięci ...

Oczekuję, że przepływ pracy będzie taki:

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

Obejście: Redakcyjne du -bshi du -shi je porównać.

Vi.
źródło
1
powiązane: filefragdla dowolnego systemu plików i xfs_bmap -vpldla XFS są kluczowymi narzędziami do pokazania, gdzie są dane (i gdzie są wstępnie przydzielone niepisane zakresy) podczas zabawy z rzadkimi plikami i dziurawieniem.
Peter Cordes,
filefrag data-> wiele FIBMAP: Invalid argument-> data: 1 extent found...
Vi.
na jakim systemie plików? filefrag -edziała doskonale na przynajmniej XFS i ext4. Nie testowałem na innych. Wykorzystuje FIEMAP (mapa zasięgu), zastępując FIBMAP. Jeśli te ioctlnie działają, to nie będzie przydatne.
Peter Cordes,
Na tmpfs. Mój filefragnie ma -eopcji.
Vi.
Ile lat ma e2fsprogs? Jestem prawie pewien, że nie jest to ostatnia funkcja. Istnieje również -vopcja, która drukuje te same pełne informacje (plus dodatkowe linie nagłówka). Może będziesz filefragto miał. xfs_bmapJednak w przeciwieństwie do tego, nie wskazuje wyraźnie otworów z oddzielnymi liniami, po prostu ma nieciągłości w pozycji pliku. W każdym razie nie jestem zaskoczony, że tmpfsnie obsługuje FIEMAP, ponieważ nie ma urządzenia blokowego jako sklepu z zapleczem, więc nie ma sensownej wartości dla lokalizacji zakresów.
Peter Cordes,

Odpowiedzi:

19

findma %Sspecyfikator formatu, który jest nawet nazywany „rzadkością”

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904
Vi.
źródło
Ciekawy. Większość zwykłych plików w systemie będzie miała mniej niż 1,0, katalogi, łącza miękkie i gniazda zawsze będą miały dokładnie 1,0.
grochmal
Czy niektóre systemy nie zapisały (krótkiego) dowiązania symbolicznego bezpośrednio w i-węźle, bez użycia bloków danych? Zastanawiam się, jak rzadka powinna być. Poza tym, czy ta definicja nie jest niewłaściwa, z pewnością zwykły (tzn. Nierzadki) plik powinien mieć zerową rzadkość? :)
ilkkachu
@grochmal, na ext4 (Linux) ln -s foo link:, „rzadkość” link: 0. Gniazda i FIFO mają długość zero, więc findpokazuje rzadkość 1.
ilkkachu
1

Jeśli findnie masz tej opcji, metodą działającą w systemie UNIX od lat 70-tych jest:

ls -ls file

Które wydrukuje rzeczywistą liczbę użytych bloków i najwyższy bajt, jaki kiedykolwiek napisano. Na tej podstawie możesz łatwo obliczyć, ile bloków faktycznie nie zostało przydzielonych.

MAPA
źródło
0

Chociaż find„s %Swypisze wyjście krótkie, więcej szczegółów można zajrzeć do sparsetestktórych pisałem - Open Source, a na github tutaj . Zmodyfikuj go, jeśli chcesz wydrukować (np.) Każdą dziurę.

Artykuł na blogu pokazujący problemy z rzadkimi przydziałami tutaj przy użyciu sparsetestdo debugowania problemu.

w płomieniach
źródło
Czy może wydrukować „mapę” zakresu w pliku, na przykład vmtouch -vdrukuje mapę buforowanych obszarów w pliku?
Vi.
@Vi. Napisałem go dawno temu i zapomniałem o kilku szczegółach - w rzeczywistości tworzy rzadki plik, zapisuje do niego dane, a następnie drukuje statystyki. Po prostu chcesz bit tworzenia statystyk. Aby wydrukować dziury, będziesz potrzebować za lseekpomocą SEEK_HOLEi SEEK_DATA. Proste do zrobienia.
abligh