Betelt a lemez, de a du nem mutatja, mi foglalja: mi lehet az oka?

Előfordul, hogy a df -h szerint a lemez tele van (vagy majdnem tele), a du paranccsal összeadott mappaméretek viszont jóval kevesebbet mutatnak, és nem található, mi foglalja a hiányzó helyet. A két parancs használatáról a Hogyan ellenőrizhető a lemezhasználat Linux szerveren (du és df parancsok)? cikk szól. Az eltérésnek néhány tipikus oka van; ezeket érdemes sorban végignézni.

1. Törölt, de még nyitott fájlok

A leggyakoribb ok: egy nagy fájlt (jellemzően naplófájlt) törölt, de egy futó program (webszerver, adatbázis, PHP folyamat) még nyitva tartja. Linuxon a fájl tartalma ilyenkor nem szabadul fel, amíg a program be nem zárja: a fájl már nem látszik a könyvtárban, így a du sem számolja, a df szerint viszont továbbra is foglalja a helyet.

A törölt, de nyitott fájlok listája:

sudo lsof +L1

vagy, ha az lsof nincs telepítve (sudo dnf install lsof / sudo apt install lsof):

sudo find /proc/*/fd -ls 2>/dev/null | grep '(deleted)'

Egy jellemző kimenet:

COMMAND   PID   USER   FD   TYPE DEVICE    SIZE/OFF NLINK  NODE NAME
httpd    1234 apache    2w   REG  253,0 8589934592     0 13371 /var/log/httpd/error_log (deleted)

A COMMAND oszlop mutatja a programot, a SIZE/OFF a fájl méretét bájtban. A hely felszabadításához indítsa újra az érintett szolgáltatást:

sudo systemctl restart httpd

Ha a szolgáltatást nem lehet újraindítani, a fájl tartalma a folyamat fájlleíróján keresztül is kiüríthető. A PID és az FD oszlop számából (a betű nélkül, a fenti példában 1234 és 2):

sudo truncate -s 0 /proc/1234/fd/2

Hogyan kerülheti el legközelebb?

Egy használatban lévő naplófájlt ne törölje (rm), hanem ürítse ki:

sudo truncate -s 0 /var/log/httpd/error_log

Így a program tovább írhatja, és a hely azonnal felszabadul. A nagy naplófájlok megkereséséről: Hogyan találd meg és távolítsd el a nagy error_log fájlokat Linux alatt.

2. Elfogytak az inode-ok

Ha a „No space left on device” hiba ellenére a df -h szerint van szabad hely, a fájlrendszeren a fájlok száma érhette el a korlátot. Ezt a -i kapcsoló mutatja:

df -i

Ha az IUse% oszlop 100%-hoz közeli, rengeteg apró fájl van a lemezen, jellemzően munkamenet-fájlok (sessions), gyorsítótár vagy kézbesítetlen levelek. Hogy melyik könyvtárban van a legtöbb fájl:

sudo du --inodes -x / 2>/dev/null | sort -n | tail -n 20

Az inode fogalmáról a Mit jelent egy inode? cikkben olvashat.

3. A root számára fenntartott hely (ext4)

Az ext4 fájlrendszer alapértelmezésként a hely 5%-át a root felhasználónak tartja fenn, hogy a rendszer akkor is működőképes maradjon, ha a felhasználók megtöltötték a lemezt. Ezért a df szerinti Used és Avail összege kisebb a Size értékénél, és egy normál felhasználó már akkor „tele” lemezt lát, amikor a root még tud írni.

Adatlemezen (nem a rendszerlemezen) a fenntartott hely csökkenthető, például 1%-ra:

sudo tune2fs -m 1 /dev/vdb1

Az XFS fájlrendszer (AlmaLinux, Rocky Linux alapértelmezése) nem tart fenn ilyen helyet.

4. Csatolási pont alatt eltakart fájlok

Ha egy könyvtárba (például /mnt/data vagy /home) egy másik lemezt csatolt, a könyvtárban korábban lévő fájlokat a csatolt lemez eltakarja: a du nem látja őket, de a rendszerlemezen helyet foglalnak. Ez jellemzően akkor fordul elő, ha a második lemez egy újraindítás után nem csatolódott fel, és közben a programok a rendszerlemezre írtak.

Az eltakart fájlok úgy tekinthetők meg, hogy a gyökér-fájlrendszert egy másik helyre is felcsatolja:

sudo mkdir /mnt/rootfs
sudo mount --bind / /mnt/rootfs
sudo du -sh /mnt/rootfs/mnt/data

Ha itt adatot talál, helyezze át a csatolt lemezre, majd bontsa a kötést:

sudo umount /mnt/rootfs

5. Egyéb okok

  • A systemd napló: a journalctl --disk-usage paranccsal ellenőrizhető, és a journalctl --vacuum-size=500M paranccsal csökkenthető (lásd: Naplófájlok olvasása Linuxon).
  • Régi kernelek és a csomagkezelő gyorsítótára: sudo dnf clean all vagy sudo apt clean és sudo apt autoremove.
  • Docker: a nem használt képek és konténerek a /var/lib/docker alatt sok helyet foglalhatnak; a docker system df mutatja, a docker system prune takarítja.
  • Adatbázis bináris naplók: a MariaDB/MySQL replikációs naplói (binlog) korlátlanul nőhetnek, ha nincs beállítva lejárati idejük.

Ha a hely tartósan kevés, a lemez bővíthető (lásd: Hogyan bővíthetem VPS csomagom erőforrásait? és Hogyan növelhetem meg a fájlrendszert a VPS lemezének bővítése után?).