Aggiungere numeri è facile. Il problema è che ci sono molti numeri diversi da aggiungere.
Quanto spazio su disco utilizza un file?
L'idea di base è che un file contenente n byte utilizza n byte di spazio su disco, oltre a un po 'per alcune informazioni di controllo: i metadati del file (autorizzazioni, timestamp, ecc.) E un po' di sovraccarico per le informazioni che il sistema deve trova dove è archiviato il file. Tuttavia ci sono molte complicazioni.
Complicazioni microscopiche
Pensa a ciascun file come a una serie di libri in una biblioteca. I file più piccoli compongono solo un volume, ma i file più grandi sono costituiti da molti volumi, come un'enciclopedia. Per poter individuare i file, esiste un catalogo di schede che fa riferimento a ogni volume. Ogni volume ha un po 'di sovraccarico a causa delle copertine. Se un file è molto piccolo, questo sovraccarico è relativamente grande. Anche il catalogo delle carte stesso occupa un po 'di spazio.
Andando un po 'più tecnico, in un tipico filesystem semplice, lo spazio è diviso in blocchi . Una dimensione tipica del blocco è 4KiB. Ogni file occupa un numero intero di blocchi. A meno che la dimensione del file non sia un multiplo della dimensione del blocco, l'ultimo blocco viene utilizzato solo parzialmente. Quindi un file da 1 byte e un file da 4096 byte occupano entrambi 1 blocco, mentre un file da 4097 byte occupa due blocchi. Puoi osservarlo con il du
comando: se il tuo filesystem ha una dimensione di blocco di 4KiB, du
segnalerà 4KiB per un file di 1 byte.
Se un file è di grandi dimensioni, sono necessari ulteriori blocchi solo per memorizzare l'elenco dei blocchi che compongono il file (si tratta di blocchi indiretti ; file system più sofisticati possono ottimizzare questo sotto forma di estensioni ). Quelli non vengono visualizzati nella dimensione del file come riportato da ls -l
o GNU du --apparent-size
; du
, che riporta l'utilizzo del disco rispetto alle dimensioni, li tiene conto.
Alcuni filesystem provano a riutilizzare lo spazio libero rimasto nell'ultimo blocco per comprimere più code di file nello stesso blocco . Alcuni filesystem (come ext4 dal Linux 3.8 usano 0 blocchi per piccoli file (solo pochi byte) che si adattano interamente all'inode.
Complicanze macroscopiche
Generalmente, come visto sopra, la dimensione totale riportata da du
è la somma delle dimensioni dei blocchi o delle estensioni utilizzate dal file.
La dimensione indicata da du
potrebbe essere inferiore se il file è compresso. I sistemi Unix supportano tradizionalmente una forma grezza di compressione: se un blocco di file contiene solo byte null, quindi invece di memorizzare un blocco di zero, il filesystem può omettere del tutto quel blocco. Un file con blocchi omessi come questo è chiamato un file sparse . I file sparsi non vengono creati automaticamente quando un file contiene una grande serie di byte null, l'applicazione deve disporre che il file diventi sparsa.
Alcuni filesystem come btrfs e zfs supportano la compressione generica .
Complicanze avanzate
Due caratteristiche principali di filesystem molto moderni come zfs e btrfs rendono la relazione tra dimensione del file e utilizzo del disco significativamente più distanti: istantanee e deduplicazione.
Le istantanee sono uno stato congelato del filesystem a una certa data. I filesystem che supportano questa funzione possono contenere più istantanee scattate in date diverse. Queste istantanee hanno spazio, ovviamente. Ad un estremo, se si eliminano tutti i file dalla versione attiva del filesystem, il filesystem non si svuoterà se restano delle istantanee.
Qualsiasi file o blocco che non è stato modificato dopo un'istantanea o tra due istantanee è stato identico nell'istantanea e nella versione attiva o altra istantanea. Questo è implementato tramite copia su scrittura . In alcuni casi limite, è possibile che l'eliminazione di un file su un file system completo non riesca a causa di spazio disponibile insufficiente, poiché la rimozione di quel file richiederebbe la creazione di una copia di un blocco nella directory e non c'è più spazio nemmeno per quel blocco.
La deduplicazione è una tecnica di ottimizzazione dell'archiviazione che consiste nell'evitare di archiviare blocchi identici. Con i dati tipici, la ricerca di duplicati non vale sempre la pena. Sia zfs che btrfs supportano la deduplicazione come funzionalità opzionale.
Perché il totale è du
diverso dalla somma delle dimensioni del file?
Come abbiamo visto sopra, la dimensione riportata da du
ogni file è normalmente la somma delle dimensioni dei blocchi o delle estensioni utilizzate dal file. Si noti che per impostazione predefinita, ls -l
elenca le dimensioni in byte, ma du
elenca le dimensioni in KiB o in unità (settori) da 512 byte su alcuni sistemi più tradizionali ( du -k
impone l'uso di kilobyte). La maggior parte dei moderni unice supporta ls -lh
e du -h
per usare numeri "leggibili dall'uomo" usando K, M, G, ecc. (Per KiB, MiB, GiB), a seconda dei casi.
Quando si esegue du
su una directory, riassume l'utilizzo del disco di tutti i file nella struttura di directory, comprese le directory stesse. Una directory contiene dati (i nomi dei file e un puntatore a dove si trovano i metadati del file), quindi ha bisogno di un po 'di spazio di archiviazione. Una piccola directory occuperà un blocco, una più grande richiederà più blocchi. La quantità di memoria utilizzata da una directory a volte dipende non solo dai file in essa contenuti, ma anche dall'ordine in cui sono stati inseriti e in cui alcuni file vengono rimossi (con alcuni filesystem, questo può lasciare buchi - un compromesso tra spazio su disco e prestazioni ), ma la differenza sarà minuscola (un blocco extra qua e là). Quando corrils -ld /some/directory
, sono elencate le dimensioni della directory. (Si noti che la riga "NNN totale" nella parte superiore dell'output da ls -l
è un numero non correlato, è la somma delle dimensioni in blocchi degli elementi elencati, espressa in KiB o settori.)
Tieni presente che du
include file dot che ls
non vengono visualizzati a meno che non utilizzi l' opzione -A
o -a
.
A volte du
riporta meno della somma prevista. Ciò accade se nella struttura della directory sono presenti collegamenti fissi: du
conta ogni file una sola volta.
Su alcuni file system come ZFS
su Linux, du
non riporta l'intero spazio su disco occupato dagli attributi estesi di un file.
Fai attenzione che se ci sono punti di montaggio in una directory, du
conteranno anche tutti i file su questi punti di montaggio, a meno che non sia data l' -x
opzione. Quindi se per esempio vuoi la dimensione totale dei file nel tuo filesystem di root, esegui du -x /
, no du /
.
Se un filesystem è montato su una directory non vuota , i file in quella directory sono nascosti dal filesystem montato. Occupano ancora il loro spazio, ma du
non li trovano.
File cancellati
Quando un file viene eliminato , ciò rimuove solo la voce della directory, non necessariamente il file stesso. Sono necessarie due condizioni per eliminare effettivamente un file e quindi recuperare il suo spazio su disco:
- Il conteggio dei collegamenti del file deve scendere a 0: se un file ha più collegamenti fissi, rimuoverne uno non influisce sugli altri.
- Finché il file è aperto da qualche processo, i dati rimangono. Solo quando tutti i processi hanno chiuso il file viene eliminato. L'output
fuser -m
o lsof
su un mount point include i processi che hanno un file aperto su quel file system, anche se il file viene eliminato.
- anche se nessun processo ha il file cancellato aperto, lo spazio del file potrebbe non essere recuperato se quel file è il backend di un
loop
dispositivo. losetup -a
(as root
) può dirti quali loop
dispositivi sono attualmente impostati e su quale file. Il dispositivo loop deve essere distrutto (con losetup -d
) prima di poter recuperare lo spazio su disco.
Se si elimina un file in alcuni file manager o ambienti GUI, potrebbe essere inserito in un cestino in cui può essere rimosso. Finché il file può essere cancellato, il suo spazio è comunque esaurito.
Quali sono df
esattamente questi numeri ?
Un tipico filesystem contiene:
- Blocchi contenenti dati di file (comprese le directory) e alcuni metadati (inclusi blocchi indiretti e attributi estesi su alcuni filesystem).
- Blocchi gratuiti.
- Blocchi riservati all'utente root.
- superblock e altre informazioni di controllo.
- inodes
- Un diario
Viene segnalato solo il primo tipo du
. Quando si tratta di df
, ciò che va nelle colonne "usato", "disponibile" e totale dipende dal filesystem (ovviamente i blocchi usati (compresi quelli indiretti) sono sempre nella colonna "usato", e i blocchi non utilizzati sono sempre nella " disponibile "colonna).
I filesystem in ext2 / ext3 / ext4 riservano il 5% dello spazio all'utente root. Ciò è utile sul filesystem di root, per mantenere attivo il sistema se si riempie (in particolare per la registrazione e per consentire all'amministratore di sistema di memorizzare un po 'di dati mentre risolve il problema). Anche per partizioni di dati come /home
, mantenere lo spazio riservato è utile perché un filesystem quasi completo è soggetto a frammentazione. Linux cerca di evitare la frammentazione (che rallenta l'accesso ai file, specialmente su dispositivi meccanici rotanti come i dischi rigidi) pre-allocando molti blocchi consecutivi durante la scrittura di un file, ma se non ci sono molti blocchi consecutivi, che non possono funzionare .
I filesystem tradizionali, fino a ext4 incluso ma non btrfs, riservano un numero fisso di inode quando viene creato il filesystem. Ciò semplifica in modo significativo la progettazione del filesystem, ma ha il rovescio della medaglia che il numero di inode deve essere dimensionato correttamente: con troppi inode, lo spazio viene sprecato; con troppi inode, il filesystem potrebbe esaurire gli inode prima di rimanere senza spazio. Il comando df -i
riporta quanti inode sono in uso e quanti sono disponibili (i file system in cui il concetto non è applicabile possono riportare 0).
L'esecuzione tune2fs -l
sul volume contenente un filesystem ext2 / ext3 / ext4 riporta alcune statistiche tra cui il numero totale e il numero di inode e blocchi liberi.
Un'altra caratteristica che può confondere la materia sono i sottovolumi (supportati in btrfs e in zfs nei set di dati del nome ). Più volumi secondari condividono lo stesso spazio, ma hanno radici dell'albero delle directory separate.
Se un filesystem è montato sulla rete (NFS, Samba, ecc.) E il server esporta una parte di quel filesystem (ad es. Il server ha un /home
filesystem ed esporta/home/bob
), allora df
su un client riflette i dati per l'intero filesystem, non solo per la parte che viene esportata e montata sul client.
Cosa sta usando lo spazio sul mio disco?
Come abbiamo visto sopra, la dimensione totale riportata da df
non tiene sempre conto di tutti i dati di controllo del filesystem. Usa strumenti specifici del filesystem per ottenere la dimensione esatta del filesystem se necessario. Ad esempio, con ext2 / ext3 / ext4, eseguire tune2fs -l
e moltiplicare la dimensione del blocco per il conteggio dei blocchi.
Quando si crea un filesystem, normalmente riempie lo spazio disponibile sulla partizione o sul volume che lo racchiude. A volte potresti finire con un filesystem più piccolo quando hai spostato i filesystem o ridimensionato i volumi.
Su Linux, lsblk
presenta una bella panoramica dei volumi di archiviazione disponibili. Per ulteriori informazioni o in caso contrario lsblk
, utilizzare strumenti di gestione dei volumi o di partizionamento specializzati per verificare quali partizioni sono disponibili. Su Linux, c'è lvs
, vgs
, pvs
per LVM , fdisk
per i tradizionali PC-style ( “MBR”) partizioni (così come GPT su sistemi più recenti), gdisk
per GPT partizioni, disklabel
per disklabels BSD, Parted , ecc sotto Linux, cat /proc/partitions
dà un breve riassunto. Le installazioni tipiche hanno almeno due partizioni o volumi usati dal sistema operativo: un filesystem (a volte di più) e un volume di scambio .
Alcuni computer hanno una partizione contenente il BIOS o altri software diagnostici. I computer con UEFI hanno una partizione di bootloader dedicata.
Infine, nota che la maggior parte dei programmi per computer utilizza unità basate su potenze di 1024 = 2 10 (perché i programmatori adorano il binario e potenze di 2). Quindi 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B, ... Ufficialmente, queste unità sono conosciute come kibibyte KiB, mebibyte MiB, ecc., Ma la maggior parte dei software riporta solo k o kB, M o MB, ecc. D'altra parte, i produttori di dischi rigidi usano sistematicamente la metrica (unità basate su 1000). Pertanto, l'unità da 1 TB è solo 931 GiB o 0,904 TiB.
tune2fs
richiede di avere accesso in lettura al dispositivo a blocchi che contiene il filesystem, che in generale richiede di essere root poiché consente di leggere il contenuto di qualsiasi file.