Wie kann ich herausfinden, wo sich eine Datei physisch auf der Festplatte befindet (Blocknummern)?

10

Das ist eine dunkle Frage, ich weiß. Ich versuche, einige Festplatten auf einer Linux-Box auf Leistung zu testen. Ich erhalte einige inkonsistente Ergebnisse und führe denselben Test auf derselben Festplatte aus. Ich weiß, dass Festplatten eine unterschiedliche Leistung haben, je nachdem, auf welchen Teil der Festplatte zugegriffen wird. Insbesondere Lese- und Schreibvorgänge an der Außenseite der Platte haben aufgrund der nahezu konstanten Datendichte und der konstanten Drehzahl einen viel höheren Durchsatz als Lese- und Schreibvorgänge an der Innenseite der Platte.

Ich würde gerne sehen, ob meine Inkonsistenzen auf diese geometriebedingte Varianz im Durchsatz zurückzuführen sind. Ist es möglich, mit vorhandenen Tools herauszufinden, wo auf der Festplatte eine Datei abgelegt wurde?

Wenn nicht, kann ich wahrscheinlich etwas schreiben, um die Gerätedatei selbst direkt zu suchen, zu lesen und zu schreiben, wobei das Dateisystem umgangen (und zerstört) wird, aber ich hoffe, dies zu vermeiden. Ich verwende derzeit ext4 auf einem 3.0-Kernel (Arch Linux, falls wichtig), interessiere mich aber auch für Techniken für andere Dateisysteme.

Rick Koshi
quelle
1
Wer sagt, dass sich Dateien an einem Ort befinden? Wenn sie fragmentiert werden (was sie normalerweise tun), können sie überall landen.
Sirex
Absolut. Aber sie sind immer noch irgendwo :-) Und in meinem speziellen Fall, wenn sie Dateien in ein neu erstelltes Dateisystem schreiben, sind sie wahrscheinlich (meistens) unfragmentiert.
Rick Koshi
Das kannst du nicht machen. Das Beste, was Sie erhalten können, sind die LBA-Blocknummern der Dateien, die nicht unbedingt bestimmten physischen Speicherorten entsprechen (zumindest nicht auf eine Weise, die Sie bestimmen können, da Laufwerke diese Zuordnung nicht veröffentlichen). Es gibt auch andere Dinge, zum Beispiel können die Blöcke 3-5 fortlaufend nummeriert sein, aber 4 wurden möglicherweise an einer völlig anderen Stelle auf dem Laufwerk neu zugewiesen, weil der ursprüngliche Sektor bei 4 physisch beschädigt wurde usw. Sie können die Informationen nicht erhalten Sie suchen, es sei denn, der Laufwerkshersteller ist bereit, Ihnen detaillierte Adressangaben zu machen.
Jason C

Antworten:

7

Sie könnten dafür verwenden debugfs:

debugfs -R "stat ~/myfile" /dev/hda1

Ändern Sie die Festplatte / Partition entsprechend und stellen Sie sicher, dass die Festplatte nicht gemountet ist. Sie erhalten eine Liste mit allen verwendeten Blöcken:

BLOCKS:
(0):1643532
TOTAL: 1
Bart De Vos
quelle
1
Das ist perfekt, danke. Ich bin mir nicht sicher, warum Sie gesagt haben, dass das Laufwerk nicht montiert ist. Laut der Handbuchseite wird debugfs standardmäßig im schreibgeschützten Modus geöffnet, daher sollte dieser Befehl auch auf einem aktiven Dateisystem absolut sicher sein. Es kann natürlich zu fragwürdigen Ergebnissen kommen, wenn die abgefragte Datei zu diesem Zeitpunkt aktiv geändert wird, aber es sollten keine anderen Probleme auftreten. Habe ich etwas verpasst
Rick Koshi
Nein, du hast recht. Es ist eher eine "Best Practice" als ein Muss. Wenn Sie es auf einem aktiven Dateisystem tun, können sich Dateien ändern usw.
Bart De Vos
1
Die LBA-Blocknummer gibt nicht an, wo sich die Datei physisch auf der Festplatte befindet. In diesen Tagen Umwandlung von LBA nach physischem Standort ist in der Regel nicht möglich, aufgrund der Komplexität der physikalischen Geometrie moderner Antriebe, hinter den Kulissen Sektor Umschichtungen usw. Im Allgemeinen ist es in der Regel eine sichere Wette , dass für Disk-basierten Medien senken LBAs befinden sich außerhalb des Laufwerks, aber das liegt nur daran, dass dieses Layout in der Vergangenheit typisch war, damals in CHS-Adressierungstagen. Moderne Laufwerke veröffentlichen nicht einmal mehr echte CHS-Geometrie, weil sie dies nicht können.
Jason C
Was ist mit Fat Fie-Systemen?
Bindestrich
10

