"du -hc" VS "df -h"

sammy2ooo

voll Tohuwabohu
Da mir eben mein syslog überlief von wegen /var system full... hab ich mir /var mal genau angeschaut. kann mir das mit meiner /var partition jemand erklären? finde es seltsam das mir df angibt es wären 41M in gebrauch, wechsel in nach /var und tipp ein du gibt er mir an die daten in var würden 2.2MB belegen. WTF?

sammy@uranos sammy $ df -hc
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 248M 58M 170M 26% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1e 248M 42K 228M 0% /tmp
/dev/ad0s1f 110G 97G 3.6G 96% /usr
/dev/ad0s1d 248M 41M 187M 18% /var
linprocfs 4.0K 4.0K 0B 100% /usr/compat/linux/proc
total 110G 97G 4.2G 96%

sammy@uranos var $ sudo du -h
Password:
2.0K ./.snap
2.0K ./account
2.0K ./at/jobs
2.0K ./at/spool
6.0K ./at
12K ./backups
4.0K ./crash
2.0K ./cron/tabs
4.0K ./cron
2.0K ./empty
2.0K ./heimdal
2.0K ./log/cups
518K ./log
2.0K ./mail
4.0K ./msgs
2.0K ./named/dev
2.0K ./named/etc/namedb/master
2.0K ./named/etc/namedb/slave
20K ./named/etc/namedb
22K ./named/etc
2.0K ./named/var/dump
2.0K ./named/var/log
2.0K ./named/var/run/named
4.0K ./named/var/run
2.0K ./named/var/stats
12K ./named/var
38K ./named
2.0K ./preserve
2.0K ./run/named
2.0K ./run/ppp
2.0K ./run/sudo/sammy
4.0K ./run/sudo
34K ./run
2.0K ./rwho
2.0K ./spool/lock
8.0K ./spool/lpd/kyocera
10K ./spool/lpd
2.0K ./spool/mqueue
2.0K ./spool/opielocks
2.0K ./spool/output/lpd
6.0K ./spool/output
1.0M ./spool/clientmqueue
2.0K ./spool/cups/tmp
4.0K ./spool/cups
2.0K ./spool/samba
1.1M ./spool
2.0K ./tmp/vi.recover
2.0K ./tmp/orbit-root
468K ./tmp/kdecache-sammy
2.0K ./tmp/gconfd-root
492K ./tmp
20K ./yp
2.0K ./games
2.0K ./lib/kdm
2.0K ./lib/rpm
6.0K ./lib
2.2M .
sammy@uranos var $ pwd
/var
:confused:
 
deine inodes sind evt. aufgebraucht. hab ich bei sowas jdenfalls schon als erklärung gehört, konnte allerdings noch nicht in erfahrung bringen, was das bedeutet :>
 
sammy2ooo said:
Da mir eben mein syslog überlief von wegen /var system full... hab ich mir /var mal genau angeschaut. kann mir das mit meiner /var partition jemand erklären? finde es seltsam das mir df angibt es wären 41M in gebrauch, wechsel in nach /var und tipp ein du gibt er mir an die daten in var würden 2.2MB belegen. WTF?
df berechnet den belegten Platz in der Partition, du berechnet den mit Filenamen erreichbaren Platz. Das ist ein gewaltiger Unterschied.
Einige Programme legen z.B. temporär große Dateien an, öffnen diese und löschen sie sofort wieder. Ergebnis ist, daß die Datei zwar noch Plattenplatz belegt, jedoch keinen Dateinamen mehr hat. Diese Datei wird von df mitgerechnet, du hingegen findet sie nicht.
 
Das sollte man vielleicht noch ein wenig erlaeutern. Man spricht eigentlich nicht von "Dateien", sondern von "Inodes" und Links auf diese Inodes. Davon gibt es grob gesagt zwei Stueck. Zum einen "Namen", so verweist der Name "/" zB immer auf Inode #2, der Name
/boot verweist bei mir auf Inode #24778.

Jede Inode hat einen Referenz-Zaehler. Faellt dieser Zaehler auf 0, wird die Inode geloescht/recycelt und der Platz der belegten Bloeck steht wieder zur Verfuegung.

Wie wir alle wissen, ist ein sog. hard link nichts anderes als ein zweiter Link/Name fuer eine gewisse Inode. (Bitte mal mit ls -i und ln rumspielen :)

Der Referenz-Zaehler wird aber auch bei jedem open(2) erhoeht. D.h. wenn ein Prozess einen "Namen" oeffnet, dann ist dieser Zaehler mindestens bei 2. Loesche ich jetzt alle Verzeichniseintraege, die auf diese Inode verweisen mit rm(1), wird der Zaehler jedesmal dekrementiert. Gibt es nur einen Namen, dann faellt er von 2 auf 1. Aber eben nicht auf 0. Der Prozess haelt also immer noch die Inode geoeffnet. Erst wenn der Prozess einen close(2) ausfuehrt, wird der Zaehler letzten Endes auf 0 gesetzt und die Inode freigegeben.

Also, Prozess legt eine Datei/Link an (freie Inode wird gesucht und belegt, Zaehler 1). Oeffnet die Datei/Inode (Zaehler 2), loescht den Namen/Link auf diese Inode (Zaehler 1).
Jetzt gibt es fuer diese Inode keinen Namen mehr, und niemand ausser dem Prozess kann die "Datei" ansprechen, du(1) kann sie also nicht finden.

Summa summarum: Verwenden fstat/lsof um zu sehen, welcher Prozess auf /var grosse "Dateien" geoeffnet haelt. Gibt es keinen derartigen Prozess, dann solltest du mal fsck ueber /var laufen lassen.
 
Back
Top