Nigdy więcej miejsca na dysku: jak mogę znaleźć, co zajmuje miejsce?

81

Wystąpił problem na jednym z moich serwerów z 16.04: nie ma już miejsca na dysku.

Nie mam pojęcia, co zajmuje przestrzeń. Czy istnieje polecenie, aby wyświetlić bieżące rozmiary katalogów, więc mogę przejść i skończyć w katalogu, zajmując całe miejsce?

Karl Morrison
źródło
1
Sprawdź analizator użycia dysku
Pranal Narayan
@PranalNarayan Brak GUI, ponieważ jest na moim serwerze, obawiam się :(
Karl Morrison
1
Cholera, teraz zacząłem szukać, znalazłem ten bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 i chciałbym, żeby to było coś.
Sam
1
wrt „no GUI, is a server”: możesz zainstalować aplikację GUI (zakładając, że jesteś z niej zadowolony i biblioteki wsparcia znajdujące się na serwerze) i korzystać z twojego lokalnego ekranu poprzez X11-tunelowany-przez-SSH z czymś takim jak export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(zamień filelightna preferowane narzędzie). Oczywiście bez absolutnie wolnego miejsca, jeśli nie masz jeszcze zainstalowanego narzędzia, i tak musisz użyć czegoś innego!
David Spillett
4
@DavidSpillett Jak wspomniano, na serwerze nie ma już miejsca . Więc nie mogę niczego zainstalować.
Karl Morrison

Odpowiedzi:

93

Jak zawsze w Linuksie, jest więcej niż jeden sposób na wykonanie zadania. Jeśli jednak musisz to zrobić z interfejsu CLI, jest to moja preferowana metoda:

Zaczynam od uruchomienia jako root lub sudo:

du -cha --max-depth=1 / | grep -E "M|G"

Grep ma na celu ograniczenie zwracanych linii do tych, które zwracają wartości z zakresu Megabajtów lub Gigabajtów. Jeśli twoje dyski są wystarczająco duże, możesz również dodać, |Taby uwzględnić kwoty terabajtów. Mogą pojawić się błędy na /proc, /sysi / lub /devponieważ nie są to prawdziwe pliki na dysku. Jednak powinien nadal zapewniać prawidłowe dane wyjściowe dla pozostałych katalogów w katalogu głównym. Po znalezieniu największych możesz uruchomić komendę w tym katalogu, aby zawęzić winowajcę. Na przykład, jeśli /varbył największy, możesz to zrobić w następujący sposób:

du -cha --max-depth=1 /var | grep -E "M|G"

To powinno doprowadzić cię do problemu dzieci!

Dodatkowe uwagi

Podczas gdy powyższe polecenie z pewnością załatwi sprawę, miałem trochę konstruktywnej krytyki w komentarzach poniżej, które wskazały pewne rzeczy, które możesz również uwzględnić.

  1. Podane grepprzeze mnie może powodować sporadyczne zwracanie wartości „K”, jeśli nazwa katalogu lub pliku ma wielką literę G lub M. Jeśli absolutnie nie chcesz, aby którykolwiek z katalogów o wartości K pojawiał się, chciałbyś go zwiększyć twoja gra regularna, aby być bardziej kreatywnym i złożonym. na przykładgrep -E "^[0-9\.]*[MG]"
  2. Jeśli wiesz, który dysk jest problemem i ma na nim inne zamontowane dyski, których nie chcesz tracić czasu, w tym na wyszukiwanie, możesz dodać -xflagę do dupolecenia. Opis strony flagi tej flagi:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Możesz posortować dane wyjściowe dupolecenia, aby najwyższa wartość była na dole. Wystarczy dołączyć to na końcu polecenia:| sort -h

Cylinder
źródło
Właśnie to robię.
Wyścigi lekkości na orbicie
5
Twój grep zwraca wszystkie foldery z literami M lub G w nazwach, twórcze wyrażenie powinno trafić cyfry opcjonalną kropką + M | G, być może"^[0-9]*[.]*[0-9]*[MG]"
Xen2050
4
Jeśli wiesz, że problem stanowi jeden dysk, możesz użyć -xopcji, aby dupozostać na tym dysku (podanym w wierszu polecenia). Możesz także przesyłać strumieniowo, sort -haby poprawnie posortować wartości czytelne dla człowieka w megabajtach / gigabajtach. Zwykle rezygnowałem z tej --max-depthopcji i po prostu przeszukiwałem cały dysk w ten sposób, sortując odpowiednio, aby uzyskać największe rzeczy na dole.
Muzer
1
@alexis Moje doświadczenie polega na tym, że czasami kończę na innych śmieciach zamontowanych poniżej punktu zainteresowania, który mnie interesuje (szczególnie jeśli to jest /), a używanie -xdaje mi gwarancję, że nie będę pomyłki. Jeśli twój /jest pełny i masz osobno zamontowany /homeczy cokolwiek innego, używanie -xjest prawie koniecznością, aby pozbyć się nieistotnych rzeczy. Uważam więc, że jest to łatwiejsze w użyciu przez cały czas, na wszelki wypadek.
Muzer
1
Jeśli masz coś takiego, nie potrzebujesz grep.
OrangeDog
77

Możesz ncdudo tego użyć . Pracuje bardzo dobrze.

sudo apt install ncdu

wprowadź opis zdjęcia tutaj

Duncan
źródło
34
Kopię się, ponieważ normalnie korzystam z tego programu, jednak ponieważ nie ma już miejsca, nie mogę go zainstalować haha
Karl Morrison
@KarlMorrison widzę kilka możliwych rozwiązań, po prostu zamontuj go na sshfs na innym komputerze i uruchom tam ncdu (zakładając, że masz już na nim serwer ssh ...) - lub jeśli nie masz na nim serwera ssh, możesz to zrobić odwrotnie, zainstaluj ncdu na innym serwerze i podłącz go za pomocą sshfs i uruchom ncdu z mounta (zakładając, że masz już sshfs na serwerze) - lub jeśli nie masz ... jeśli ncdu jest pojedynczym skryptem, może po prostu curl http://path/to/ncdu | shi będzie działał w pamięci podręcznej stdin IO, ale będzie to wymagało szczęścia. prawdopodobnie jest też sposób na stworzenie
tarana
@KarlMorrison lub możesz uruchomić obraz systemu Linux na żywo i tam go zainstalować.
po zainstalowaniu wpisz sudo ncdu /z wiersza poleceń. sudobo jeśli nie umieścisz sudo, nie zgłosi rozmiarów folderów należących do roota, a /ponieważ jeśli nie wpiszesz, będzie raportował tylko rekompensująco z folderu, w którym się znajdujesz
Max Carroll
19

Używam tego polecenia

sudo du -aBM -d 1 . | sort -nr | head -20

Czasami muszę go uruchomić z /katalogu, ponieważ umieściłem coś w dziwnym miejscu.

Charles Green
źródło
Daje ci +1 za to, że działa! Jednak rozwiązanie TopHats faktycznie odczytało mój dysk szybciej!
Karl Morrison
Często bardziej przydatne jest robienie tego bez -d 1przełącznika (i zwykle z lesszamiast head -20), aby uzyskać pełną rekurencyjnie wyliczoną listę wszystkich plików i katalogów posortowaną według zajmowanego miejsca. W ten sposób, jeśli widzę, że katalog zajmuje dużo miejsca, mogę po prostu przewinąć w dół, aby zobaczyć, czy większość miejsca jest faktycznie zajęta przez jakiś konkretny plik lub podkatalog. To dobry sposób na znalezienie niepotrzebnych plików i katalogów do usunięcia, aby zwolnić miejsce: przewiń w dół, aż zobaczysz coś, czego na pewno nie chcesz zachować, usuń i powtórz.
Ilmari Karonen
@KarlMorrison nie czyta go szybciej, po prostu sortczeka na zakończenie danych wyjściowych przed rozpoczęciem.
muru
@muru Ah w porządku. Dostaję jednak informacje szybciej, aby móc szybciej przejść, jeśli to lepszy termin!
Karl Morrison
13

Istnieje już wiele dobrych odpowiedzi na temat sposobów znajdowania katalogów zajmujących większość miejsca. Jeśli masz powody, by sądzić, że kilka dużych plików jest głównym problemem, a nie wiele małych, możesz użyć czegoś takiego find / -size +10M.

Luca Citi
źródło
11

Nie znam Ubuntu i nie mogę sprawdzić mojej odpowiedzi, ale opublikuję tutaj moją odpowiedź na podstawie mojego doświadczenia jako administrator unixa dawno temu.

  1. Dowiedz się, który system plików zabraknie miejsca

    df -h
    

    wyświetli cały system plików, ich rozmiar i ilość wolnego miejsca. Marnujesz czas tylko, jeśli zbadasz systemy plików, które mają wystarczającą ilość miejsca. Załóżmy, że pełny system plików to / myfilesystem. sprawdź wyjście df, jeśli istnieją systemy plików zamontowane w podkatalogach / myfilesystems. Jeśli tak, należy dostosować następujące sygnały do ​​tej sytuacji.

  2. Dowiedz się, ile miejsca zajmują pliki tego systemu plików

    du -sh /myfilesystem
    

    Opcji -x można użyć, aby zagwarantować, że brane są pod uwagę tylko pliki należące do tego systemu plików. Niektóre warianty Uniksa (np. Solaris) nie znają opcji -x dla du. Następnie musisz użyć kilku obejść, aby znaleźć du swojego systemu plików.

  3. Teraz sprawdź, czy wielkość widocznych plików jest w przybliżeniu wielkości używanego miejsca wyświetlanego przez df. Jeśli tak, możesz zacząć szukać dużych plików / katalogów w systemie plików / myfilesystem do oczyszczenia.

  4. znaleźć największe podkatalogi w katalogu /.../dir

    du -sk /.../dir/*|sort -n
    

    opcja -k zmusza du do wyprowadzenia sie w kilobajtach bez żadnej jednostki. Może to być domyślne w niektórych systemach. Następnie możesz pominąć tę opcję. Największe pliki / podkatalogi zostaną pokazane na dole danych wyjściowych.

  5. Jeśli znalazłeś duży plik / katalog, którego już nie potrzebujesz, możesz go usunąć w odpowiedni sposób. Nie przejmuj się małymi katalogami na górze danych wyjściowych. Nie rozwiąże problemu, jeśli je usuniesz. Jeśli nadal nie masz wystarczającej ilości miejsca, możesz powtórzyć krok 4 w podkatalogach larges, które są wyświetlane na dole listy.

Ale co się stanie, jeśli wynik du nie będzie w przybliżeniu dostępnej przestrzeni wyświetlanej przez df?

Jeśli wynik wyjściowy jest większy, oznacza to, że brakuje Ci podkatalogu, w którym zamontowany jest inny system plików. Jeśli wyjście du jest znacznie mniejsze, niektóre pliki nie są wyświetlane w żadnym katalogu, który sprawdza. Przyczyny jego zjawisk mogą być różne.

  1. niektóre procesy używają pliku, który został już usunięty. Dlatego te pliki zostały usunięte z katalogu i du ich nie widzi. Ale w systemie plików ich bloki są nadal w użyciu, dopóki proces nie zamknie plików. Możesz spróbować znaleźć odpowiednie procesy (np. Z lsof) i zmusić je do zamknięcia tych plików (np. Przez zatrzymanie aplikacji lub zabicie procesów). Lub po prostu uruchom ponownie komputer.

  2. w katalogach znajdują się pliki, które nie są już widoczne, ponieważ w jednym z ich katalogów nadrzędnych jest zamontowany inny system plików. Więc jeśli masz plik / myfilesysem / subdir / bigfile i teraz zamontujesz inny system plików na / myfilesystem / subdir, to nie możesz już zobaczyć tego pliku i

    du -shx /myfilesystem 
    

    zgłosi wartość, która nie zawiera rozmiaru / myfilesystem / subdir / bigfile. Jedynym sposobem sprawdzenia, czy takie pliki istnieją, jest odmontowanie / myfilesystem / subir i sprawdzenie za pomocą

    ls -la /myfilesystem/subdir 
    

    jeśli zawiera pliki.

  3. Mogą istnieć specjalne typy systemów plików, które używają / rezerwują miejsce na dysku, który nie jest widoczny dla polecenia ls. Potrzebujesz specjalnych narzędzi, aby to wyświetlić.

Oprócz tego systematycznego korzystania z komendy du istnieje jeszcze kilka innych. Możesz więc użyć polecenia find, aby znaleźć pliki, które są większe niż pewna podana przez ciebie wartość, możesz wyszukać pliki, które są większe niż pewna podana przez ciebie wartość lub które zostały nowo utworzone lub mają specjalną nazwę (np. * .Log, core, * .trc). Ale zawsze powinieneś zrobić df, jak opisano w 1, aby pracować na odpowiednim systemie plików

cud173
źródło
Na zajętym serwerze nie zawsze można odmontować rzeczy. Ale możesz powiązać zamontowanie górnego katalogu z tymczasową lokalizacją i nie będzie on obejmował innych montowań i pozwoli na dostęp do ukrytych plików.
Zan Lynx
Przed systemd często miałem awarie montowania powodujące wypełnienie / mount koszem. Zapisywanie kopii zapasowej w / mnt / backup bez podłączonego napędu USB. Teraz upewniam się, że te jednostki pracy mają wymagania dotyczące montażu.
Zan Lynx
@ZanLynx Dziękuję, nigdy nie słyszał o wierzchowce powiązań przed
miracle173
@ZanLynx: Nie tylko na zajętych serwerach. Wyobraź sobie, że masz /tmpoddzielny system plików (np. Tmpfs) i coś utworzyło pliki, /tmpzanim stało się punktem podłączenia do innego systemu plików. Teraz te pliki znajdują się w głównym systemie plików, ukryte w punkcie montowania i nie można uzyskać do nich dostępu bez ponownego uruchomienia w trybie odzyskiwania (który nie przetwarza /etc/fstab) lub, jak sugerujesz, montowania bind.
David Foerster,
9

Jeśli nie chcesz używać polecenia, oto aplikacja: Filelight

Umożliwia szybką wizualizację wykorzystania miejsca na dysku w dowolnym folderze.

wprowadź opis zdjęcia tutaj

Gabriel
źródło
Jest to serwer, do którego mam SSH, bez GUI.
Karl Morrison
@KarlMorrison Myślę, że są sposoby na uruchamianie programów GUI przez ssh, ale to jest pomysł na później, kiedy będzie miejsce na instalację pakietów
Xen2050
@David O tak, staram się z tego wyjść. Kiedyś było to konieczne na innej platformie, z której korzystałem. Naprawię ten komentarz.
@Karl tak, to proste, jeśli X jest już zainstalowany na kliencie: ssh -X <your host>a następnie uruchom swój program z wiersza poleceń
@MarkYisri chodzi o to, że musisz zainstalować program i jego zależności. A przypadek Filelight wymaga co najmniej KDElibs i Qt, które nie są tak naprawdę małe. Zobacz np. Tę stronę, aby zobaczyć pakiet Ubuntu filelight , zwróć uwagę, ile ma zależności.
Ruslan
5

Spróbuj sudo apt-get autoremoveusunąć nieużywane pliki, jeśli jeszcze tego nie zrobiłeś

Donald Shahini
źródło
1
Już to robiłem wcześniej :( Ale dobry pomysł dla innych!
Karl Morrison
3

Często tego używam

du -sh /*/

Jeśli znajdę jakieś duże foldery, przełączę się na nie i przeprowadzę dalsze dochodzenie

cd big_dir
du -sh */

W razie potrzeby możesz także ustawić sortowanie automatycznie za pomocą

du -s /*/ | sort -n
phuclv
źródło
2

Naprawdę nie odpowiedź - ale uzupełnienie.

Masz mało miejsca i nie możesz zainstalować ncdu z odpowiedzi @erman.

Jakieś sugestie

  • sudo apt clean allaby usunąć pakiety, które już pobrałeś. BEZPIECZNY
  • sudo rm -f /var/log/*gzwyczyść pliki dziennika starsze niż tydzień lub dwa - nie usunie nowszych / bieżących dzienników. NAJBARDZIEJ BEZPIECZNY
  • sudo lsof | grep deletedwyświetla listę wszystkich otwartych plików, ale filtruje do tych, które zostały usunięte z dysku. FAIRLY SAFE
  • sudo rm /tmp/*usuń niektóre pliki tymczasowe - jeśli coś ich używa, możesz zakłócić proces. NIE NAPRAWDĘ TAKIE BEZPIECZNE

Że można zwrócić takie wiersze:

server456 ~ $ lsof | grep deleted
init          1          root    9r      REG              253,0  10406312       3104 /var/lib/sss/mc/initgro                        ups (deleted)
salt-mini  4532          root    0r      REG              253,0        17     393614 /tmp/sh-thd-1492991421                         (deleted)

Nie można wiele zrobić z linią początkową, ale druga linia sugeruje, że solnik ma otwarty plik, który został usunięty, a bloki dysku zostaną zwrócone, gdy wszystkie uchwyty plików zostaną zamknięte przez ponowne uruchomienie usługi.

Innymi typowymi podejrzanymi tutaj są syslog / rsyslog / syslog-ng, kałamarnica, apache lub dowolny proces uruchamiany przez serwer, który jest „ciężki”.

Criggie
źródło
2

Uważam za szczególnie cenny wynik działania narzędzi takich jak Filelight, ale tak jak w twoim przypadku, na serwerach zwykle nie ma zainstalowanego GUI, ale dupolecenie jest zawsze dostępne.

Zwykle robię to:

  • zapisz duwynik w pliku ( du / > du_output.txt);
  • skopiuj plik na mój komputer;
  • służy DuFSdo „montowania” danych duwyjściowych w katalogu tymczasowym; DuFSużywa FUSE do stworzenia wirtualnego systemu plików (= żadne pliki nie są tworzone, wszystkie są fałszywe) zgodnie z danymi duwyjściowymi;
  • uruchom Filelight lub inne narzędzie GUI w tym katalogu tymczasowym.

Zastrzeżenie: Napisałem dufs- właśnie dlatego, że często muszę dowiedzieć się, co wiedzie miejsca na dysku na maszynach bezgłowych.

Matteo Italia
źródło
Możesz po prostu posortować -n du_output.txt
Zan Lynx
Uważam, że graficzny sposób wykorzystania przestrzeni jest bardziej intuicyjny.
Matteo Italia
-1

Podobne do @TopHat, ale filtruje niektóre pliki, jeśli mają w nazwie M, G lub T. Nie sądzę, aby rozmiar w pierwszej kolumnie był pomijany, ale nie będzie pasował do nazwy pliku, chyba że nazwiesz pliki w sposób kreatywny.

du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]'

Wyjaśniono tutaj przełączniki wiersza poleceń , ponieważ nie wiedziałem, co zrobił c lub a.

użytkownik685769
źródło