Mentre rispondo a questa domanda di U&L intitolata: Quale comando devo usare per vedere il blocco iniziale e finale di un file nel file system? , Ho provato a capire se era possibile determinare l'LBA di un file usando il suo inode.
La mia risposta ha stabilito che potrei usare hdparmcome metodo per trovare gli LBA:
$ 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
Ma ero curioso di sapere se c'era un metodo che utilizzava l'inode di un file per ottenere anche gli LBA; senza usare hdparm.
Penso che ci potrebbero essere i metodi alternativi che si nascondono negli strumenti filefrag, stat, debugfs, e tune2fs, ma prendere in giro fuori mi sta sfuggendo.
Qualcuno può pensare ad alternative?
Ecco alcune delle mie ricerche finora che potrebbero essere utili a chi è abbastanza coraggioso da tentare di rispondere a questa domanda.
filefrag
Ho il sospetto che tu possa usare lo strumento filefragper farlo, in particolare usando i risultati dal suo -einterruttore, forse eseguendo diversi calcoli per arrivarci che non ho familiarità.
uscita campione
$ 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
inode
Un altro potenziale metodo che sospetto possa avere è quello di utilizzare le informazioni sull'inode di un file, direttamente o attraverso una matematica complessa che è scarsamente documentata sugli interwebs.
Esempio
Per prima cosa scopriamo l'inode del file. Possiamo farlo usando il statcomando o ls -i.
statistica
$ 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
Con le informazioni inode in mano, possiamo ora aprire il file system Il file si trova su come utilizzare lo strumento, debugfs.
NOTA: per determinare il filesystem su cui risiede un file è possibile utilizzare il comando df <filename>.
Ora se eseguiamo debugfsed eseguiamo il comando stat <inode #>possiamo ottenere un elenco di estensioni che contengono i dati di questo file.
$ 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
Ora abbiamo le informazioni sulle estensioni sopra, ed è qui che mi perdo e non so come procedere.
filefrag -b512 -v ..dice "physical_offset: 211787168 .. 211795719" questi equivarrebbero agli LBA? Questo sembra funzionare con lo stesso file conhdparm --fibmap, 211787168..211795719. Se lascio cadere-b512 -ve uso il def. 1024 e provare a mult. per 8, 26473396⋅8..26474464⋅8, ottengo 211787168..211795712, che è vicino ma un po 'fuori. Sto pensando che il secondo valore dovrebbe essere (26474465⋅8) -1 = 211795719, non so perché.