Jak wyświetlić listę bloków danych pliku w systemie Linux?

13

Jak rozumiem, każdy plik w systemie operacyjnym uniksowym ma numer i-węzła (który można wyświetlić za pomocą „ls -i”), a każdy i-węzeł jest listą bloków dyskowych zawierających rzeczywiste dane pliku.

Czy istnieje polecenie systemu Linux, które bierze nazwę pliku za argument i wypisuje listę bloków dysku, na które wskazuje i-węzeł tego pliku?

PS Wspomniany system plików to ext3.

mikrofon
źródło

Odpowiedzi:

17

Możesz użyć narzędzia „debugfs”, aby wyświetlić informacje o pliku w wierszu polecenia lub interaktywnie. albo użyć:

# debugfs /dev/<spartition>
# stat /path/to/file

lub

# debugfs -R "stat /path/to/file" /dev/<partition>

na przykład:

# debugfs -R "stat /etc/passwd"  /dev/sda5
Inode: 435914   Type: regular    Mode:  0644   Flags: 0x0
Generation: 979004472    Version: 0x00000000
User:     0   Group:     0   Size: 1577
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
atime: 0x4a2d6f79 -- Mon Jun  8 23:07:21 2009
mtime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
Size of extra inode fields: 4
BLOCKS:
(0):1767438
TOTAL: 1
katriel
źródło
Zauważ, że argumentem „stat” nie zawsze jest / path / to / file. Użycie / path / to / file działa dla plików w głównych systemach plików (zamontowanych w /), ale nie w przypadku ścieżek zamontowanych w innym systemie plików. W takich przypadkach może zostać wyświetlony komunikat o błędzie File not found by ext2_lookup. Dlatego lepiej użyć notacji i-węzłowej jako argumentu stat. Użyj, ls -iaby uzyskać numer i-węzła pliku, a następnie wywołać debugfs z tym numerem w „<>” zamiast / path / to / file. Na przykład:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR
@ElazarR Czy możesz wyjaśnić ten komentarz? Dlaczego path/to/filenie powinien działać we wszystkich przypadkach? Mylące jest dla mnie to, że poprzez debugfs ..... /dev/fs_blockdevmoje rozumienie rozważany jest tylko jeden system plików, a do wszystkich plików w tym systemie można uzyskać dostęp przez ich ścieżkę lub przez i-węzeł, co chciałeś wyrazić?
ludzkośćANDpeace
@humanityANDpeace, w przypadku, gdy plik znajduje się na partycji (systemie plików), która znajduje się poza głównym systemem plików, tj. jest zamontowany w pewnym punkcie montowania pod partycją główną, operacja ext2_lookup wydaje się nie znajdować ścieżki pod danym urządzeniem (przegroda). Powoduje to wspomniany błąd. Na przykład, jeśli foldery / home są zamontowane z katalogu / dev / sda5 w głównym systemie plików (który znajduje się na innej partycji, np. / Dev / sda3), debugfs -R "stat /home/myuser/foo.txt" /dev/sda5oznacza to błąd. Ale wywoływanie debugfs -R "stat /path/on/rootfs" /dev/sda3działa.
ElazarR,
Myślę, że potrzebujesz sudo, w przeciwnym razie zostanie wyświetlona nieprzydatna wiadomość.
Kedar Mhaswade,
I na odwrót pytanie: jak możemy dowiedzieć się, który plik używa danego bloku?
Luis A. Florit,
4

Spójrz na składnię „debugfs”, a zwłaszcza na polecenie „stat”. Spowoduje to wyświetlenie listy bloków danych używanych przez plik. Możesz przekazać parametry do „debugfs” za pomocą argumentu „-f”, aby wywołać go ze skryptu.

Evan Anderson
źródło
4

Prostym sposobem na uzyskanie listy bloków (bez konieczności czytania z partycji jak w debugfsodpowiedziach) jest użycie FIBMAPioctl. Nie znam żadnego polecenia, ale napisanie jednego jest bardzo proste; szybkie wyszukiwanie w Google dało mi przykład użycia FIBMAP , który robi dokładnie to, co chcesz. Zaletą jest to, że będzie działać na każdym systemie plików, który obsługuje tę bmapoperację, a nie tylko na ext3.

Nowszą (i bardziej wydajną) alternatywą jest FIEMAPioctl, który może również zwracać szczegółowe informacje o zakresach (przydatne dla ext4).

CesarB
źródło
3
hdparm --fibmap /path/to/filename

Nie będę działał na ZFS, ale na ext4, btrfs, (v) fat itp

man 8 hdparm :

--fibmapW przypadku użycia musi to być jedyna podana flaga. Wymaga ścieżki pliku jako parametru i wydrukuje listę zakresów urządzeń (zakresów sektorów) zajmowanych przez ten plik na dysku. Numery sektorów są podawane jako bezwzględne liczby LBA, odnoszące się do sektora 0 urządzenia fizycznego ( nie partycji ani systemu plików). Informacje te mogą być następnie wykorzystane do różnych celów, takich jak badanie stopnia fragmentacji większych plików lub określenie odpowiednich sektorów, które zostaną celowo uszkodzone podczas procedur testowania wstrzykiwań.

ChewbaccaKL
źródło
1

Przynajmniej na niektórych komputerach z linuksem ... „ls -s” może dostarczyć to, czego szukasz.

Edycja: mój zły, widzę, że szukasz listy samych bloków, a nie ich liczby.

użytkownik10357
źródło
-s pokazuje rozmiar pliku w blokach - chcę rzeczywistą listę numerów bloków.
Mike
-2

e2fsck -b 32768 / dev / hda1 czuję, że możesz to wypróbować lub jeśli szukasz więcej docx na tym samym, możesz sprawdzić następujące

http://www.linux-tutorial.info/modules.php?name=MContent&pageid=97

Rajat
źródło
To polecenie uruchamia sprawdzanie systemu plików, biorąc 32768 za superblok zapasowy. Nie o to prosił.
James Broadhead,