usuwanie plików, ale miejsce na dysku jest nadal pełne

26

Radząc sobie ze starym pudełkiem CentOS 5.6, bez konfiguracji lvm, mój główny system plików / jest pełny, wyczyściłem wiele starych plików dziennika i plików aplikacji, których nie potrzebuję, a które miały więcej niż 2 -5 GB, jednak mój system nadal informuje, że dysk jest pełny.

[root@tornms1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             130G  124G     0 100% /
/dev/sdb1             264G  188M  250G   1% /data
/dev/sda1              99M   24M   71M  26% /boot
tmpfs                 2.0G     0  2.0G   0% /dev/shm



[root@tornms1 ~]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sdb1 on /data type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

Masz pomysł, co powinienem zrobić dalej? niestety w tej chwili ponowne uruchomienie urządzenia nie jest możliwe.

użytkownik1007727
źródło
1
Przepraszam, że zadałem głupie pytanie, ale czy upewniłeś się, że twój /.Trash/jest pusty? Zrobiłeś sudo rm -Rf ~/.Trash/*?
Art Gertner,
To jest serwer, nie mam zainstalowanego xwindow, dlatego nie mam folderu .trash na moim koncie root.
user1007727,
Moje złe, założyłem, że /.Trash/ istnieje na wszystkich systemach uniksowych.
Art Gertner,
możesz także wypróbować komendę sync ( linux.die.net/man/8/sync ), być może wszystkie twoje operacje są nadal buforowane.
weberik

Odpowiedzi:

38

Mogą się tu dziać dwie rzeczy.

Po pierwsze , twój system plików zarezerwował miejsce, w którym rootmożna tylko zapisywać, aby krytyczny proces systemu nie upadł, gdy zwykłym użytkownikom zabraknie miejsca na dysku. Dlatego widzisz 124G użytych 130G, ale zero dostępnych. Być może usunięte pliki sprowadziły wykorzystanie do tego poziomu, ale nie poniżej progu dla zwykłych użytkowników.

Jeśli taka jest Twoja sytuacja i jesteś zdesperowany, możesz zmienić ilość zarezerwowanego miejsca root. Aby zmniejszyć go do 1% (domyślnie 5%), twoje polecenie będzie

# tune2fs -m 1 /dev/sda3

Po drugie , system operacyjny nie zwolni miejsca na dysku dla usuniętych plików, które są nadal otwarte. Jeśli usunąłeś (powiedzmy) jeden z plików dziennika Apache, musisz ponownie uruchomić Apache, aby zwolnić miejsce.

Flup
źródło
1
tak, drugi powinien być pierwszy!
Mulya
To pytanie / odpowiedź dodaje więcej informacji superuser.com/questions/444269/… .
luka5z
18

Jeśli usuniesz plik, który jest używany przez proces, nie możesz już go wyświetlić ls. Proces nadal zapisuje ten plik, dopóki go nie zatrzymasz.

Aby wyświetlić usunięte pliki, po prostu uruchom lsof|grep delete

Tao Zhou
źródło
1
To był problem w moim przypadku. Dziękuję bardzo przydatne informacje.
Dag Sondre Hansen
Powiązana odpowiedź: unix.stackexchange.com/questions/34140/…
icc97
10

2 inne sposoby uzyskania dysku to pełny problem:

1) ukryty pod punktem montowania: Linux pokaże pełny dysk z plikami „ukrytymi” pod punktem montowania. Jeśli masz dane zapisane na dysku i zamontujesz na nim inny system plików, Linux poprawnie odnotuje użycie dysku, nawet jeśli nie widzisz plików pod punktem podłączenia. Jeśli masz mounty nfs, spróbuj je zamontować i sprawdź, czy coś nie zostało przypadkowo zapisane w tych katalogach przed montowaniem.

2) uszkodzone pliki: Od czasu do czasu widzę to w systemie Windows do przesyłania plików Linux za pośrednictwem SMB. Jeden plik nie zamyka deskryptora pliku i kończy się na 4 GB pliku śmieci.

Naprawienie tego może być bardziej żmudne, ponieważ musisz znaleźć podkatalog, w którym znajduje się plik, ale łatwo go naprawić, ponieważ sam plik można łatwo usunąć. Korzystam z dupolecenia i robię listę katalogów głównych, aby dowiedzieć się, gdzie używana jest przestrzeń plików.

cd /
du -sh ./* 

Liczba katalogów najwyższego poziomu jest zwykle ograniczona, więc ustawiam flagę czytelną dla ludzi,-h aby zobaczyć, który podkatalog jest kosmicznym świnią.

Następnie przechodzisz do problemu z dzieckiem i powtarzasz proces dla wszystkich zawartych w nim elementów. Aby ułatwić dostrzeżenie dużych przedmiotów, zmieniamy nieznacznie du i łączymy go z rodzajem.

cd /<suspiciously large dir>
du -s ./* | sort -n

co daje najmniejszy do największego wynik według wielkości bajtu dla wszystkich plików i katalogów

4          ./bin 
462220     ./Documents
578899     ./Downloads
5788998769 ./Grocery List

Po znalezieniu dużego pliku można go zwykle usunąć.

Dan L.
źródło
Świetne wskazówki! Prześledziłem foldery pod / używając du i znalazłem kilka bardzo dużych obrazów systemowych pod Android SDK. Usunąłem je i wszystko wróciło do normy :)
Pupper
4

Możesz dowiedzieć się, które pliki są otwarte za pomocą lsof. Może generować dużo danych wyjściowych, więc w poniższym przykładzie ograniczyłem się do wierszy kończących się na log:

# lsof | grep log$
rsyslogd   2109     syslog    0u     unix 0xffff88022fa230c0      0t0       8894      /dev/log
rsyslogd   2109     syslog    1w      REG              252,6    62393         26 /var/log/syslog
rsyslogd   2109     syslog    2w      REG              252,6   113725        122 /var/log/auth.log
rsyslogd   2109     syslog    3u     unix 0xffff88022fa23740      0t0       8921 /var/spool/postfix/dev/log
rsyslogd   2109     syslog    5w      REG              252,6    65624        106 /var/log/mail.log
/usr/sbin  2129       root    2w      REG              252,6    93602         38 /var/log/munin/munin-node.log
/usr/sbin  2129       root    4w      REG              252,6    93602         38 /var/log/munin/munin-node.log
...
jris198944
źródło
1

Jeśli niektóre pliki zostaną usunięte, ale nadal wykorzystywane przez jakiś proces, wówczas jego miejsce nie zostanie zwolnione. W takim przypadku albo zrestartuj proces, który używa pliku, albo anuluj plik. Zawsze dobrą praktyką jest zerowanie takich plików zamiast ich usuwania. Aby znaleźć usunięte pliki, ale nadal są używane przez jakiś proces

#lsof +L1

poda identyfikator procesu i deskryptor pliku. Aby zerować usunięty plik według deskryptora pliku

#echo "" > /proc/$pid/fd/$fd 
Sagar Jagnade
źródło
1

Wpisz polecenie

#lsof +L1

Który pokaże listę plików przechowujących pamięć z usuniętym cytatem.

Zanotuj pid (identyfikator procesu) pliku

Zabij proces

#kill <pid>

Pamięć zostanie zwolniona przez proces

Sprawdź to za pomocą polecenia

#df -h
Javeed Shakeel
źródło
0

Oprócz tego, co zostało wyjaśnione, problemem może być to, że istnieje inny punkt montowania usuniętego katalogu plików na innym podłączonym urządzeniu dyskowym na tym samym serwerze. Sprawdź aktualne podłączenia i wpisy fstab.

Laith Leo Alobaidy
źródło
0

Rzeczywisty problem obserwowany na wolności:

Upewnij się, że usuwasz rzeczywiste pliki, a nie dowiązania symboliczne do plików. Może tak być zwłaszcza w przypadku plików dziennika.

icc97
źródło