Di recente sulla mia scatola del server Linux, una delle partizioni del disco era piena e ha dovuto eliminare 100 MB di file di grandi dimensioni per liberare lo spazio. Dopo aver liberato lo spazio, la partizione continuava a mostrare pieno e nessuno spazio libero per salvare i miei file. Più tardi con mia sorpresa ho notato la disparità di seguito:
Il comando di utilizzo del disco (du) ha mostrato lo spazio utilizzato solo come 11G!
-bash-3.2# du -chs /myhome/ 11G /myhome/ 11G total -bash-3.2#
Il comando precedente non include file e directory di punti nascosti. Usa il comando seguente per trovare anche l'utilizzo del disco da parte di file e directory con punti nascosti.
-bash-3.2#du -sch .[!.]* /myhome/*
Se desideri ancora elencare i file esatti e i suoi percorsi assoluti, usa il comando seguente:
-bash-3.2# du -h -x /myhome/*
Ma il comando df mostrava come la partizione del disco /myhome/ era piena!!!
-bash-3.2$ df -h Filesystem Size Used Avail Use% Mounted on /dev/cciss/c0d0p8 20G 14G 4.7G 75% / /dev/cciss/c0d0p9 9.7G 1.3G 8.0G 14% /tmp /dev/cciss/c0d0p3 30G 4.3G 24G 16% /usr /dev/cciss/c0d0p10 44G 41G 0G 100% /myhome /dev/cciss/c0d0p6 30G 27G 670M 98% /var /dev/cciss/c0d0p5 30G 20G 8.0G 72% /opt /dev/cciss/c0d0p2 78G 21G 54G 28% /export /dev/cciss/c0d0p1 4.9G 173M 4.5G 4% /boot tmpfs 7.9G 0 7 .9G 0% /dev/shm tmpfs 491M 61M 431M 13% /var/lib/ganglia/rrds
Ora la sfida è scoprire dov'è lo spazio rimanente? È nascosto da qualche parte?
Utilizza il comando LSOF per trovare i file tenuti aperti
Potresti aver eliminato alcuni file, ma il processo sarebbe rimasto aperto. Fino a quando non chiudi quei file, lo spazio non verrà liberato. Sotto il comando "lsof" ti indicherà quali file eliminati sono ancora aperti!
-bash-3.2# /usr/sbin/lsof | grep deleted |grep /myhome java 10249 ramya 1u REG 104,10 45866276291 4645619 /myhome/var/container.log (deleted) java 10249 ramya 2u REG 104,10 45866276291 4645619 /myhome/var/container.log (deleted)
Ora avresti qualche indizio, vero? Sì, il file /myhome/var/container.log che è stato eliminato è ancora aperto dall'ID processo:10249. Ora vai alla directory dell'ID processo corrispondente in /proc come mostrato di seguito:
-bash-3.2# cd /proc/10249/fd/
Elenca i file per vedere il gestore di file che si collega al file eliminato.
-bash-3.2# ls -lrt | grep /myhome/ lrwx------ 1 ramya ramya 64 Feb 13 14:04 2 -> /myhome/var/container.log (deleted) lrwx------ 1 ramya ramya 64 Feb 13 14:04 1 -> /myhome/var/container.log (deleted)
Ora cancella il corrispondente gestore di file per liberare spazio usando il comando seguente:
-bash-3.2# cat /dev/null > /proc/10249/fd/1 -bash-3.2# cat /dev/null > /proc/10249/fd/2
Nota che l'inode sarebbe ancora aperto, ma ora ha una lunghezza pari a 0.
-bash-3.2# /usr/sbin/lsof | grep deleted |grep /myhome java 10249 ramya 1u REG 104,10 0 4645619 /myhome/var/container.log (deleted) java 10249 ramya 2u REG 104,10 0 4645619 /myhome/var/container.log (deleted)
Ora controlla la partizione del disco per avere un sorriso in faccia.
-bash-3.2# df -h |grep /myhome /dev/cciss/c0d0p10 44G 12G 30G 28% /myhome