Bei der Beantwortung dieser U & L-Frage mit dem Titel: Mit welchem Befehl kann ich den Start- und Endblock einer Datei im Dateisystem anzeigen? Ich habe versucht herauszufinden, ob es möglich ist, den LBA einer Datei mithilfe des Inodes zu bestimmen.
Meine Antwort ergab, dass ich hdparm
als eine Methode zum Auffinden von LBAs verwenden könnte:
$ sudo hdparm --fibmap afile
afile:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 282439184 282439191 8
Aber ich war neugierig, ob es eine Methode gibt, die den Inode einer Datei verwendet, um auch die LBAs zu erhalten. ohne zu benutzen hdparm
.
Ich denke , es könnte alternative Methoden sein in den Werkzeugen versteckt filefrag
, stat
, debugfs
, und , tune2fs
aber es Herausarbeitung ist eluding ich.
Kann sich jemand Alternativen vorstellen?
Hier sind einige meiner bisherigen Forschungen, die für diejenigen nützlich sein könnten, die mutig genug sind, dies zu beantworten.
filefrag
Ich vermute, Sie könnten das Tool verwenden, filefrag
um dies zu tun, insbesondere anhand der Ergebnisse des -e
Wechsels, indem Sie möglicherweise mehrere Berechnungen durchführen, um dorthin zu gelangen, mit denen ich nicht so vertraut bin.
Beispielausgabe
$ filefrag -e afile
Filesystem type is: ef53
File size of afile is 20 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 35304898.. 35304898: 1: eof
afile: 1 extent found
Inodes
Eine andere mögliche Methode, von der ich vermute, dass sie Potenzial hat, besteht darin, die Inode-Informationen einer Datei entweder direkt oder durch eine komplexe Mathematik zu verwenden, die in den Interwebs schlecht dokumentiert ist.
Beispiel
Zuerst finden wir den Inode der Datei heraus. Wir können dies entweder mit dem stat
Befehl oder tun ls -i
.
stat
$ stat afile
File: ‘afile’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 6560281 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ saml) Gid: ( 1000/ saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-12-27 18:40:12.788333778 -0500
Modify: 2013-12-27 18:40:23.103333073 -0500
Change: 2013-12-27 18:44:03.697317989 -0500
Birth: -
ls -i
$ ls -i
6560281 afile
Mit den vorliegenden Inode-Informationen können wir nun das Dateisystem öffnen, in dem sich diese Datei befindet, indem wir das Tool verwenden debugfs
.
HINWEIS: Um das Dateisystem zu bestimmen, in dem sich eine Datei befindet, können Sie den Befehl verwenden df <filename>
.
Wenn wir nun debugfs
den Befehl ausführen stat <inode #>
, können wir eine Liste der Speicherbereiche abrufen, die die Daten dieser Datei enthalten.
$ sudo debugfs -R "stat <6560281>" /dev/mapper/fedora_greeneggs-home
debugfs 1.42.7 (21-Jan-2013)
Inode: 6560281 Type: regular Mode: 0664 Flags: 0x80000
Generation: 1999478298 Version: 0x00000000:00000001
User: 1000 Group: 1000 Size: 20
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x52be10c3:a640e994 -- Fri Dec 27 18:44:03 2013
atime: 0x52be0fdc:bbf41348 -- Fri Dec 27 18:40:12 2013
mtime: 0x52be0fe7:18a2f344 -- Fri Dec 27 18:40:23 2013
crtime: 0x52be0dd8:64394b00 -- Fri Dec 27 18:31:36 2013
Size of extra inode fields: 28
Extended attributes stored in inode body:
selinux = "unconfined_u:object_r:user_home_t:s0\000" (37)
EXTENTS:
(0):35304898
Jetzt haben wir die oben genannten Informationen, und hier verliere ich mich und weiß nicht, wie ich vorgehen soll.
Verweise
- Finden, welche Festplattensektoren eine Datei belegen
- Identifizieren der Datei, die dem nicht lesbaren Festplattensektor zugeordnet ist
- Bad Block HOWTO für Smartmontools
- C5170 Vorlesungsunterlagen - Interne Darstellung von Dateien - Das Unix-Dateisystem
- Logische Blockadressierung
- Ext4-Festplattenlayout
quelle
filefrag -b512 -v ..
"Physical_offset: 211787168 .. 211795719" sagt, würden diese den LBAs entsprechen? Dies scheint mit der gleichen Datei zu lebenhdparm --fibmap
, 211787168..211795719. Wenn ich das fallen-b512 -v
lasse und das def benutze. 1024 und versuchen, mult. von 8, 26473396⋅8..26474464⋅8 erhalte ich 211787168..211795712, was nah ist, aber ein bisschen abweicht. Ich denke, der 2. Wert sollte (26474465⋅8) -1 = 211795719 sein, nicht sicher warum.Es stellt sich heraus, dass die Konvertierung von Extents in LBAs ziemlich einfach ist, wenn Sie erst einmal verstanden haben, woher die Zahlen stammen. Die Antwort von @StephaneChazelas war entscheidend, um dieses Verständnis zu erlangen.
Ursprüngliche Debugfs-Ausgabe
Verwenden Sie das folgende Beispiel, das in der Frage erwähnt wurde.
Mit den Extents-Informationen können wir die folgenden Berechnungen durchführen. Wir brauchen aber noch eine zusätzliche Information. Die Blockgröße des zugrunde liegenden Dateisystems. Sie können diesen Befehl verwenden, um ihn abzurufen.
Block Größe
Konvertieren von Extents in LBAs
Die hier zu erkennende Schlüsseltransformation ist also, dass LBAs in 512-Byte-Einheiten vorliegen und der obige
debugfs
Befehl, der die Anzahl der Extents angibt, dies in 4096-Byte-Blöcken meldet.Also, 4096/512 = 8. Wir müssen also die Extents mit 8 multiplizieren, um sie in LBA-Werte umzuwandeln.
Die folgende Mathematik gibt uns also unseren ersten LBA:
Also, was ist unser Ende LBA? Um dies zu erreichen, müssen wir erkennen, dass unser Inode in einen einzelnen Block passt, sodass seine Endausdehnung mit seiner Anfangsausdehnung übereinstimmt. Um die End-LBA zu berechnen, können wir diese Gleichung verwenden.
Führen Sie also diese Berechnung durch:
Ergebnisse bestätigen
Betrachten Sie die Originalausgabe
hdparm
:Wir sehen, dass die Dinge zusammenpassen.
Ein anderes Beispiel
Nur um sicherzugehen, dass wir hier richtig sind, ist hier eine größere Datei als zweites Beispiel.
Hier sind die Ausmaße der Inode.
Jetzt führen wir Konvertierungen von Extents in LBAs durch.
Und wir bestätigen.
Und wir passen wieder zusammen.
quelle