Informazioni dettagliate sui file sparsi su Linux


11

Ho un file sparse, in cui sono allocati solo alcuni blocchi:

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

Vorrei sapere quali blocchi del file sono effettivamente allocati. Esiste una chiamata di sistema o un'interfaccia del kernel che potrebbe essere utilizzata per ottenere un elenco delle allocazioni o dei buchi del file?

Il semplice controllo di una stringa di zeri abbastanza lunga (l'approccio utilizzato da GNU cp, rsync, ecc.) Non funziona correttamente:

~% cp example example1  
~% du -h example1 
32K     example1

Ha rilevato altre sequenze di zeri che sono state effettivamente allocate.

Risposte:


7

C'è una domanda simile su SO . La risposta attualmente accettato da @ephemient suggerisce di utilizzare un ioctlnome fiemapche è documentato in linux/Documentation/filesystems/fiemap.txt. Citando da quel file:

Fiemap ioctl è un metodo efficiente per userspace per ottenere mappature di estensione dei file. Invece della mappatura blocco per blocco (come bmap), fiemap restituisce un elenco di estensioni.

Sembra che questo sia il tipo di informazioni che stai cercando. Il supporto da parte dei filesystem è di nuovo facoltativo:

I file system che desiderano supportare fiemap devono implementare un ->fiemap callback sulla loro inode_operationsstruttura.

Il supporto per l' SEEK_DATAe SEEK_HOLEargomenti per lseekvoi citato da Solaris è stato aggiunto in Linux 3.1 in base alla pagina man , così si potrebbe utilizzare anche quello. Le fiemap ioctlsembra essere più anziani, quindi potrebbe essere più portabile su diverse versioni di Linux, per ora, mentre lseekpotrebbe essere più portabile su sistemi operativi Solaris, se ha la stessa.


2
È possibile ottenere queste informazioni FIEMAP utilizzando l' --fibmapdel hdparmprogramma di utilità. Vedi il manuale
Totor

2

Esiste una raccolta di programmi Python chiamati sparseutils che usano SEEK_HOLEe SEEK_DATAper determinare quali sezioni del file sono rappresentate come buchi e quali sono dati. L'uso è abbastanza semplice. mksparsepuò essere utilizzato per generare un file sparse secondo un determinato layout.

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

Il sparsemapprogramma può essere utilizzato per stampare il layout su stdout:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

1

Dipende dal file system. Non credo che sia una chiamata, il che potrebbe essere il motivo per cui molti strumenti non gestiscono bene la copia di file sparsi. La catena di strumenti GNU utilizza la ricerca di grandi blocchi di zeri in quanto ciò consente loro di rimuovere blocchi allocati non utilizzati. Molti strumenti di copia convertiranno un file sparse in un file con tutti i blocchi assegnati.

Probabilmente dovrai aprire l'inode e analizzare il risultato. Il formato Inode dipende dal file system. Alcuni file system possono contenere parte dei dati nell'inode stesso.


1
Ci deve essere un modo agnostico per ottenere queste informazioni. Leggere direttamente dall'inode non è sicuramente un'opzione. Stavo cercando qualcosa di simile SEEK_DATAe SEEK_HOLEparametri per lseek(), come ci sono in Solaris: opensolarisforum.org/man/man2/lseek.html
Juliano

@Juliano Uno sguardo all'opzione lseek di Linux non ha queste opzioni. Solaris supporta pochissimi file system, quindi sarebbe relativamente facile da supportare. Linux supporta una vasta gamma di file system, alcuni dei quali non supportano file sparsi. Il supporto per SEEK_DATA / SEEK_HOLE imporrebbe il supporto nel codice per tutti i file system. Questi metodi potrebbero non fare ciò che ti aspetti. Vedi blogs.sun.com/bonwick/entry/seek_hole_and_seek_data per ulteriori dati dal lato Sun.
BillThor,

1
I filesystem non devono supportare nulla con l'interfaccia lseek (), il kernel autorizza i moduli del filesystem che supportano SEEK_DATA / SEEK_HOLE attraverso una proprietà module. Questo è nella manpage stessa e nel blog collegato: "Per i filesystem che non forniscono informazioni sui buchi, il file sarà rappresentato come un'intera area dati".
Juliano,

@Juliano richiede ancora le mod del kernel e le modifiche a lseek. Come per il blog, questa è una funzionalità abbastanza nuova in Sun. Perché funzioni anche il codice del file system deve essere modificato. Richiederebbe certamente modifiche a tutti i file system che supportano file sparsi per fornire gli hook del kernel.
BillThor,
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.