Serwer Linux nie ma miejsca

31

Zadano mi to pytanie w dwóch kolejnych wywiadach, ale po kilku badaniach i sprawdzeniu z różnymi administratorami systemów nie otrzymałem dobrej odpowiedzi. Zastanawiam się, czy ktoś może mi tutaj pomóc.

Na serwerze brakuje miejsca na dysku. Zauważasz bardzo duży plik dziennika i stwierdzasz, że można go bezpiecznie usunąć. Usuwasz plik, ale dysk nadal pokazuje, że jest pełny. Co by to spowodowało i jak temu zaradzić? A jak odkryjesz, który proces zapisuje ten ogromny plik dziennika?

ewwhite
źródło
3
Musisz porozmawiać z lepszymi administratorami systemów. To jest banalne.
womble
2
Trywialne, ale sytuacja i pytanie pojawiają się dość często ...
ewwhite
Czy PO będzie w stanie to zaakceptować?
ewwhite
5
Trywialne czy nie, dla kogoś, kto nie mówi płynnie * nix (np. Głównie administrator systemu Windows), warto się tego nauczyć.
John Gardeniers,

Odpowiedzi:

56

To jest często zadawane pytanie podczas wywiadu i sytuacja, która pojawia się w różnych środowiskach produkcyjnych.

Pozycje katalogu pliku zostały usunięte, ale proces rejestrowania jest nadal uruchomiony. Miejsce nie zostanie odzyskane przez system operacyjny, dopóki wszystkie uchwyty plików nie zostaną zamknięte (np. Proces został zabity) i wszystkie wpisy katalogu zostaną usunięte. Aby znaleźć proces zapisujący do pliku, musisz użyć lsofpolecenia.

Inną częścią pytania może być czasem „jak wyczyścić plik, do którego jest zapisywany, nie zabijając procesu?” Idealnie byłoby „wyzerować” lub „skrócić” plik dziennika za pomocą czegoś podobnego : > /var/log/logfilezamiast usuwania pliku.

ewwhite
źródło
1
... lub fuser.
Steven poniedziałek
1
Trochę się rozszerzam: dopóki wszystkie odniesienia do pliku na dysku nie znikną, miejsce to nie może być wykorzystane przez coś innego. Obejmuje to uchwyty plików. Pozwala to również na działanie tej sztuczki: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland
1
Jeśli no-clobberustawiłeś, spróbuj:>| /var/log/logfile
Belmin Fernandez
2
W każdym wywiadzie zadaję wariant tego pytania: „Dostajesz pełne dyski wiadomości. dfMówi, duże masz za mało miejsca, mówi , że prawie nie używasz żadnego. Co to powoduje i dlaczego dwa narzędzia się nie zgadzają?”
voretaq7
Co zrobić, jeśli po > /var/log/filezwolnieniu miejsca na dysku nadal wynosi 100%? Plik dziennika wydaje się być pusty ... ale dopiero po ponownym uruchomieniu programu zapisującego ten plik dziennika przestrzeń jest odzyskiwana. Czy istnieje sposób na odzyskanie miejsca na dysku bez ponownego uruchamiania programu?
alemani
14

Istnieje jeszcze inny link do pliku (twardy link lub otwarty uchwyt pliku). Usunięcie pliku usuwa tylko pozycję katalogu; dane pliku i i-węzeł zawieszają się, dopóki nie zostanie usunięte ostatnie odniesienie do niego.

Jest to dość powszechna praktyka dla usługi, aby utworzyć plik tymczasowy i natychmiast go usunąć, zachowując plik otwarty. Powoduje to utworzenie pliku na dysku, ale gwarantuje, że plik zostanie usunięty, jeśli proces zakończy się nienormalnie, a także zapobiegnie przypadkowemu wtargnięciu innych procesów do pliku. MySQL robi to na przykład dla wszystkich tabel tymczasowych na dysku. Złośliwe oprogramowanie często stosuje podobną taktykę do ukrywania swoich plików.

W systemie Linux możesz wygodnie uzyskać dostęp do tych usuniętych plików jako /proc/<pid>/fd/<filenumber>.

tylerl
źródło
8

Nie jestem sysadminem, ale z tego, co zebrałem na Unix.SE, system Linux nie usunie pliku (oznaczy miejsce jako wolne / wielokrotnego użytku) po jego rozłączeniu, dopóki wszystkie deskryptory plików wskazujące został zamknięty. Aby odpowiedzieć na pierwszą część, miejsce nie jest jeszcze wolne, ponieważ proces wciąż go odczytuje. Aby odpowiedzieć na drugie pytanie, możesz sprawdzić, z którym procesem jest używany plik lsof.

Kevin
źródło
2

Jedna z alternatywnych odpowiedzi poza oczywistą odpowiedzią na twardy link / otwarty plik: ten plik jest (bardzo) rzadkim plikiem, takim jak /var/log/lastlogRHEL, który tak naprawdę nie zajmował tyle miejsca. Usunięcie go miało bardzo niewielki wpływ, więc musisz spojrzeć na następny największy plik.

Alexios
źródło
1

Jeśli proces zapisujący plik jest rootem, zapisze się w obszarze plików zarezerwowanym przez administratora. System plików ma to miejsce, aby system działał na wypadek, gdyby zadanie użytkownika zapełniło dysk. Ta przestrzeń (imho domyślnie 5%) jest niewidoczna dla wielu narzędzi.

lsof może ci pokazać, który proces zablokował plik, ergo pisze do niego.

Ktoś
źródło
1
Możesz także dostosować ten procent rezerwy za pomocą tune2fs. Może to być szybki sposób na zezwolenie serwerowi na kontynuowanie działania podczas zwalniania miejsca na dysku.
sjbotha
1

Oprócz otwierania pliku przez proces, drugim przypadkiem jest system plików obsługujący migawki takie jak btrfslub ZFS.

Na przykład robisz migawkę z tym ogromnym plikiem dziennika. Jeśli usuniesz plik teraz, usuniesz tylko deltę. I delta jest usuwana tylko wtedy, gdy plik nie jest używany.

Zobacz też:

Trzecim przypadkiem jest system plików, który obsługuje usuwanie duplikatów na poziomie bloku, a większość plików jest identyczna z innym plikiem. Nie oczekuję, że tak się stanie w przypadku dziennika, chyba że masz kontener lub maszynę wirtualną, która wysyła dzienniki do kontenera syslog lub maszyny wirtualnej, które współużytkują ten sam system FS, dzięki czemu zawartość dziennika jest identyczna.

Mircea Vutcovici
źródło