Perché ci sono tanti modi diversi per misurare l'utilizzo del disco?


114

Quando riassumo le dimensioni dei miei file, ottengo una cifra. Se corro du, ottengo un'altra figura. Se corro dusu tutti i file sulla mia partizione, non corrisponde a ciò dfche viene utilizzato. Perché ci sono così tante figure diverse per la dimensione totale dei miei file? I computer non possono aggiungere?

A proposito di aggiungere: quando aggiungo le colonne "Usato" e "Disponibile" di df, non ottengo la cifra totale. E quella cifra totale è più piccola della dimensione della mia partizione. E se aggiungo le dimensioni della mia partizione non ottengo le dimensioni del mio disco! Cosa dà?

Risposte:


144

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 ducomando: se il tuo filesystem ha una dimensione di blocco di 4KiB, dusegnalerà 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 -lo 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 dupotrebbe 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 è dudiverso dalla somma delle dimensioni del file?

Come abbiamo visto sopra, la dimensione riportata da duogni file è normalmente la somma delle dimensioni dei blocchi o delle estensioni utilizzate dal file. Si noti che per impostazione predefinita, ls -lelenca le dimensioni in byte, ma duelenca le dimensioni in KiB o in unità (settori) da 512 byte su alcuni sistemi più tradizionali ( du -kimpone l'uso di kilobyte). La maggior parte dei moderni unice supporta ls -lhe du -hper usare numeri "leggibili dall'uomo" usando K, M, G, ecc. (Per KiB, MiB, GiB), a seconda dei casi.

Quando si esegue dusu 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 duinclude file dot che lsnon vengono visualizzati a meno che non utilizzi l' opzione -Ao -a.

A volte duriporta meno della somma prevista. Ciò accade se nella struttura della directory sono presenti collegamenti fissi: duconta ogni file una sola volta.

Su alcuni file system come ZFSsu Linux, dunon 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, duconteranno anche tutti i file su questi punti di montaggio, a meno che non sia data l' -xopzione. 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 dunon 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 -mo lsofsu 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 loopdispositivo. losetup -a(as root) può dirti quali loopdispositivi 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 dfesattamente 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 -iriporta quanti inode sono in uso e quanti sono disponibili (i file system in cui il concetto non è applicabile possono riportare 0).

L'esecuzione tune2fs -lsul 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 /homefilesystem ed esporta/home/bob ), allora dfsu 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 dfnon 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 -le 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, lsblkpresenta 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, pvsper LVM , fdiskper i tradizionali PC-style ( “MBR”) partizioni (così come GPT su sistemi più recenti), gdiskper GPT partizioni, disklabelper disklabels BSD, Parted , ecc sotto Linux, cat /proc/partitionsdà 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.


1
@Kiwy tune2fsrichiede 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.
Gilles,

21
So che "grazie" è scoraggiato a SE, ma Gilles ti meriti un enorme "Grazie" per questo fantastico post.
dotancohen,

1
Ricordo di aver visto un catalogo di carte quando avevo 6 anni. Mi chiedo quanti non sapranno cosa sono?
Izkata,

1
@ illuminÉ Questo è Solaris troppo avanzato per me, non so a che livello si adatta.
Gilles,

1
du tiene conto dei blocchi indiretti. Questa è la differenza principale rispetto alla dimensione del file come riportato da ls -l.
Stéphane Chazelas,

4

Un breve riassunto delle complicazioni nel calcolo delle dimensioni dei file e degli spazi su disco:

  • Lo spazio che il file occupa su disco è un moltiplicatore del numero di blocchi necessari per la dimensione di ciascun blocco + il numero di inode necessari. Un file lungo 1 byte richiederà almeno 1 blocco, 1 inode e una voce di directory.

    Ma potrebbe richiedere solo 1 voce di directory aggiuntiva se il file è un collegamento reale a un altro file. Sarebbe solo un altro riferimento allo stesso insieme di blocchi.

  • La dimensione del contenuto del file. Questo è ciò che viene lsvisualizzato.
  • Lo spazio libero su disco non è la dimensione del file più grande in cui è possibile inserirsi o la somma di tutte le dimensioni del contenuto del file che si adatteranno al disco. È da qualche parte nel mezzo. Dipende dal numero di file (prendendo inode) la dimensione del blocco e da quanto il contenuto di ciascun file riempie completamente i blocchi.

Questo sta solo graffiando la superficie dei file system ed è eccessivamente semplificato. Ricorda inoltre che file system diversi funzionano in modo diverso.

statè molto utile per individuare alcune di queste informazioni. Ecco alcuni esempi su come usare stat e su cosa serve: http://landoflinux.com/linux_stat_command_examples.html


1
Un file a 1 byte richiederebbe in genere un blocco, non 8. La creazione di un collegamento reale non crea affatto un inode: un file è un inode, indipendentemente dal numero di collegamenti al file. La creazione di un collegamento reale richiede solo spazio per la voce della directory.
Gilles,

Grazie per le correzioni, devo ammettere che ricordo: studiare approfonditamente ext2 ora è un po 'confuso. Stavo seguendo l'output di stat re: il conteggio dei blocchi - sembrava eccessivo ma è quello che c'è. Correggerò la risposta.
Pedro,

1
Questo perché 1 blocco ext2 = 8 blocchi stat, se il filesystem ext2 utilizza blocchi da 4kB: stat conta in blocchi da 512 byte per motivi storici. Vedi unix.stackexchange.com/questions/14409/…
Gilles

3

Illustrerò qui diversi casi che causano la dudifferenza df.

dfconta i blocchi allocati del file system, duutilizza le informazioni sulla dimensione di ciascun file. Una differenza può avere molte cause:

1) File non collegati (eliminati) che sono ancora aperti dall'applicazione. Le informazioni sul file mancano, il blocco è ancora allocato. lsof +aL1 <filesystem>volontà ti aiuta a identificare i processi. Il più delle volte è necessario interrompere i processi per liberare spazio (dipende dal processo, a volte è sufficiente un ricaricamento della configurazione).

2) File sotto i punti di mount nascosti duma non per df. debugfscan ti aiuta a leggere il filesystem.

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3) File sparsi che sembrano più grandi della realtà. i blocchi non allocati non vengono conteggiati da dfma viene conteggiata la dimensione del file apparente du.

Nota che i collegamenti reali non fanno gli sciocchi du


3

dfviene generalmente utilizzato per vedere quali sono i file system, quanto sono pieni ciascuno e dove sono montati. Molto utile quando si sta esaurendo lo spazio in un file system e forse si desidera spostare le cose tra i file system o acquistare un disco più grande, ecc.

dumostra i dettagli di quanta memoria cumulativa sta consumando ciascuna delle proprie directory (un po 'come windirstatin Windows). Ottimo per trovare dove stai recuperando spazio quando si tenta di eseguire la pulizia dei file.

A parte piccole differenze numeriche spiegate da altri, che la due dfutilità hanno scopi molto diversi.

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.