Nie można zapisać na dysk, ale dysk nie jest pełny

36

Używam Ubuntu 12.04 i nie mogę pisać do żadnego pliku, nawet jako root, ani wykonywać żadnych innych operacji, które wymagają zapisu. Żaden proces, który musi napisać, nie może, więc wszystkie zawodzą. dfmówi, że mam dużo miejsca:

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G   14G   15G  48% /
udev            984M  4.0K  984M   1% /dev
tmpfs           399M  668K  399M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            997M     0  997M   0% /run/shm

Wszystkie wyniki, które znalazłem dla „nie można zapisać na dysk” dotyczą legalnie pełnych dysków. Nie wiem nawet, od czego zacząć. Problem pojawił się znikąd dziś rano.

Ostatni wpis w dzienniku PHP to:

nie powiodło się: brak miejsca na urządzeniu (28)

Vim mówi:

Nie można otworzyć (pliku) do zapisu

Inne aplikacje dają podobne błędy.

Po usunięciu ~ 1 gb, aby się upewnić, problem pozostaje. Zrestartowałem również.

df -i mówi

Filesystem      Inodes   IUsed  IFree IUse% Mounted on
/dev/xvda1     1966080 1966080      0  100% /
udev            251890     378 251512    1% /dev
tmpfs           255153     296 254857    1% /run
none            255153       4 255149    1% /run/lock
none            255153       1 255152    1% /run/shm
czuć
źródło
14
Proszę zamieścić dane wyjściowe „df -i”.
EEAA
1
Edytowano @EEAA. Masz rację, df -i mówi 100%. Co to znaczy? Dlaczego miałoby być inaczej?
felwithe
3
IIRC, zbyt wiele plików w jednym katalogu będzie miało podobne, jeśli nie identyczne objawy. To, co jest „zbyt wiele”, różni się w zależności od systemu plików.
MSalters

Odpowiedzi:

59

Brakuje i-węzłów. Prawdopodobnie masz gdzieś katalog z wieloma bardzo małymi plikami.

EEAA
źródło
9
Chciałem tylko dodać, że nawet nie wiedziałem, że rm może zawieść. To była edukacja.
felwithe
2
@felwithe, mogę sobie wyobrazić, find . -name sess\* -exec rm {} +że zadziałałoby.
Carsten S,
3
@felwithe Co inni sugerują. rm Prawdopodobnie działało dobrze, ale powłoka rozszerzyła *glob do zbyt dużej ilości danych i zniekształciła go, zanim jeszcze doszło do wywołania rm.
CVn
8
@CarstenS: Lub find . -name sess\* -deletełatwiejsze do zapamiętania i ogólnie bardziej wydajne.
MSalters
2
@Kaslai limit nie ma pamięci RAM, ale limit systemowy ARG_MAX. Standard POSIX nie precyzuje niestety dokładnie, jak argumenty wiersza poleceń są mierzone w stosunku do ARG_MAX, niestety. Niektóre implementacje nie mają limitu i dlatego nie definiują ARG_MAX, ale nie jest to popularna opcja, ponieważ powoduje, że zbyt wiele programów nie kompiluje się.
James Youngman
7

Najwyraźniej PO ma odpowiedź na konkretny problem. Jednak dla kompletności objawy PO mogą również wystąpić, jeśli system plików został ponownie zamontowany tylko do odczytu. Zdarzyło mi się to przy użyciu maszyny wirtualnej z systemem Linux, której pamięć masowa znajdowała się w systemie dysków klastrowych, w którym występują rzadkie awarie przerywane. Czasami awarie powodowałyby, że systemy plików zostały ponownie zamontowane tylko do odczytu. Ostatecznie zauważalnym objawem zewnętrznym było to, że różne usługi przestały odpowiadać po zapełnieniu pamięci RAM (zapisywaniem dysku niewymienialnego).

W tym czasie jedynym rozwiązaniem było ponowne uruchomienie systemu (utrata wszelkich niepisanych dzienników). Próby ponownego zamontowania RW nie powiodły się. (Niestety nie przypominam sobie komunikatów o błędach zwracanych podczas próby ponownego montażu).

Więc ... nie problem PO, ale ktoś inny, kto przybywa na tę stronę, może skorzystać z tych informacji.

Eric Towers
źródło
5
Właściwie nie; po ponownym zamontowaniu systemu plików tylko do odczytu pojawia się błąd informujący, że system plików jest tylko do odczytu, a nie brak miejsca.
psusi
1
@psusi: Nie zrobiłem tego. Mam różne błędy, w tym „pełny system plików”. Jeśli to się zmieniło w ciągu ostatnich dwóch lub trzech lat, byłoby dobrze.
Eric Towers
1
Próbowałem przenieść plik do systemu plików ZFS tylko do odczytu w systemie Linux innego dnia. Błąd dość wyraźnie powiedział „system plików tylko do odczytu”.
CVn
Nie; tak było przez ponad 30 lat. Zapis do odczytu tylko do odczytu zwraca wartość -EROFS; napisz do pełnego fs zwraca -ENOSPC.
psusi
4
@psusi: Widzę, że żyjesz we wszechświecie fantasy, w którym programiści zawsze robią właściwe rzeczy, zamiast tworzyć własne komunikaty o błędach. Nie wydaje mi się tam mieszkać.
Eric Towers