Vraag df in linux geeft niet de correcte vrije ruimte weer na het verwijderen van het bestand


Ik heb bestandsservers die worden gebruikt om bestanden op te slaan. Bestanden kunnen daar een week of een jaar blijven staan. Helaas, wanneer ik bestanden van de server verwijder, df commando weerspiegelt niet de vrijgekomen ruimte. Dus uiteindelijk wordt de server vol (df toont 99%), en mijn script verzendt daar geen bestanden meer, behalve dat er daar misschien een paar dozijn GB vrije ruimte is.

ik heb noatime vlag op de gekoppelde partities als dat enig verschil maakt.


107
2018-02-08 07:36


oorsprong


Gebeurt dit op een enkele partitie of op alle partities? - Khaled
Nou, het gebeurt op mijn hoofdpartitie, dat is de enige waar ik om geef, omdat ik alleen bestanden schrijf / verwijder.
Licht me alsjeblieft in met de oplossing, of een link naar een oplossing.
Welk bestandssysteem (en)? DF doet een stat van het superblok, het kan zijn dat je bestandssysteem de sb-inode niet bijwerkt. Heb je de flush cache geprobeerd? - beans
Ext4 gebruiken. Hoe spoel je caches?


antwoorden:


Als u de bestandsnaam verwijdert, wordt het bestand niet daadwerkelijk verwijderd. Een ander proces houdt het bestand open, waardoor het niet wordt verwijderd; herstart of kill dat proces om het bestand vrij te geven.

Gebruik

lsof +L1

om erachter te komen welk proces een verwijderd (niet-gekoppeld) bestand gebruikt.


181
2018-02-08 07:48



Bestanden die zijn verwijderd, zijn na meer dan een maand niet geopend en het enige proces dat toegang tot deze bestanden biedt, is nginx, dus het is twijfelachtig.
1. Bovendien geeft "lsof + L1" aan welk programma de bestanden openhoudt. - pehrs
als root-run "lsof -n | grep-bestand" zou je er versteld van staan ​​hoe lang bestanden kunnen blijven hangen vanwege processen die ze om welke reden dan ook open houden. Als al het andere faalt, herstart, voel ik me slecht, maar het zal zeker zeker weten dat niets het bestand vasthoudt. Per slot van rekening is lsof + L1 waarschijnlijk de betere manier om te gaan. - ScottZ
Je hebt me net gered! Een 93G-logbestand verwijderd en de ruimte niet terug gekregen en kon niet achterhalen waarom. Bedankt. - Luke Cousins
Op dezelfde manier en in het geval dit anderen helpt, heb ik een groot nginx-bestand met toegang.log gewist, maar kon ik alleen de ruimte terugwinnen na het opnieuw opstarten van nginx: service nginx restart - Nick


zoals Ignacio vermeldt, zal het verwijderen van het bestand de ruimte niet vrijmaken totdat je de processen verwijdert die open handvaten tegen dat bestand hebben.

Toch kun je de ruimte terugwinnen zonder de processen te doden. Het enige dat u hoeft te doen is de bestandsdescriptors verwijderen.

Voer eerst lsof uit grep verwijderd om het proces te identificeren dat het bestand bevat

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

Voer vervolgens uit:

cd /proc/PID/fd

dan

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

De "1" zal de bestandsbeschrijving zijn. Type nu "> FD" om die ruimte terug te winnen

> 1

Mogelijk moet u de bewerking herhalen als er andere processen zijn die het bestand bevatten.


21
2018-02-07 01:24



wat doet de > FD do? - Pred
het verwijdert de bestandsbeschrijving - Adrián Deccico
doet dit > commando heeft een naam? ik moest van zsh naar bash overschakelen om het te kunnen gebruiken. Is het mogelijk om het op zsh uit te voeren? - ariera
het is een uitvoeromleiding en daarom wordt het bestand afgekapt. De lange tijd van zou "echo -n> 1" of "true> 1" zijn. Het verwijdert de FD niet echt, het wijst alleen naar een leeg bestand achteraf. - eckes


Een mogelijkheid is dat de bestanden die u hebt verwijderd meer verwijzingen bevatten in het bestandssysteem. Als u hardlinks hebt gemaakt, wijzen verschillende bestandsnamen naar dezelfde gegevens en worden de gegevens (de feitelijke inhoud) niet gemarkeerd als gratis / bruikbaar totdat alle verwijzingen ernaar zijn verwijderd. Voordat u bestanden verwijdert, moet u ze stateren (item met de naam Links) of ls -l op hen toepassen (moet de tweede kolom zijn).

Als blijkt dat de bestanden ergens anders naar verwezen worden, dan denk ik dat je ls -i de bestanden moet hebben om het inode-nummer te vinden, en dan een zoekopdracht met -inum <inode-nummer> doet om de andere verwijzingen naar dat bestand (je wilt waarschijnlijk ook -mount gebruiken om binnen hetzelfde bestandssysteem te blijven).


