df w systemie Linux nie pokazuje poprawnego wolnego miejsca po usunięciu pliku

143

Mam serwery plików, które służą do przechowywania plików. Pliki mogą znajdować się tam przez tydzień lub rok. Niestety po usunięciu plików z serwera dfpolecenie nie odzwierciedla zwolnionego miejsca. W końcu serwer zostaje zapełniony ( dfpokazuje 99%), a mój skrypt nie wysyła już więcej plików, z wyjątkiem tego, że może tam być kilkadziesiąt GB wolnego miejsca.

Mam noatimeflagę na zamontowanych partycjach, jeśli to robi jakąkolwiek różnicę.

Aminah Nuraini
źródło
Czy dzieje się to na jednej partycji czy na wszystkich partycjach?
Khaled
Cóż, dzieje się to na mojej głównej partycji danych, która jest jedyną, na której mi zależy, ponieważ zapisuję / usuwam tylko pliki.
Proszę oświecić mnie rozwiązaniem lub linkiem do jednego.
Jakie systemy plików? DF wykonuje statystyki superbloku, być może system plików nie aktualizuje i-węzła sb. Czy próbowałeś opróżnić pamięć podręczną?
fasola
Korzystanie z ext4. Jak opróżniać skrzynki?

Odpowiedzi:

235

Usunięcie nazwy pliku nie powoduje usunięcia pliku. W innym procesie plik jest otwarty, przez co nie można go usunąć; uruchom ponownie lub zabij ten proces, aby zwolnić plik.

Posługiwać się

lsof +L1

aby dowiedzieć się, który proces korzysta z usuniętego (niepowiązanego) pliku.

Ignacio Vazquez-Abrams
źródło
2
Pliki, które zostały usunięte, nie były dostępne przez ponad miesiąc, a jedynym procesem, który uzyskuje do nich dostęp, jest nginx, więc jest to wątpliwe.
39
+1. Ponadto „lsof + L1” powie ci, który program utrzymuje otwarte pliki.
pehrs
4
jako root uruchom „lsof -n | grep file”, będziesz zaskoczony, jak długo pliki mogą się trzymać, ponieważ procesy utrzymują je otwarte z jakiegokolwiek powodu. Jeśli wszystko inne zawiedzie, uruchom ponownie komputer, źle to sugeruję, ale na pewno upewni się, że nic nie trzyma się pliku. Na pehrs, lsof + L1 jest prawdopodobnie lepszym sposobem.
ScottZ
3
Właśnie mnie uratowałeś! Usunąłem plik dziennika 93G i nie odzyskałem miejsca i nie mogłem zrozumieć, dlaczego. Dzięki.
Luke Cousins
1
W tym samym wierszu i na wypadek, gdyby to pomogło innym, usunąłem duży plik access.log nginx, ale udało mi się odzyskać miejsce po ponownym uruchomieniu nginx: usługa restart nginx
Nick
28

jak wspomina Ignacio, usunięcie pliku nie zwolni miejsca, dopóki nie usuniesz procesów, które mają otwarte uchwyty dla tego pliku.

Niemniej jednak możesz odzyskać miejsce bez zabijania procesów. Wszystko, co musisz zrobić, to usunąć deskryptory plików.

Najpierw uruchom lsof | grep usunięty, aby zidentyfikować proces przechowujący plik

[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)

Następnie wykonaj:

cd /proc/PID/fd

następnie

[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)

„1” będzie deskryptorem pliku. Teraz wpisz „> FD”, aby odzyskać to miejsce

> 1

Może być konieczne powtórzenie operacji, jeśli plik zawiera inne procesy.

Adrián Deccico
źródło
1
co robi > FDzrobić?
Pred
usuwa deskryptor pliku
Adrián Deccico
2
czy to >polecenie ma nazwę? musiałem przełączyć się z zsh na bash, aby móc z niego korzystać. Czy można go uruchomić na Zsh?
ariera,
1
jest to przekierowanie wyjściowe i dlatego obcina plik. Długo od to będzie „echo -n> 1” lub „prawda> 1”. Tak naprawdę nie usuwa FD, po prostu wskazuje na pusty plik.
eckes
8

Jedną z możliwości jest to, że usunięte pliki mają więcej odniesień w systemie plików. Jeśli utworzyłeś twarde linki, kilka nazw plików będzie wskazywać na te same dane, a dane (rzeczywista zawartość) nie będą oznaczone jako bezpłatne / użyteczne, dopóki wszystkie odniesienia do nich nie zostaną usunięte. Przed usunięciem plików należy je stat (Wpis o nazwie Linki) lub wykonać na nich polecenie ls -l (powinna to być druga kolumna).

Jeśli okaże się, że pliki są przywoływane gdzie indziej, myślę, że będziesz musiał ls -i plik (i), aby znaleźć numer i-węzła, a następnie wykonaj wyszukiwanie z -inum <numer_inodu>, aby znaleźć inne odniesienia do tego pliku (prawdopodobnie również chcesz użyć -mount, aby pozostać w tym samym systemie plików).