Sie können die Verwendung FIBMAP ioctl , wie sie beispielhaft hier , oder unter Verwendung von hdparm :

/ $ sudo /sbin/hdparm --fibmap /etc/X11/xorg.conf

/etc/X11/xorg.conf:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0    1579088    1579095          8
Francois G.
quelle
Leider ist nichts, was von stat ausgegeben wird, die Information, die ich brauche. Größe in Bytes und Blöcken, Inode-Nummer, Berechtigungen ... Keiner dieser Werte gibt an, welche Blöcke die Daten der Datei enthalten. Zum Beispiel zeigen meine Testdateien (die alle die gleiche Größe haben) genau die gleichen Daten, mit Ausnahme der Inode-Nummer und der Zugriffs- / Änderungszeiten.
Rick Koshi
Ja, Sie haben Recht, es tut mir leid, ich habe nicht richtig gelesen. Ich habe meine Antwort auf stg passender geändert.
Francois G
hdparm gibt mir in der Tat das, was ich brauche, und zwar in einem etwas besser lesbaren Format als debugfs. Ich musste es jedoch suchen, da es standardmäßig nicht installiert ist (unter Arch Linux). debugfs ist Teil von e2fsprogs (dasselbe Paket, das uns mkfs und fsck gibt) und wird daher standardmäßig installiert.
Rick Koshi
Der LBA teilt Ihnen nicht mit, wo sich die Datei physisch auf dem Laufwerk befindet. Es ist nicht möglich, Informationen über die tatsächliche physische Zuordnung von LBAs abzurufen.
Jason C
Ich bekomme das auf Fett:HDIO_GETGEO failed: Inappropriate ioctl for device
Bindestrich
5

Dieser Thread gibt Ihnen möglicherweise einen Einblick in den Algorithmus zur Platzierung von ext4-Dateien.

debugfshat eine bmapFunktion, die die gewünschten Daten zu geben scheint. Sie sollten in der Lage sein, aufeinanderfolgende Blöcke einer Datei zu vergeben und die physischen Blocknummern abzurufen.

Paweł Brodacki
quelle
1
Vielen Dank für den Zeiger auf den Thread zur Platzierung von ext4-Dateien. Das war aufschlussreich. :-)
Rick Koshi
Der LBA teilt Ihnen nicht mit, wo sich die Datei physisch auf dem Laufwerk befindet. Es ist nicht möglich, Informationen über die tatsächliche physische Zuordnung von LBAs abzurufen.
Jason C
2

Die Frage ist ziemlich alt, aber es gibt eine andere Antwort, die für diejenigen nützlich sein könnte, die dies bei Google finden: filefrag(in Debian ist es im Paket enthalten e2fsprogs).

# filefrag -eX /usr/bin/aptitude
Filesystem type is: ef53
File size of /usr/bin/aptitude is 4261400 (1041 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..     1fa:    15bd805..   15bd9ff:    1fb:            
   1:      1fb..     3f2:    15c6608..   15c67ff:    1f8:    15bda00:
   2:      3f3..     410:    15c8680..   15c869d:     1e:    15c6800: last,eof
/usr/bin/aptitude: 3 extents found

Es hat den Vorteil, dass es auch für andere Dateisysteme funktioniert (ich habe es für UDF verwendet), die von anderen hier beschriebenen Tools nicht unterstützt zu werden scheinen.

Der in der Ausgabe dargestellte Versatz soll ein Vielfaches der in der zweiten Zeile (hier 4096) angegebenen Blockgröße sein. Beachten Sie, dass logische Offsets möglicherweise nicht zusammenhängend sind, da eine Datei Lücken aufweisen kann (sofern dies vom Dateisystem unterstützt wird).

Giovanni Mascellani
quelle