|
Contact me sending an e-mail (antispam defense activated) |
Title: Determinare lo spazio libero sul disco
Author: Sandro Tosi
Last modified: 2004-12-12 (2004-11-10) (2004-11-03)
Tenere sotto controllo lo spazio utilizzato sul proprio hard disk e`
un'attivita` importante sia per l'amministratore del sistema che per
l'utente medio. Gli strumenti che Linux mette a disposizione servono
due categorie:
o Utilizzo dei filesystem
Il comando da utilizzare e` ``df''.
Il risultati ottenuti, a volte, potrebbero essere di difficile
interpretazione (spazio mancante), magari a filesystem appena
creato. Si ricordi che ext3 occupa circa 30 Mb per il file di
journal, che non viene conteggiato nello spazio occupato ma che
viene sottratto dallo spazio disponibile. Inoltre, parte dello
spazio viene occupato da inode e superblock (circa il 5%, di
default), definiti in fase di formattazione.
o Utilizzo di una directory
Il comando da utilizzare e` ``du'', il quale stima lo spazio
occupato da una directory.
Lanciando questo comando dalla propria home, per esempio, avremo un
elenco di tutte le directory nell'albero della home, in maniera
ricorsiva, con a sinistra la dimensione occupata sul disco in
blocchi da 1k.
Spesso, invece, vogliamo sapere la dimensione di un interno tree di
directory. Per fare questo possiamo utilizzare:
# du -hs <dir_to_size>
dove si e` anche utilizzato il flag ``-h'', che restituisce la
dimensione in formato ``human-readable''.
Anomalie
========
o Lo spazio disponibile e` ancora elevato, eppure non e` possibile
creare altri file in una directory.
Non e` un problema di limite di file in una directory, ma e`
possibile che siano finiti i descrittori dei file; tramite
# df -i <filesystem>
e` possibile avere informazioni riguardo agli inode del filesystem
o il comando ``df'' indica la partizione come piena ma invece ``du''
indica la presenza di spazio libero.
Theodor Ts'o (sviluppatore di ext2) indica la causa classica come
dovuta ad un processo utente che tiene aperto un file cancellato.
Quando questo succede, ``du'' non mostra lo spazio utilizzato da
quel file, in quanto il file non e` piu` visibile nell'albero della
directory ma lo spazio risulta ancora utilizzato dal file finche`
non verra` deallocato, e questo succedera` solo quando l'ultimo
processo che aveva aperto il file chiudera` il suo file descriptor
aperto verso di esso.
Utilizzando ``lsof'' e` possibile trovare quale processo tiene
aperto questo file, solitamente un file di log che viene ruotato ma
che qualche vecchio processo continua a tenere aperto.
Entriamo maggiormente in dettaglio a questo problema. Una domanda
lecita e` ``Com'e` possibile rimuovere un file ancora
utilizzato?''. Questo viene fatto utilizzando la funzione di
sistema ``unlink''.
Unlink rimuove il file specificato come parametro. Se il codice e`
scritto male, come questo:
<c_source_code start>
fd = open("path/name", O_CREAT);
unlink( "path/name");
<c_source_code stop>
e cioe` se il file viene rimosso senza aver ancora chiuso il file
descriptor (fd) ad esso riferito, per quell'applicazione sara`
ancora possibile utilizzare quel file.
Questo significa che l'entry di quel file nella directory non c'e`
piu`, ma che tutte le risorse occupate (inode, blocchi) restano
tali fino a che non viene chiuso fd.
( Modificando il codice sorgente e` possibile ottenere un metodo
semplice per un "file system full":
<c_source_code start>
fd = open("path/name", O_CREAT);
unlink( "path/name");
while (1)
write(fd, ...);
<c_source_ode stop>
senza sapere chi ringraziare... ) |