Un file può essere salvato non in sequenza su disco? Voglio dire, parte del file si trova sotto l'indirizzo fisico X e l'altra parte sotto l'indirizzo fisico Y che non è vicino a X + offset).
Sì; questo è noto come frammentazione dei file e non è raro, specialmente con file più grandi. La maggior parte dei file system alloca lo spazio in base alle necessità, più o meno in sequenza, ma non può indovinare il comportamento futuro, quindi se scrivi 200 MiB in un file, quindi aggiungi altri 100 MiB, c'è una possibilità diversa da zero che entrambi i set di dati lo facciano essere memorizzate in diverse aree del disco (in pratica, qualsiasi altra scrittura che necessiti di più spazio su disco, che si verifica dopo la prima scrittura e prima della seconda, potrebbe trovarsi tra le due). Se un filesystem è quasi pieno, la situazione sarà solitamente peggiore:potrebbe non esserci un'area contigua di spazio libero abbastanza grande da contenere un nuovo file, quindi dovrà essere frammentato.
Posso in qualche modo controllare la sequenzialità dei file? Voglio allocare file di grandi dimensioni da 10 GB. Voglio che sia sequenziale nel disco e non diviso tra diversi offset.
Puoi comunicare al filesystem la dimensione di destinazione del tuo file quando viene creato; questo aiuterà il filesystem a memorizzarlo in modo ottimale. Molti filesystem moderni utilizzano una tecnica nota come allocazione ritardata, in cui il layout su disco di un nuovo file viene calcolato il più tardi possibile, per massimizzare le informazioni disponibili quando viene eseguito il calcolo. Puoi aiutare questo processo usando il posix_fallocate(3)
funzione per dire al filesystem quanto spazio su disco deve essere allocato in totale. I filesystem moderni cercheranno di eseguire questa allocazione in sequenza.
Agisce in modo diverso tra i diversi tipi?
Diversi filesystem si comportano in modo diverso, sì. I file system basati su log come NILFS2 non allocano l'archiviazione nello stesso modo dei file system basati su extent come Ext4, e questo è solo un esempio di variazione.
Il comando filefrag
ti dirà come il tuo file è archiviato fisicamente sul tuo dispositivo:
# filefrag -v /var/log/messages.1
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 2130567 1
1 1 15907576 2130568 1
2 2 15910400 15907577 1
3 3 15902720 15910401 7
4 10 2838546 15902727 1 eof
/var/log/messages.1: 5 extents found
Se scrivi il tuo file in un solo passaggio, la mia ipotesi è che il tuo file non sarà frammentato.
La pagina man di fallocate
(1) è abbastanza chiaro :
fallocate
viene utilizzato per preallocare i blocchi a un file. Per i filesystem che supportano ilfallocate
chiamata di sistema, questo viene fatto rapidamente allocando i blocchi e contrassegnandoli come non inizializzati, non richiedendo IO ai blocchi di dati. Questo è molto più veloce che creare un file riempiendolo di zeri.A partire dal kernel Linux v2.6.31, il
fallocate
la chiamata di sistema è supportata dai filesystem btrfs, ext4, ocfs2 e xfs.
è sequenziale? Il sistema proverà prima ad allocare i blocchi in sequenza. In caso contrario, non ti avviserà.
Hai menzionato file sparsi e nessuna delle altre risposte li ha menzionati.
La maggior parte dei file non sono sparsi. Il modo più comune per creare un file è scriverlo tutto in una volta, dall'inizio alla fine. Nessun buco lì.
Tuttavia, puoi dire "vai alla posizione 1.000.000.000.000 e scrivi un byte lì". Questo creerà un file che sembra grande un etabyte, ma in realtà utilizza solo (probabilmente) 4k su disco. Questo è un file sparse.
Puoi farlo molte volte per lo stesso file, lasciando piccole quantità di dati sparsi nel vasto vuoto.
Anche se questo può essere utile, ci sono due aspetti negativi.
Il primo è che il file sarà frammentato, che è quello che ti preoccupa.
Il secondo è che non tutti i programmi gestiscono bene questi file. Per esempio. alcuni software di backup proveranno a eseguire il backup del vuoto e quindi a creare un backup molto più grande del necessario, forse troppo grande per il supporto di backup.