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
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.