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... ) |