Poinformuj fs o zwolnieniu miejsca z usuniętych plików TERAZ


73

Czy istnieje sposób, aby powiedzieć jądrze, aby zwróciło teraz wolne miejsce na dysku? Jak napisać do czegoś w / proc /? Używanie Ubuntu 11.10 z ext4.

Jest to prawdopodobnie stary i bardzo powtarzany motyw. Po uderzeniu w 0 spostrzegłem tylko, że mój edytor nie mógł zapisać plików kodu źródłowego, które otworzyłem, które ku mojemu przerażeniu mają teraz 0 bajtów na liście folderów, zacząłem kasować.

Usunąłem 100 MB dużych plików zarówno od użytkownika, jak i od roota, i zrobiłem też hardlinkowanie.

Tuż przedtem apt-get cleanw / var / cache / apt / archives było ponad 900 MB, teraz jest tylko 108 KB:

# du
108 /var/cache/apt/archives

Godzinę później nadal nie ma wolnego miejsca i nie mogę zapisać moich cennych plików otwartych w edytorze, ale zauważ różnicę poniżej:

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

Jakieś sugestie? Wyłączam niektóre usługi / procesy, ale nie jestem pewien, jak sprawdzić, kto może aktywnie jeść miejsce na dysku.

Więcej informacji

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096

4
System plików natychmiast zwalnia miejsce. Jednak funkcja bloków root zarezerwowanych przez ext [234] oraz sposób, w jaki jądro utrzymuje otwarte pliki zastrzeżone, może sprawiać wrażenie utraconej przestrzeni.
hhaamu

Jeśli masz kilka systemów plików (wersji), zwolnienie miejsca w jednym nie przyniesie żadnego pożytku w drugim.
vonbrand

Dlaczego udało mi się zapełnić partycję, zanim „zarezerwowane” bloki 5Go się odzyskają?
Psddp

Odpowiedzi:


116

Sprawdź za pomocą, lsofaby sprawdzić, czy pliki są otwarte. Przestrzeń nie zostanie zwolniona, dopóki nie zostaną zamknięte.

sudo /usr/sbin/lsof | grep deleted

powie Ci, które usunięte pliki są nadal utrzymywane otwarte.


Dobry. Pokazał mi kilka mysqldblokad w / tmp, ale wiele apport-gtzastosowań wymarłych plików w / var / lib / apt / list / częściowo /, które najwyraźniej się kumulują. Więc mogę, killall apport-gtale najpierw to zbadam.
Marcos

1
Oznaczenie jako najbliższej odpowiedzi, chociaż tak naprawdę nigdy nie „oddało” miejsca natychmiast po zamknięciu uchwytów / procesów plików, które je wykorzystują. Poszukiwanie innych podejść opartych na jądrze / proc / fs.
Marcos,

18
Możesz także użyć lsof +L1(wybierz otwarte pliki, które zostały rozłączone).
Martin Fido

Informacje w tej odpowiedzi są poprawne, ale problem, który miał OP, nie był prawdopodobnie spowodowany przez to, ale przez zarezerwowane miejsce roota (które rozwiązuje inna odpowiedź).
marcelm

37

Użyj, lsofaby znaleźć usunięty, ale otwarty plik, który wciąż zajmuje miejsce:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

Znajdź wpis w /proc/<pid>/fd/tym coondondondach uchwytu pliku:

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

Teraz tylko cat /dev/nulldo fd:

cat /dev/null > /proc/3446/fd/128

Zauważ, że i-węzeł jest nadal otwarty, ale teraz ma długość 0

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

5
Zbędne użycie catdo obcinania. W powłoce Bourne'a wystarczy > /proc/3446/fd/128.
200_success

2
NIE rób tego, jeśli Twój program rzeczywiście ponownie przeczyta w przyszłości dowolną część pliku, która może, ale nie musi być dostępna w pamięci podręcznej strony.
Michael R. Hines

13

dfnie pokaże miejsca zarezerwowanego dla root(nawet gdy działa jako root):

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

Jak zmienić „zarezerwowany procent bloku”

  1. Zmniejsz zarezerwowane miejsce do 4%

    # tune2fs -m4 /dev/sda4

df -h teraz pokazał 45 mln za darmo.

  1. Szybko zapisałem moje pliki
  2. Przywróć to do 5%

    # tune2fs -m5 /dev/sda4


2
Zarezerwowana przestrzeń dla root jest obecnie prawie zawsze zbyt duża. Możesz go zmniejszyć do kilku procent. dfwyświetla normalną powierzchnię użytkową dla użytkownika. Ponieważ apt działa jako root, zarezerwowane miejsce jest użyteczne tylko w celu ochrony przed uzupełnieniami spowodowanymi przez użytkowników innych niż root (= zwykli użytkownicy i usługi, które mają własnego użytkownika).
jofel

