Dein Letzter Beitrag über Inodes hat mir nicht geholfen. Ich habe einige Dateien gelöscht und angeblich ist mein Filesystem immer noch voll.
Auch das kann leider passieren. Und zwar dann, wenn ein Prozess eine gelöschte Datei noch im Zugriff hat.
Ich versuche das ganze mal hier zu verdeutlichen.
1 2 3 |
[root@mail blog]# df -h . Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/mapper/server-test 1,9G 1,5G 311M 83% /blog |
Wie wir sehen, habe ich derzeit 1.5GB in Benutzung. Jetzt löschen wir einmal die Datei und sehen was passiert.
1 2 3 4 |
[root@mail blog]# rm -f linuxmint-17.1-xfce-64bit.iso [root@mail blog]# df -h . Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/mapper/server-test 1,9G 1,5G 311M 83% /blog |
Mist, ich habe ja immernoch 1.5GB Speicher belegt… Mal gucken wo das herkommen kann…
1 2 |
[root@mail blog]# du -sh * 16K lost+found |
Mit “du” (disk usage) können wir uns anzeigen lassen, welche Dateien wie viel Platz auf der Festplatte benötigen.
-s fasst dabei alle Verzeichnisse zusammen
-h wie bereits von df bekannt, macht es die Ausgabe für uns einfacher zu lesen.
Offensichtlich haben wir auf dem Filesystem nur 16K belegt… Trotzdem behauptet “df” wir hätten 1,5GB belegt. Ist “df” etwa verbuggt und zeigt einfach nur Müll an?
Nein, beide Tools zeigen genau das an, was die Entwickler sich vorgestellt haben. Beide Tools haben “recht”.
“df” Zeigt die Speicherbelegung im Filesystem an. Dort sind noch immer tatsächlich 1.5GB belegt.
“du” Zeigt die Speicherbelegung auf der Festplatte an. Hier sind die 1.5GB schon freigegeben worden.
Wie kann ich die “freien” 1,5GB denn nun auch wieder nutzen?
Hier kommt die unterschiedliche Handhabung von geöffneten Dateien zwischen Linux (und vermutlich auch Unix, das kann ich aber nicht beurteilen) und Windows zum vorschein.
Hätten wir unter Windows versucht die Datei zu löschen, während ein anderes Programm auf diese Datei zugreift, hätten wir folgende Fehlermeldung erhalten:
Unter Linux können wir die Datei trotzdem Löschen. Hierbei wird vorerst nicht die Komplette Datei gelöscht sondern erst der Inode. Neue Prozesse können also NICHT mehr auf diese Datei zugreifen. Um ein unvorhersehbares verhalten der Programme welche die Datei allerdings geöffnet haben zu vermeiden, wird es diesen Programmen weiterhin erlaubt die Datei zu nutzen.
Woher weiß ich denn, ob ich solche noch geöffneten Dateien habe?
Mit “lsof” (list open files) können wir uns alle derzeit geöffneten Dateien anzeigen lassen. Das kann aber unter Umständen recht viel werden (Auf meinem System derzeit gut 33.000 Dateien)
Also filtern wir mit “grep” nach dem Text “deleted” denn so stellt lsof Dateien dar, welche bereits gelöscht, aber noch immer geöffnet sind.
1 2 3 4 5 6 7 8 9 |
[root@mail blog]# lsof | grep deleted php-fpm 3267 nginx 3u REG 9,2 0 23593179 /tmp/.ZendSem.fIZeVS (deleted) php-fpm 3268 nginx 3u REG 9,2 0 23593179 /tmp/.ZendSem.fIZeVS (deleted) php-fpm 3269 nginx 3u REG 9,2 0 23593179 /tmp/.ZendSem.fIZeVS (deleted) php-fpm 3270 nginx 3u REG 9,2 0 23593179 /tmp/.ZendSem.fIZeVS (deleted) php-fpm 3271 nginx 3u REG 9,2 0 23593179 /tmp/.ZendSem.fIZeVS (deleted) php-fpm 3272 nginx 3u REG 9,2 0 23593179 /tmp/.ZendSem.fIZeVS (deleted) imap-logi 25532 dovenull 4u REG 0,18 0 31403 /run/dovecot/login-master-notify0cd4a42028410cd3 (deleted) less 26577 root 4r REG 253,5 1560281088 12 /blog/linuxmint-17.1-xfce-64bit.iso (deleted) |
Haben wir ein eigenes FIlesystem auf dem wir nach offenen Dateien suchen wollen, können wir “lsof” dies auch als Parameter mitgeben.
1 2 3 4 5 6 7 8 |
[root@mail blog]# lsof /blog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 9006 root cwd DIR 253,5 4096 2 /blog bash 24590 root cwd DIR 253,5 4096 2 /blog less 26577 root cwd DIR 253,5 4096 2 /blog less 26577 root 4r REG 253,5 1560281088 12 /blog/linuxmint-17.1-xfce-64bit.iso (deleted) lsof 27735 root cwd DIR 253,5 4096 2 /blog lsof 27736 root cwd DIR 253,5 4096 2 /blog |
Wenn wir nun den Prozess (in diesem Fall ein “less”) Beenden, wird der von uns vermisste Speicherplatz auch direkt wieder freigegeben.
1 2 3 4 |
[root@mail blog]# kill 26577 [root@mail blog]# df -h . Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/mapper/server-test 1,9G 1,6M 1,8G 1% /blog |
So einfach kann es sein seinen geliebten und teuren Speicherplatz wieder frei zu bekommen.