Czy jest jakieś polecenie, które wyświetli blok początkowy i końcowy dowolnego pliku?
command-line
filesystems
files
precyzyjny
źródło
źródło
Odpowiedzi:
hdparm
Nie jestem w 100% pewien, że tego właśnie szukasz, ale uważam, że możesz to zrobić za pomocą polecenia
hdparm
, a konkretnie jego--fibmap
przełącznika.fragment
Przykład
Powiedzmy, że mamy przykładowy plik.
Teraz kiedy biegniemy
hdparm
.filefrag
Inną przyjemną metodą znajdowania początkowych i końcowych bloków pliku jest
filefrag
. Musisz jednak użyć odpowiednich przełączników, aby uzyskać pożądaną moc wyjściową. Zaletą tego narzędziahdparm
jest to, że każdy użytkownik może go uruchomić, więc niesudo
jest to wymagane. Musisz użyć-b512
przełącznika, aby wyjścia były wyświetlane w 512-bajtowych blokach. Musimy też powiedzieć,filefrag
żeby być gadatliwym.Przykład
debugfs
Trzecią metodą uzyskania LBA pliku jest skorzystanie z niego
debugfs
. Ta metoda wymaga trochę matematyki, ale pomyślałem, że ważne jest, aby pokazać, w jaki sposób można przekonwertować wartości zakresu zgłaszane przezdebugfs
LBA dla tych, którzy mogą być ciekawi.Zacznijmy od i-węzła pliku.
UWAGA: Możemy również użyć nazwy pliku wewnątrz,
debugfs
ale do tej demonstracji użyję zamiast tego i-węzła.Teraz uzyskamy
stat
informacje za pośrednictwemdebugfs
naszego i-węzła.Ważna informacja znajduje się w części dotyczącej zakresu. W rzeczywistości są to bloki systemu plików używane przez ten i-węzeł. Musimy tylko przekonwertować je na LBA. Możemy to zrobić za pomocą następującego równania.
UWAGA: Zakładając, że nasz system plików używa bloków o wielkości 4k, a sprzęt bazowy używa 512 bajtów, musimy pomnożyć wartości wyjściowe przez 8.
Przykład
Zatem w naszym przykładzie nasz początkowy i końcowy zasięg jest taki sam, ponieważ nasz plik mieści się w jednym zakresie.
Nasze LBA to 282439184..282439191.
Bibliografia
źródło
filefrag
.debugfs
.filefrag
z dostępnymi rozmiarami bloków 1024 i 2048 ..debugfs
z większymi rozmiarami plików : 0 - 12187 .. Nie spieszę się i zrozumiem ... to świetna pomoc, dzięki ...Numer sektora w stosunku do urządzenia blokowego zawierającego FS (nie całego dysku)
(Pamiętaj, że
hdparm --fibmap
dotyczy całego dysku, nie partycji ani innego bloku blokującego FS. Wymaga również rootowania.)filefrag -e
działa dobrze i używa ogólnego i wydajnegoFIEMAP
ioctl , więc powinien działać na prawie każdym systemie plików (w tym często dziwnym BTRFS, nawet dla plików skompresowanych BTRFS). Wróci do FIBMAP dla systemów plików / jąder bez obsługi FIEMAP.Tylko XFS
Jeśli używasz xfs, to
xfs_bmap
ma ładniejszy wynik: pokazuje, gdzie są dziury, afilefrag
po prostu ma następny zasięg, zaczynając od późniejszego sektora. Wykorzystuje bloki 512B, a nie taki, jaki faktycznie jest rozmiar bloku systemu plików. (zazwyczaj 4k w systemie Linux). Pokazuje, w której grupie alokacji jest każdy zakres i jak jest wyrównany na granicach pasków RAID.-l
jest zbędny, gdy-v
jest używany, ale z jakiegoś powodu zawsze piszę-vpl
.-pl
jest bardziej kompaktowy.Zarówno
filefrag
ixfs_bmap
pokazują wstępnie przydzielone zakresy.hdparm --fibmap
jest przydatny tylko wtedy, gdy chcesz mieć numer sektora w stosunku do całego dysku twardego , a nie w obrębie partycji, na której znajduje się system plików. Nie działa na oprogramowaniu RAID (lub prawdopodobnie na czymkolwiek innym między systemem plików a dyskiem twardym). Wymaga również rootowania. Pomimo nazwy opcji, faktycznie używa,FIEMAP
gdy jest dostępna (nowszy ioctl z mapą zasięgu, a nie stary powolny ioctl z mapą bloków).źródło
Tak więc dla danego pliku chcesz wiedzieć, które numery bloków dysku zawierają początek i koniec tego pliku.
debugfs (8) wygląda obiecująco na FS2 ext2 / 3/4
stat (1), ls -i, lsof (8) podają numer i-węzła, ale niewiele więcej o blokach dysków.
head / tail --bytes = 1024 jest przydatny dla zawartości pliku, ale nie bloków dysku.
dd (1) będzie tym, co chcesz sprawdzić zawartość bloku - zwróć uwagę na różnicę między parametrami seek = i skip = i unikaj = / dev / ..., chyba że naprawdę chcesz, aby plik wyjściowy był urządzeniem .
źródło
hdparm --fibmap
wyświetli listę bloków zajmowanych przez plik. Pamiętaj, że mogą nie być ciągłe, więc „początek i koniec” nie ma sensu.źródło
--fibmap
. Musisz także podać nazwę pliku w / it. Przykład:hdparm --fibmap afile
.hdparm
całym poziomem napędu nigdy nie były używane w przypadku plików.