8
2018-02-08 10:01





Het bestand is nog steeds vergrendeld door het proces om het te openen. Ga als volgt te werk om ruimte vrij te maken:

  1. Rennen sudo lsof | grep deleted en zie welk proces het bestand bevat. Voorbeeld resultaat:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Dood het proces met sudo kill -9 {PID}. In het bovenstaande voorbeeld is de PID 1623.

    $ sudo kill -9 1623
    
  3. Rennen df om te controleren of er al ruimte is vrijgemaakt. Als het nog steeds vol is, moet u misschien een paar seconden wachten en het opnieuw controleren.


3
2018-02-16 05:31





Als de partitie is geconfigureerd om een ​​bepaald deel van de schijfruimte alleen voor rootgebruik te reserveren, df zal deze ruimte niet opnemen als beschikbaar.

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

Zelfs nadat ruimte wordt teruggevorderd door bestanden / mappen te verwijderen, kan een niet-rootgebruiker niet naar een bepaalde partitie schrijven.

U kunt eenvoudig controleren of dat het geval is door te proberen een bestand op een apparaat te maken als root- en niet-rootgebruiker.

Bovendien kunt u de configuratie van het bestandssysteem controleren door te draaien

tune2fs -l <device> | egrep "Block count|Reserved block count

en het berekenen van het werkelijke% alleen.

Als u het schijf% gereserveerd voor alleen rootgebruik wilt wijzigen, voert u het uit

tune2fs -m <percentage> <device>

2
2018-05-08 10:31





De andere antwoorden zijn correct: als u een bestand verwijdert en er geen ruimte wordt vrijgemaakt, is dit meestal omdat het bestand nog steeds open is of er andere hardlinks naar zijn.

Gebruik een hulpmiddel om te helpen bij het oplossen van problemen, waar u de schijfruimte kunt besteden: U kunt gebruiken du om een ​​overzicht te krijgen van waar de ruimte naartoe gaat. Nog beter, gebruik een grafische tool zoals xdiskusage (er zijn er veel zoals dit) om de schuldige op te sporen. Met xdiskusage en vrienden kun je naar de grootste ruimteparken gaan om te zien waar de ruimte naartoe gaat.

Op die manier vind je snel bestanden die nog ruimte innemen vanwege een tweede hardlink. Het zal ook de ruimte weergeven die ingenomen wordt door verwijderde, maar open bestanden (zoals (toestemming geweigerd), denk ik, omdat het de bestandsnaam niet kan lezen).


1
2018-02-08 10:11





Omdat ik weet dat heel veel van jullie dit doen voor redhat in /var en gzipping bestanden die verwachten dat de FS zal krimpen, maar in plaats daarvan groeit het, zorg er gewoon voor dat je syslog herstart. en

lsof -v file

zou dit hoe dan ook laten zien.


1
2018-03-23 15:02



Dit voegt niet echt veel toe; het geaccepteerde antwoord behandelde de logica achter dat in 2001. Wanneer u 50 rep hebt, gebruik dan opmerkingen als u kwalificaties wilt toevoegen aan de bestaande antwoorden. - Andrew B


Nog een optie: de schijf is mogelijk vol vanwege een proces waarbij continu gegevens worden gemaakt: logboeken, kernen en dergelijke. Het is mogelijk dat de ruimte daadwerkelijk wordt bevrijd maar onmiddellijk wordt opgevuld. Ik heb zo'n geval echt gezien. df geeft in dit geval eenvoudigweg geen beeld van het gat. Gebruik du meer leren.


0
2017-07-17 12:01





Ik gebruik EXT2, FSCK heeft me in deze situatie geholpen. Probeer shudown -F nu, na enkele herstarts en fscks, zie ik de helft van de gebruikte ruimte.


0
2018-01-16 09:00



Beste Marcellus, jouw oplossing is omvattend door het geaccepteerde antwoord; en soms wil je geen reboot doen als je niet gedwongen wordt om ... - Deer Hunter


Om te controleren welke verwijderde bestanden een bezet geheugen hebben, voert u de opdracht in

 $ sudo lsof | grep deleted

Het toont de verwijderde bestanden die geheugen bevatten.

Dood het proces vervolgens met pid of naam

$ sudo kill <pid>
$ df -h

controleer nu dat je hetzelfde geheugen hebt

Als u niet de onderstaande opdracht typt om te zien welk bestand het geheugen bezet is

# cd /
# du --threshold=(SIZE)

vermeld elke grootte, laat zien welke bestanden bezet zijn boven de drempelwaarde en wis het bestand waarvan je vindt dat het geheugen behouden blijft


-1
2018-03-06 07:16