Szczegółowe informacje o plikach rzadkich w systemie Linux

11

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.

Juliano
źródło

Odpowiedzi:

7

Jest podobne pytanie na SO . Obecnie akceptowane odpowiedź przez @ephemient sugeruje stosując ioctlnazywany fiemapktóry jest udokumentowany linux/Documentation/filesystems/fiemap.txt. Cytowanie z tego pliku:

Ioctl fiemap to wydajna metoda dla przestrzeni użytkownika do uzyskiwania mapowań zasięgu pliku. Zamiast mapowania blok po bloku (np. Bmap), fiemap zwraca listę zakresów.

Wygląda na to, że tego rodzaju informacji szukasz. Obsługa systemów plików jest ponownie opcjonalna:

Systemy plików, które chcą obsługiwać fiemap, muszą zaimplementować funkcję ->fiemap zwrotną w swojej inode_operationsstrukturze.

Wsparcie dla SEEK_DATAi SEEK_HOLEargumenty lseekty wymienione z Solaris został dodany w Linuksie 3.1 według strony człowieka , więc można używać, jak również. Te fiemap ioctlwydają się być starszy, więc to może być bardziej przenośne w różnych wersjach Linux na razie, natomiast lseekmoże być bardziej przenośne w różnych systemach operacyjnych Solaris, jeśli ma to samo.

MvG
źródło
2
Można uzyskać te informacje FIEMAP przy użyciu --fibmaptego hdparmnarzędzia. Zobacz instrukcję.
Totor
2

Istnieje kolekcja programów python zwanych sparseutils, które używają SEEK_HOLEi SEEK_DATAdo określania, które sekcje pliku są reprezentowane jako dziury, a które są danymi. Użycie jest dość proste. mksparsemożna go użyć do wygenerowania rzadkiego pliku zgodnie z określonym układem.

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

sparsemapProgram może być używany do drukowania układu do stdout:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096
Richard
źródło
1

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.

BillThor
źródło
1
Musi istnieć jakiś sposób agnostyczny FS, aby uzyskać te informacje. Czytanie bezpośrednio z i-węzła zdecydowanie nie wchodzi w grę. Szukałem czegoś podobnego SEEK_DATAi SEEK_HOLEparametrów lseek(), takich jak w Solarisie: opensolarisforum.org/man/man2/lseek.html
Juliano
@Juliano Spojrzenie na opcję Linux Lseek nie ma tych opcji. Solaris obsługuje bardzo niewiele systemów plików, więc jego obsługa byłaby stosunkowo łatwa. Linux obsługuje wiele różnych systemów plików, z których niektóre nie obsługują plików rzadkich. Wsparcie dla SEEK_DATA / SEEK_HOLE narzuciłoby wsparcie w kodzie dla wszystkich systemów plików. Te metody mogą nie działać zgodnie z oczekiwaniami. Zobacz blogs.sun.com/bonwick/entry/seek_hole_and_seek_data, aby uzyskać więcej danych ze strony Słońca.
BillThor,
1
Systemy plików nie muszą niczego obsługiwać za pomocą interfejsu lseek (), jądro wita moduły systemu plików, które obsługują SEEK_DATA / SEEK_HOLE poprzez właściwość modułu. Jest to na samej stronie podręcznika i na blogu: „W przypadku systemów plików, które nie dostarczają informacji o dziurach, plik będzie reprezentowany jako jeden cały region danych”.
Juliano
@Juliano nadal wymaga modyfikacji jądra, a także zmian w lseek. Zgodnie z wpisem na blogu jest to dość nowa funkcjonalność w Sun. Aby działał, kod systemu plików również musi zostać zmodyfikowany. Z pewnością wymagałoby to zmian we wszystkich systemach plików obsługujących pliki rzadkie, aby zapewnić przechwytywanie jądra.
BillThor