System plików Linux; różnica w obliczaniu wielkości za pomocą df & du

8

Po uruchomieniu dfpokazuje, że urządzenie root jest pełne.

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  9.4G     0 100% /

Spojrzałem na inodeużycie i jest dość miejsca na urządzenie root

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1               640K    103K    538K   16% /

Ale po uruchomieniu dupolecenia pokazuje, że użyłem tylko 2Gz 9.9G.

ip-XXX-XXX-XXX-XXX:/$ du -xh --max-depth=1
14M ./etc
4.0K ./mnt
96K ./tmp
3.5M ./bin
0   ./sys
964K ./boot
4.0K ./srv
0   ./dev
55M ./lib
25M ./root
1.1G ./usr
4.0K ./opt
846M ./var
4.3M ./sbin
23M ./home
16K ./lost+found
0   ./proc
2.0G .

To tylko doprowadza mnie do szaleństwa i jest interesujące. Jest to dla nas duży problem, ponieważ dysk główny /jest pełny, a niektóre funkcje w naszej witrynie zawodzą.

Pomóż mi rozwiązać (również zrozumieć) ten problem.

Dzięki.

Rakesh Sankar
źródło
2
Zobacz pomyłkę dotyczącą wolnego miejsca na dysku linux i inne +df +dupytania na Unix i Linux .
Gilles „SO- przestań być zły”,
@Gilles, jak powiedziałeś, pobiegłem du -x /i widzę, że użyto tylko 2G i obliczyłem, jaki jest rozmiar i-węzła 160M. Pomogło mi to zrozumieć, ale chcę tylko rozwiązać ten problem.
Rakesh Sankar
Czy działałeś dujako root? W przeciwnym razie może zgłaszać tylko pliki, do których masz dostęp.
Gilles „SO- przestań być zły”
@Gilles Biegam jakoroot
Rakesh Sankar
Nie mam tu nic do dodania poza świetnym ncduprogramem, który pomaga wizualizować wykorzystanie dysku.
Rob

Odpowiedzi:

4

Po usunięciu plików w * nix, pozostają one na dysku (i zajmują miejsce na dysku) tak długo, jak długo proces je otwiera. Dość często korzysta się z tego, aby „zabezpieczyć” pliki tymczasowe, tworząc je o małym rozmiarze, usuwając je, a następnie używając usuniętego pliku do przechowywania danych bez martwienia się o to, że inne procesy (łatwo) uzyskają do niego dostęp, więc ilość miejsca w usuniętych plikach może wzrosnąć, jeśli, powiedzmy, tymczasowa baza danych lub sesja edycji multimediów jest obsługiwana w ten sposób. Inną możliwością, w jaki sposób można mieć tak dużo „utraconej” przestrzeni, byłoby, gdyby system został zaktualizowany (wiele razy) bez ponownego uruchamiania lub ponownego uruchamiania programów, w wyniku czego wszystkie twoje stare biblioteki .so byłyby otwarte przez programy, które zostały uruchomione przed zaktualizuj i nadal działają.

dfwidzi przestrzeń używaną przez te pliki, ponieważ po prostu sprawdza, ile miejsca jest przydzielone na urządzeniu, ale dunie widzi ich, ponieważ nie ma żadnych odpowiednich pozycji katalogu.

Takie „ukryte” zajęte miejsce można zwolnić tylko wtedy, gdy procesy, które usunęły pliki, je zamkną. Możesz znaleźć te procesy za pomocą fuserpolecenia i zakończyć je (lub, dla wielu demonów, wysłać sygnał nakazujący im zamknięcie i ponowne otwarcie wszystkich otwartych plików).

Dave Sherohman
źródło
dzięki, dobre informacje, coś (więcej) rozumiem dzisiaj. Ale aby znaleźć hiddenużywane miejsce, próbuję uruchomić fuserpolecenie, aby zobaczyć wszystkie pliki, które są używane przez proces, ale nie są połączone - nie mogłem znaleźć żadnego. Czy masz jakieś polecenie lub kierunek, który prowadzi mnie do znalezienia go? To polecenie, którego używamfuser -v -a /
Rakesh Sankar
Musiałem go ponownie uruchomić, aby pozbyć się ukrytej przestrzeni, ale nie mogłem znaleźć odpowiedniego rozwiązania, aby usunąć te ukryte pliki.
Rakesh Sankar
1

Były chwile, gdy dysk się zapełni, można go pomylić do momentu ponownego uruchomienia / ponownego zamontowania dysku, który jest nadal pełny, nawet po usunięciu obciążenia plików.

BugFinder
źródło
Nie mogę zrestartować się, ponieważ jest to strona produkcyjna. Ale szukam rozwiązania, które pomoże mi znaleźć tę ukrytą przestrzeń i przywrócić ją.
Rakesh Sankar
Może to produkcja, ale czasami jedynym rozwiązaniem jest restart. To niefortunny problem polegający na tym, że jest to dysk główny i cały system operacyjny na nim jest. Dlatego wielu opowiada się za używaniem tmp, var, home itp. Na innych dyskach, ponieważ mogą one zostać ponownie zamontowane. Wydaje się, że bardziej powszechne jest, że system operacyjny nie zdaje sobie sprawy, że miejsce jest dostępne na dysku głównym.
BugFinder
1

Z mojej strony po prostu zrestartowałem syslogd, aby odzyskać miejsce na dysku. Brakowało mi 3 GB! Mój serwer był uruchomiony przez 250 dni.

Vincent Martineau
źródło
0

Istnieje sposób na oczyszczenie miejsca bez ponownego uruchamiania aplikacji. Oto szczegóły:

  1. Załóżmy, że masz foouruchomiony proces i tworzysz plik 2 GB o nazwie abc.log. Teraz powiedz, że ten abc.log został usunięty przez kogoś innego.

  2. Uzyskaj foopid (powiedzmy 123). Pokaże więc /proc/123/fdlistę deskryptorów plików otwartych przez foo. Jeden z abc.log pokaże się jako usunięty. Załóżmy, że fdabs.log ma wartość 111. Jeśli uruchomisz less /proc/123/fd/111, nadal będzie wyświetlać wszystkie 2 GB danych.

  3. Uruchom echo " " > /proc/123/fd/111. Spowoduje to zastąpienie zawartości pustym ciągiem. Po tym poleceniu, jeśli spróbujesz df, pokaże dodatkowe 2 GB odzyskane przez czyszczenie abc.log.

Otóż ​​to. Próbowałem tego na CentOS i działa.

Kaustubh Sathe
źródło
Warto wiedzieć. Ale to nie jest odpowiedź na pytanie.
Isaac Rabinovitch
przepraszam, mój ans był bardziej ukierunkowany na czyszczenie miejsca na dysku, jeśli znasz identyfikator procesu, który usunął plik. W tym konkretnym przypadku musisz przejrzeć wszystkie pliki w / proc / [0-9] * / fd, grep usunięte i postępować zgodnie z logiką wspomnianą powyżej.
Kaustubh Sathe,
Jeśli jesteś naprawdę ciekawy, który plik powoduje wyciek miejsca na dysku, wyczyść usunięty plik na raz, sprawdzaj dane wyjściowe df za każdym razem i rejestruj te informacje.
Kaustubh Sathe,