Wie liste ich die Datenblöcke einer Datei unter Linux auf?

13

So wie ich es verstehe, hat jede Datei auf einem Unix-ähnlichen Betriebssystem eine Inode-Nummer (die mit "ls -i" angezeigt werden kann), und jeder Inode ist eine Liste von Plattenblöcken, die die tatsächlichen Daten einer Datei enthalten.

Gibt es einen Linux-Befehl, der einen Dateinamen als Argument verwendet und die Liste der Plattenblöcke ausgibt, auf die der Inode dieser Datei verweist?

PS Das fragliche Dateisystem ist ext3.

Mike
quelle

Antworten:

17

Sie können das Tool "debugfs" verwenden, um Dateiinformationen in der Befehlszeile oder interaktiv anzuzeigen. entweder verwenden:

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

oder

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

beispielsweise:

# 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
quelle
Beachten Sie, dass das Argument für 'stat' nicht immer / path / to / file ist. Die Verwendung von / path / to / file funktioniert für Dateien auf den Root-Dateisystemen (gemountet unter /), jedoch nicht für Pfade, die in einem anderen Dateisystem gemountet sind. In diesen Fällen kann eine Fehlermeldung angezeigt werden File not found by ext2_lookup. Daher ist es besser, die Inode-Notation für das Argument von stat zu verwenden. Verwenden Sie ls -idiese Option, um die Inode-Nummer einer Datei abzurufen, und rufen Sie dann debugfs mit dieser Nummer in '<>' anstelle von / path / to / file auf. Zum Beispiel:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR
@ElazarR Kannst du diesen Kommentar erklären? Warum sollte path/to/filenicht in allen Fällen arbeiten? Was mich verwirrt ist, dass debugfs ..... /dev/fs_blockdevnach meinem Verständnis immer nur ein Dateisystem in Betracht gezogen wird und auf alle diese Dateien innerhalb dieses Systems entweder über ihren Pfad oder über eine Inode zugegriffen werden kann. Was wollten Sie ausdrücken?
HumanityANDpeace
@humanityANDpeace: Wenn sich eine Datei in einer Partition (Dateisystem) befindet, die sich außerhalb des Root-Dateisystems befindet, dh an einem Einhängepunkt unter der Root-Partition eingehängt ist, scheint die ext2_lookup-Operation den angegebenen Pfad unter dem angegebenen Gerät nicht zu finden (Trennwand). Dies führt zu dem Fehler, den ich erwähnt habe. Wenn beispielsweise Ihre / home-Ordner von / dev / sda5 über das Root-Dateisystem angehängt werden (das sich auf einer anderen Partition befindet, z. B. / dev / sda3), tritt debugfs -R "stat /home/myuser/foo.txt" /dev/sda5ein Fehler auf. Aber das Aufrufen debugfs -R "stat /path/on/rootfs" /dev/sda3funktioniert.
ElazarR
Ich denke, Sie brauchen sudo, sonst wird eine nicht hilfreiche Nachricht angezeigt.
Kedar Mhaswade
Und die umgekehrte Frage: Wie können wir herausfinden, welche Datei einen bestimmten Block verwendet?
Luis A. Florit
4

Sehen Sie sich die Syntax für "debugfs" und insbesondere den Befehl "stat" an. Daraufhin wird eine Liste der von einer Datei verwendeten Datenblöcke angezeigt. Sie können Parameter mit dem Argument "-f" an "debugfs" übergeben, um sie von einem Skript aus aufzurufen.

Evan Anderson
quelle
4

Eine einfache Möglichkeit, die Liste der Blöcke abzurufen (ohne wie in den debugfsAntworten aus der Partition lesen zu müssen ), ist die Verwendung von FIBMAPioctl. Ich kenne keinen Befehl dazu, aber es ist sehr einfach, einen zu schreiben. Eine schnelle Google-Suche gab mir ein Beispiel für die Verwendung von FIBMAP , das genau das macht, was Sie wollen. Ein Vorteil ist, dass es auf jedem Dateisystem bmapfunktioniert, das die Operation unterstützt , nicht nur auf ext3.

Eine neuere (und effizientere) Alternative ist das FIEMAPioctl, das auch detaillierte Informationen zu Extents zurückgeben kann (nützlich für ext4).

CesarB
quelle
3
hdparm --fibmap /path/to/filename

Ich werde nicht an zfs arbeiten, sondern an ext4, btrfs, (v) fat usw

man 8 hdparm :

--fibmapBei Verwendung muss dies das einzige gegebene Flag sein. Es erfordert einen Dateipfad als Parameter und gibt eine Liste der Gerätebereiche (Sektorbereiche) aus, die von dieser Datei auf der Festplatte belegt werden. Sektornummern werden als absolute LBA-Nummern angegeben, die auf Sektor 0 des physischen Geräts ( nicht auf die Partition oder das Dateisystem) verweisen . Diese Informationen können dann für eine Vielzahl von Zwecken verwendet werden, z. B. zum Untersuchen des Fragmentierungsgrades größerer Dateien oder zum Ermitteln geeigneter Sektoren, die während der Fehlerinjektionstestverfahren absichtlich beschädigt werden sollen.

ChewbaccaKL
quelle
1

Zumindest auf einigen Linux-Rechnern ... könnte "ls -s" das liefern, wonach Sie suchen.

Edit: meine schlechte, ich sehe, dass Sie eine Liste der Blöcke selbst suchen, nicht eine Anzahl von ihnen.

user10357
quelle
-s zeigt die Größe der Datei in Blöcken - ich möchte eine aktuelle Liste der Blocknummern.
Mike
-2

e2fsck -b 32768 / dev / hda1 Ich glaube, Sie können dies ausprobieren oder wenn Sie mehr docx auf dem gleichen suchen, können Sie Folgendes überprüfen

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

Rajat
quelle
Dieser Befehl führt eine Dateisystemprüfung durch, wobei 32768 als Backup-Superblock verwendet wird. Darum hat er nicht gebeten.
James Broadhead