Kjetil Joergensen
źródło
4

Plik jest nadal blokowany przez proces otwierania go. Aby zwolnić miejsce, wykonaj następujące kroki:

  1. Uruchom sudo lsof | grep deletedi sprawdź, który proces przechowuje plik. Przykładowy wynik:

    $ 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. Zabij proces za pomocą sudo kill -9 {PID}. W powyższej próbce PID wynosi 1623.

    $ sudo kill -9 1623
    
  3. Uruchom, dfaby sprawdzić, czy miejsce jest już zwolnione. Jeśli nadal jest pełny, być może trzeba poczekać kilka sekund i sprawdzić ponownie.

Aminah Nuraini
źródło
4

Jeśli partycja została skonfigurowana do rezerwowania pewnej części miejsca na dysku tylko do użytku root, dfnie uwzględni tego miejsca jako dostępnego.

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

Nawet po odzyskaniu przestrzeni przez usunięcie plików / katalogów, użytkownik inny niż root nie będzie mógł zapisywać na określonej partycji.

Możesz łatwo sprawdzić, czy tak jest w Twoim przypadku, próbując utworzyć plik na urządzeniu jako użytkownik root i użytkownik inny niż root.

Dodatkowo możesz sprawdzić konfigurację systemu plików, uruchamiając

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

i samodzielne obliczanie rzeczywistego%.

Aby zmienić dysk% zarezerwowany tylko do użytku root, wykonaj

tune2fs -m <percentage> <device>
luka5z
źródło
1

Inne odpowiedzi są poprawne: jeśli usuniesz plik, a przestrzeń nie zostanie zwolniona, zwykle dzieje się tak dlatego, że plik jest nadal otwarty, lub istnieją inne twarde łącza do niego.

Aby pomóc w rozwiązywaniu problemów, użyj narzędzia, które informuje, gdzie jest zajęte miejsce na dysku: możesz użyć, duaby uzyskać przegląd tego, gdzie idzie miejsce. Co więcej, użyj narzędzia graficznego, takiego jak xdiskusage (jest wielu takich), aby upolować winnego. xdiskusage i przyjaciele pozwalają ci wiercić największe świnie kosmiczne, aby dowiedzieć się, dokąd zmierza kosmos.

W ten sposób szybko znajdziesz pliki, które nadal zajmują miejsce z powodu drugiego twardego łącza. Pokaże również miejsce zajmowane przez usunięte, ale otwarte pliki (jak sądzę (odmowa uprawnień), ponieważ nie może odczytać nazwy pliku).

Śleske
źródło
1

Ponieważ wiem, że mnóstwo z was robi to w celu /varredhatowania i spakowania plików, oczekując, że FS się zmniejszy, ale zamiast tego rośnie, po prostu upewnij się, że ponownie uruchomiłeś syslog. i

lsof -v file

pokaże ci to mimo wszystko.

użytkownik1802263
źródło
1
To tak naprawdę niewiele dodaje; zaakceptowana odpowiedź obejmowała logikę stojącą za tym w 2001 roku. Gdy masz 50 powtórzeń, użyj komentarzy, jeśli chcesz dodać kwalifikatory do istniejących odpowiedzi.
Andrew B
0

Jeszcze jedna opcja: dysk może być pełny ze względu na proces ciągłego tworzenia danych: logi, rdzenie i tym podobne. Możliwe, że przestrzeń jest faktycznie uwalniana, ale jest natychmiast zapełniana. Tak naprawdę widziałem taki przypadek. dfw tym przypadku po prostu nie daje obrazu dziury. Użyj, duaby dowiedzieć się więcej.

Chen Levy
źródło
0

Używam EXT2, FSCK pomógł mi w tej sytuacji. Spróbuj shudown -F teraz, po kilku restartach i fscks, widzę, że połowa zużyła miejsce.

Marcellus
źródło
1
Drogi Marcellusie, twoje rozwiązanie obejmuje zaakceptowaną odpowiedź; a czasem nie chcesz zrestartować komputera, jeśli nie jesteś zmuszony do ...
Deer Hunter
-1

Aby sprawdzić, które usunięte pliki zajmują pamięć, wprowadź polecenie

 $ sudo lsof | grep deleted

Wyświetli usunięte pliki z pamięcią.

Następnie zabij proces za pomocą pid lub nazwy

$ sudo kill <pid>
$ df -h

sprawdź teraz, będziesz mieć tę samą pamięć

Jeśli nie, wpisz poniższe polecenie, aby zobaczyć, który plik zajmuje pamięć

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

wspomnij o dowolnym rozmiarze, który pokaże, które pliki zajmują więcej niż rozmiar progowy i usuń plik, w którym znajdziesz pamięć

Javeed Shakeel
źródło
-4

otwórz terminal wypróbuj to polecenie df - Następnie użyj tego polecenia sudo du -h --max-depth = 1 / w tym poleceniu znajdziesz szczegółowe informacje o użyciu dysku, a następnie otwórz jako użytkownik root usuń plik (root-local-share-trash) i usuń plik

Rilson
źródło