Come posso elencare i blocchi di dati di un file su Linux?


13

A quanto ho capito, ogni file su un sistema operativo simile a Unix ha un numero di inode (che può essere visualizzato con "ls -i"), e ogni inode è un elenco di blocchi del disco che contengono i dati effettivi di un file.

Esiste un comando Linux che utilizza un nome file come argomento e stampa l'elenco dei blocchi del disco a cui punta l'inode di quel file?

PS Il filesystem in questione è ext3.

Risposte:


17

È possibile utilizzare lo strumento "debugfs" per visualizzare le informazioni sui file nella riga di comando o in interattivo. utilizzare entrambi:

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

o

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

per esempio:

# 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

Nota che l'argomento per 'stat' non è sempre / percorso / su / file. L'uso di / path / to / file funziona per i file sui file system radice (montati su /) ma non per i percorsi montati su un altro file system. In questi casi è possibile che venga visualizzato il messaggio di errore File not found by ext2_lookup. Quindi è meglio usare la notazione inode per l'argomento di stat. Utilizzare ls -iper ottenere il numero di inode di un file, quindi richiamare i debug con quel numero in '<>' invece di / percorso / su / file. Ad esempio:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR,

@ElazarR Puoi spiegarmi quel commento? Perché path/to/filenon dovrebbe funzionare in tutti i casi? Ciò che mi confonde è che attraverso la debugfs ..... /dev/fs_blockdevmia comprensione c'è sempre e solo un filesystem in considerazione in assoluto, e tutti quei file all'interno di questo sistema sono accessibili tramite il loro percorso o tramite il loro inode, cosa volevi esprimere?
umanità e

@humanityANDpeace, nel caso in cui un file si trovi in ​​una partizione (filesystem) che è al di fuori del filesystem di root, ovvero montato in un punto di mount sotto la partizione di root, l'operazione ext2_lookup sembra non riuscire a trovare il percorso indicato sotto il dispositivo dato (partizione). Ciò provoca l'errore che ho citato. Ad esempio, se le cartelle / home sono montate da / dev / sda5 sul filesystem di root (che si trova su un'altra paritizione, ad esempio / dev / sda3), si debugfs -R "stat /home/myuser/foo.txt" /dev/sda5verifica un errore. Ma invocare debugfs -R "stat /path/on/rootfs" /dev/sda3funziona.
ElazarR,

Penso che tu abbia bisogno sudo, altrimenti verrà visualizzato un messaggio inutile.
Kedar Mhaswade,

E la domanda inversa: come possiamo scoprire quale file utilizza un determinato blocco?
Luis A. Florit,

4

Guarda la sintassi di "debugfs", e in particolare il comando "stat". Questo ti mostrerà un elenco dei blocchi di dati utilizzati da un file. È possibile passare i parametri a "debugfs" con l'argomento "-f" per chiamarlo da uno script.


4

Un modo semplice per ottenere l'elenco dei blocchi (senza dover leggere dalla partizione come nelle debugfsrisposte) è usare lo FIBMAPioctl. Non conosco alcun comando per farlo, ma è molto semplice scriverne uno; una rapida ricerca su Google mi ha dato un esempio dell'uso di FIBMAP , che fa esattamente quello che vuoi. Un vantaggio è che funzionerà su qualsiasi filesystem che supporti l' bmapoperazione, non solo ext3.

Un'alternativa più recente (e più efficiente) è lo FIEMAPioctl, che può anche restituire informazioni dettagliate sulle estensioni (utile per ext4).


3
hdparm --fibmap /path/to/filename

Non lavorerò su zfs, ma su ext4, btrfs, (v) fat, ecc

man 8 hdparm :

--fibmapSe utilizzato, questo deve essere l'unico flag fornito. Richiede un percorso file come parametro e stamperà un elenco delle estensioni del dispositivo (intervalli di settori) occupate da quel file sul disco. I numeri di settore sono dati come numeri LBA assoluti, riferiti al settore 0 del dispositivo fisico ( non alla partizione o al filesystem). Queste informazioni possono quindi essere utilizzate per una varietà di scopi, come esaminare il grado di frammentazione di file più grandi o determinare settori appropriati da danneggiare deliberatamente durante le procedure di test di iniezione di guasti.


1

Almeno su alcune macchine linux ... "ls -s" potrebbe fornire quello che stai cercando.

Modifica: mio male, vedo che stai cercando un elenco dei blocchi stessi, non un conteggio di essi.


-s mostra la dimensione del file in blocchi - voglio un elenco reale dei numeri di blocco.
mike,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.