Gibt es einen Befehl, der die Anfangs- und Endblöcke einer Datei ausgibt?
command-line
filesystems
files
präzise
quelle
quelle
Antworten:
hdparm
Ich bin mir nicht hundertprozentig sicher, wonach Sie suchen, aber ich glaube, Sie können dies mit dem Befehl tun
hdparm
, insbesondere mit seinem--fibmap
Schalter.Auszug
Beispiel
Angenommen, wir haben eine Beispieldatei.
Jetzt wenn wir rennen
hdparm
.filefrag
Eine andere gute Methode, um die Anfangs- und Endblöcke einer Datei herauszufinden, ist
filefrag
. Sie müssen jedoch geeignete Schalter verwenden, um die gewünschte Ausgabe zu erhalten. Ein Vorteil dieses Toolshdparm
ist, dass jeder Benutzer es ausführen kann, sodass kein Toolsudo
erforderlich ist. Sie müssen den-b512
Schalter verwenden, damit die Ausgänge in 512-Byte-Blöcken angezeigt werden. Wir müssen auch sagenfilefrag
, dass wir ausführlich sind.Beispiel
debugfs
Eine dritte Methode zum Abrufen der LBAs einer Datei ist die Verwendung von
debugfs
. Diese Methode erfordert ein wenig Mathematik, aber ich fand es wichtig zu zeigen, wie man den vondebugfs
LBAs gemeldeten Extents-Wert für diejenigen konvertieren kann, die neugierig sein könnten.Beginnen wir also mit dem Inode der Datei.
HINWEIS: Wir könnten auch den Dateinamen verwenden,
debugfs
aber für diese Demonstration werde ich stattdessen den Inode verwenden.Lassen Sie uns nun die
stat
Informationen überdebugfs
unsere Inode erhalten.Die wichtigen Informationen finden Sie im Abschnitt Extents. Dies sind tatsächlich Dateisystemblöcke, die von diesem Inode verwendet werden. Wir müssen sie nur in LBA konvertieren. Wir können dies durch die folgende Gleichung tun.
ANMERKUNG: Angenommen, unser Dateisystem verwendet 4k-Blockgrößen und die zugrunde liegende Hardware 512-Byte-Einheiten, müssen wir die Exents mit 8 multiplizieren.
Beispiel
In unserem Beispiel ist unser Anfangs- und Endbereich derselbe, da unsere Datei in einen einzelnen Bereich passt.
Unsere LBAs sind also 282439184..282439191.
Verweise
quelle
filefrag
.debugfs
.filefrag
mit dem verfügbaren Blockgrößen von 1024 und 2048 ..debugfs
mit einer größeren Datei Ausdehnungen: 0-12187 .. Ich werde meine Zeit in Anspruch nehmen und verstehen .. das eine große Hilfe ist, dank ...Sektornummer relativ zum Blockgerät mit dem FS (nicht ganze Platte)
(Beachten Sie, dass dies
hdparm --fibmap
relativ zur gesamten Festplatte ist, nicht zur Partition oder zu einem anderen Block, der den FS enthält. Außerdem ist root erforderlich.)filefrag -e
funktioniert gut und verwendet das generische und effizienteFIEMAP
ioctl , so dass es auf so ziemlich jedem Dateisystem funktionieren sollte (einschließlich des oft seltsamen BTRFS, selbst für BTRFS-komprimierte Dateien). Für Dateisysteme / Kernel ohne FIEMAP-Unterstützung wird auf FIBMAP zurückgegriffen.Nur XFS
Wenn Sie xfs verwenden,
xfs_bmap
hat es eine schönere Ausgabe: Es zeigt Ihnen, wo es Löcher gibt, währendfilefrag
das nächste Ausmaß nur bei einem späteren Sektor beginnt. Es werden 512B-Blöcke verwendet, unabhängig von der tatsächlichen Blockgröße des Dateisystems. (normalerweise 4k unter Linux). Es zeigt Ihnen, in welcher Zuordnungsgruppe sich die einzelnen Bereiche befinden und wie sie an den RAID-Streifengrenzen ausgerichtet sind.-l
ist redundant, wenn-v
es verwendet wird, aber aus irgendeinem Grund tippe ich immer-vpl
.-pl
ist kompakter Ausgabe.Beides
filefrag
undxfs_bmap
zeigen Ihnen vorab zugewiesene Ausmaße.hdparm --fibmap
ist nur nützlich, wenn Sie eine Sektornummer relativ zur gesamten Festplatte wünschen , nicht innerhalb der Partition, auf der sich das Dateisystem befindet. Es funktioniert nicht über Software-RAID (oder vermutlich irgendetwas anderes zwischen dem Dateisystem und einer Festplatte). Es erfordert auch root. Trotz des Namens der Option wird sie tatsächlich verwendet,FIEMAP
wenn sie verfügbar ist (das neuere Extent-Map-Ioctl, nicht das alte Slow-Block-Map-Ioctl).quelle
Für eine bestimmte Datei möchten Sie also wissen, welche Plattenblocknummern den Anfang und das Ende dieser Datei enthalten.
debugfs (8) sieht für ext2 / 3/4 FSes vielversprechend aus
stat (1), ls -i, lsof (8) geben die Inode-Nummer an, aber sonst nicht viel über Plattenblöcke.
head / tail --bytes = 1024 ist nützlich für Dateiinhalte, jedoch nicht für Festplattenblöcke.
Mit dd (1) möchten Sie den Blockinhalt überprüfen. Achten Sie auf den Unterschied zwischen den Parametern seek = und skip = und vermeiden Sie = / dev / ..., es sei denn, Sie möchten wirklich, dass die Ausgabedatei ein Gerät ist .
quelle
hdparm --fibmap
listet die Blöcke auf, die eine Datei belegt. Beachten Sie, dass sie möglicherweise nicht zusammenhängend sind, sodass "Start und Ende" keinen Sinn ergibt.quelle
--fibmap
. Außerdem müssen Sie einen Dateinamen angeben. Beispiel :hdparm --fibmap afile
.hdparm
einem ganzen Laufwerk, das ich noch nie für Dateien verwendet habe.