Zgadzam się; an mkfste dni należy zarezerwować np. 5% lub 300 MB, w zależności od tego, która wartość jest mniejsza . Właśnie dostroiłem niektóre z moich serwerów do 2% i uwolniłem GB!
Marcos

3
@jofel, nie, nie jest. Za każdym razem, gdy przekroczysz 90% wykorzystania, zaczynasz otrzymywać dużą fragmentację. Musisz zwolnić trochę więcej miejsca, a nie zbliżyć się do 100% wykorzystania.
psusi

@psusi Jesteś prawdą, dziękuję za komentarz. Ale możliwość wykorzystania (tymczasowego) prawie całej dostępnej przestrzeni jako normalny użytkownik może być naprawdę praktyczna, a dzięki ext4 rzeczy nie są już takie złe, patrz unix.stackexchange.com/a/7965/15241
jofel

7

W Ubuntu, jeśli pliki zostały usunięte za pomocą kosza na śmieci, najprawdopodobniej nie zostały całkowicie usunięte.

Nawet po opróżnieniu kosza pliki pozostaną w nim ~/.local/share/Trash/expungeddo momentu ponownego uruchomienia komputera, a może nawet dłużej.

Nie znalazłem dobrego powodu, ale jeśli zabraknie mi miejsca, zawsze ręcznie rmusuwam pliki śmieci.


1
Słuszna uwaga. Mimo że jestem jednym z tych, którzy żyją i umierają z linii poleceń i rzadko używają graficznego menedżera plików. Nie zauważyłem jednak tego zniszczonego folderu jako kryjówki - kliknięcie pustego kosza zawsze było ostateczne i w razie potrzeby zwróciło miejsce na dysku.
Marcos

6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

Objaśnienie: Wyjście
Grep, lsofaby wyodrębnić tylko usunięte pliki. Sed wyodrębnia identyfikator procesu i identyfikator filedescriptor z każdej linii i tworzy ciąg w formacie {pid}/fd/{fid}. Podczas pętli i wyprowadzaj nic do każdego pliku, ustawiając je na puste.


3
Mam błąd „błąd składni w pobliżu nieoczekiwanego tokena„ (””
Majid Golshadi,

5

Zastanawiam się, czy syncjest tu jakaś pomoc - ale nie powinno tak być, ponieważ IIRC w większości („wielu”?) Systemów, systemy plików są synchronizowane co 30 sekund.

Sprawdziłbym dziennik jądra (tak dmesg), aby sprawdzić, czy dzieje się coś nieprzyjemnego, i uruchomiłem, lsofaby sprawdzić, czy jakiś duży, usunięty plik jest nadal otwarty (tak naprawdę myślę, że usunięte pliki zostaną oznaczone jako tak na lsofwyjściu).

Są dwa powody (jeden z tych wskazanych w łączonym pytaniu), które mogą powodować, że usunięte pliki nie zwalniają miejsca

  • pliki, które nie zostały w rzeczywistości usunięte: usunąłeś plik, który jest dowiązany w innym miejscu (a dokładniej, unlink()edytujesz plik z więcej niż jednym linkiem)
  • pliki, które są nadal otwarte: otwarte pliki są księgowane przy użyciu, no cóż, plików, samych i- węzłów , a nie pozycji katalogu, jeśli usuniesz ten wpis, i-węzeł pozostanie tam tak długo, jak długo będzie otwarty.

Ale nie znam konkretnego powodu, dla którego może się tak zdarzyć w przypadku tak wielu plików ...


syncnigdy nie pomogłem. Jeśli chodzi o logi, jest to system Ubuntu, więc jest dość wadliwy, więc tak, są zazwyczaj głośne. apportwdraża się często, ponieważ co noc następuje awaria apt-get, chociaż / var / crash ma tylko 77 MB. Zauważyłem również atdzalanie / var / log / syslog powtarzającymi się liniami, atd[8892]: File a0015c0152ab76 is in wrong format - abortingprawdopodobnie dlatego, że kilka plików w / var / spool / cron / atspool miało rozmiar 0, co sprawia, że ​​problem jest oczywiście okrągły
Marcos

1

CentOS 6.3 wykonuje także czynności polegające na tym, że nie opróżniasz kosza na śmieci, kiedy go opróżnisz. Nie mogłem znaleźć sposobu na odzyskanie przestrzeni, dopóki nie pobiegłem rm -rf ~/.local/share/Trash/expunged/. Spowodowało to porysowanie głowy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.