Den physischen Speicherort einer Datei/eines Verzeichnisses auf einer Festplatte anzeigen

Den physischen Speicherort einer Datei/eines Verzeichnisses auf einer Festplatte anzeigen

Gibt es ein Linux-Programm, das dieselben (oder einige der) Funktionen von Sysinternals DiskView bietet, insbesondere die Möglichkeit, den physischen Speicherort einer Datei auf einer Festplatte anzuzeigen?

DiskView-URL:http://technet.microsoft.com/en-gb/sysinternals/bb896650

Antwort1

Bei einigen Dateisystemen wie ext4 oder btrfs unter Linux können Sie filefrag verwenden, um die Offsets der Datensegmente für die Datei auf dem Blockgerät abzurufen, auf dem sich das Dateisystem befindet.

$ seq 1000 > a
$ filefrag -v a
Filesystem type is: ef53
File size of a is 3893 (1 block of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:   82784147..  82784147:      1:             eof
a: 1 extent found
$ sudo dd bs=4k skip=82784147 count=1 if=/dev/storage/home 2>&- | head
1
2
3
4
5
6
7
8
9
10

Hier ist das Blockgerät ein LVM-Volume. Dieses Volume kann physische Volumes auf Festplatten, Partitionen, RAID-Arrays, Dateien, RAM, Netzwerkblockgeräten usw. haben. Die Rückkehr zu einer tatsächlichen Festplatte oder einem Festplattensatz kann sich als schwierig erweisen.

In meinem Fall ist es relativ einfach, da es sich lediglich um ein logisches Volume über einer GPT-Partition als linearer Abschnitt handelt.

$ sudo dmsetup table /dev/storage/home
0 1953120256 linear 8:98 384

/dev/storage/home umfasst also 384 Sektoren innerhalb des Geräts 8:98, was /dev/sdg2für mich zufällig der Fall ist.

$ cat /sys/block/sdg/sdg2/start
489060352

SDG2 umfasst also 489060352 Sektoren innerhalb von /dev/sdg (die 7. Festplatte in diesem System).

So kann ich den Offset innerhalb der einzelnen Festplatte ermitteln, auf der sich die Datei befindet:

$ sudo dd if=/dev/sdg skip="$((489060352+384+82784147*8))" count=1 2> /dev/null | head
1
2
3
4
5
6
7
8
9
10

Antwort2

Ich weiß, dass dies ein alter Beitrag ist, aber ich brauchte die gleiche Funktionalität für ein btrfs-Dateisystem, das keine einfache logische -> physische Adresszuordnung hat. Der elegante Weg, dies auf btrfs zu tun, besteht darin, btrfs_map_physical.c zu kompilieren, das sich befindetQuelle hier.

Ein allgemeinerer Mechanismus, den ich erstellt habe und der auf jedem Dateisystem funktioniert, ist der Zugriff auf die Datei ddwährend der Ausführung blktrace.

Während Sie dies in einem Terminal ausführen:

sudo blktrace -d /dev/sda -o - | blkparse -i - -F Q,"%d Queue(Q) %T.%t %S %n %C\n" | grep --line-buffered "Queue(Q)" | awk -W interactive ' {printf "%s %13s %s 0x%08x 0x%04x %s\n", $2, $3, $1, $4, $5, $6; fflush() }

Führen Sie dies in einem anderen aus:

dd if=/mnt/myfs/test.txt bs=4096 iflag=direct count=1 | head -4

Beispielausgabe:

Queue(Q)   0.000000000 R 0x00044800 0x0008 dd
  • Queue(Q) ist das Blktrace-Ereignis, das ich analysiere
  • 0.000000000 ist der relative Zeitstempel
  • R ist die Operation (Lesen)
  • 0x00044800 ist die Blockadresse in Hex. Ändern Sie printf, wenn Sie Dezimalzahlen wünschen.
  • 0x0008 ist die Anzahl der gelesenen Blöcke
  • dd ist der Name der App, die die Anfrage gestellt hat

Dieses Beispiel befindet sich auf einem Dateisystem mit einer Blockgröße von 4 KB.

verwandte Informationen