Dlaczego jądro Linuksa zgłasza „brak miejsca na dysku”, podczas gdy w rzeczywistości nie ma go w i-węzłach

10

Mój przyjaciel, który lubi programować w środowisku Linux, ale niewiele wie o administrowaniu Linuksem, ostatnio miał problem z tym, że jego system operacyjny (Ubuntu) zgłaszał „brak miejsca na dysku na wolumenie XXX”. Ale kiedy poszedł sprawdzić głośność, zostało jeszcze 700 GB. Po marnowaniu czasu był w stanie zorientować się, że skończył mu się węzeł. (Przechowywał wiele małych przyrostowych aktualizacji z systemu kopii zapasowych na tym woluminie i spalił wszystkie swoje i-węzły).

Zapytał mnie, dlaczego jądro Linuksa zgłosiło komunikat o błędzie („brak miejsca na dysku”) zamiast poprawnie raportowania („brak i-węzłów”). Nie wiedziałem, więc pomyślałem, że zapytam StackExchange.

Czy ktoś wie, dlaczego tak się dzieje? i dlaczego nie został naprawiony po tylu latach? (Pamiętam innego przyjaciela, który opowiadał mi o tym problemie w 1995 r.)

Precel
źródło

Odpowiedzi:

18

Pojedynczy numer błędu ENOSPCsłuży do zgłaszania obu sytuacji, stąd ten sam komunikat o błędzie.

Aby zachować zgodność ze standardami ISO Ci POSIX, programiści jądra nie mają innego wyboru, jak użyć jednego numeru błędu dla obu zdarzeń. Dodanie nowego numeru błędu spowodowałoby uszkodzenie istniejących programów.

Ponieważ jednak trzymanie się tradycyjnych komunikatów o błędach nie jest obowiązkowe w AFAIK, nic nie powinno zabraniać deweloperowi, aby pojedynczy komunikat był wyraźniejszy, jak na przykład out of disk/inode space

Technicznie rzecz biorąc, niezależnie od tego, czy brakuje miejsca i-węzła, czy też miejsca danych, jest to samo, tzn. Oznacza to, że nie ma wystarczającej ilości wolnego miejsca na dysku, aby wywołanie systemowe mogło zakończyć się powodzeniem.

Myślę, że nie będziesz narzekać, jeśli twój dysk zostanie zgłoszony jako zapełniony, dopóki nadal są wolne miejsca na i-węzły.

Należy pamiętać, że systemy plików podoba JFS, XFS, ZFSa btrfsprzeznaczyć węzłów dynamicznie tak zrobić Żaden eksponat ten problem już.

jlliagre
źródło
Najnowsze systemy plików obejmują ext4?
Camilo Martin
@CamiloMartin Nie sądzę, że tak.
jlliagre
@CamiloMartin Niestety nie, ext4przydziela i-węzły w czasie tworzenia fs, np. Ext2 / 3, i nie można go później modyfikować.
Matt
@mindthemonkey Darn! To chyba pewna kompatybilność wsteczna. Jaki inny system plików ma ładne funkcje, ale jest wystarczająco stabilny (czy stabilny jest btrfs)? ext4 wydaje się być rodzajem „domyślnego wyboru” (przynajmniej z mojej perspektywy nowicjusza).
Camilo Martin
1
Tak, rozszerzenia zawsze były rozszerzeniami poprzedniej wersji i były kompatybilne wstecz, więc nie wprowadzono większych zmian, ale oznacza to, że pozostały dość solidne i stabilne. Osobiście zajmuję się przechowywaniem dużych woluminów na pudełkach FreeBSD w ZFS. BTRFS jest nadal uważany za „niestabilny”, chociaż większość dystrybucji przynajmniej pozwoli ci go używać.
Matt
2

Zakładam, że twój przyjaciel używa ext fs, ponieważ jest to jeden z niewielu rozsądnych fs, które mogą zabraknąć i-węzłów.

Wygląda na to, że twój przyjaciel albo majstrował przy swoim systemie plików i go złamał, albo ma absurdalnie dużą objętość kilku TB. I-węzły nie są rzeczą jednorazowego użytku. Jeśli naprawdę zabrakło mu i-węzłów, oznacza to, że ma absurdalnie wiele plików i katalogów ... co może się zdarzyć na wolumenie> 4 TB (wykształcone przypuszczenie), gdzie „tylko” 700 GB jest bezpłatne. W przypadku rodziny rozszerzeń fs liczba i-węzłów jest określana podczas tworzenia fs. Ze strony podręcznika mkfs.ext4:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Aby skrócić pozostałą część tej odpowiedzi: oznacza mkfsto, że albo ma taki stosunek, albo go przyjmuje. Jeśli twój przyjaciel używa fs inaczej niż zakładano, wybrany współczynnik może być niewłaściwy dla jego przypadku użycia i dostaje ten błąd ... wypełnienie pojedynczego woluminu o pojemności wielu TB tonami małych plików może być liczone jako takie.

Czy twój przyjaciel używa jakiegoś środowiska graficznego, które implementuje koncepcję „kosza na śmieci” dla plików lub innych form tworzenia kopii zapasowych, które mogą tworzyć duże ilości plików? Może uda mu się rozwiązać problem, po prostu pozbywając się niepotrzebnych plików.

Pamiętam ten problem z ext2 z czasów, gdy jądro 2.4 było dość nowe. Zasadniczo zawsze używam XFS dla woluminów, które są bardzo duże w porównaniu do tego, co jest obecnie powszechne. Obecnie nazywam wszystko od 250 GB do 1 TB wspólnego dla jednego woluminu i możemy kupić dyski twarde 4 TB. Więc dla wszystkiego> 3 TB wolę używać XFS niż ext. To tylko ogólna zasada, ale od dłuższego czasu nie zabrakło i-węzłów ...

Bananguin
źródło
1
Obawiam się, że nie odpowiadasz na zadane pytanie.
jlliagre
Prawdziwe. W pewnym sensie próbowałem odpowiedzieć na pierwsze pytanie, które trafiłem w „Ktoś wie, dlaczego tak się dzieje?”, Ale nie w tytule.
Bananguin
Dobrze. Mój przyjaciel wie, co się stało. Robił jakiś system tworzenia kopii zapasowych, w którym przechowywał przyrostowe zmiany nieskompresowane (ani TAR), aby wszystkie te małe pliki zajmowały miejsce. Nie sądzę, żeby kiedykolwiek miał tak duże FS, więc brakowało mu i-węzłów, co było dla niego nową rzeczą. Ergo, był sfrustrowany, gdy napisał „df-h” i pomyślał: „huh, wciąż mam mnóstwo miejsca” - szczerze mówiąc, zgadzam się z nim. Jądro mówiąc „brak miejsca”, kiedy w rzeczywistości powinien mieć osobny komunikat „brak węzłów”, jest bardzo mylące.
Pretzel
@Bananguin - Czy wiesz, jaki jest domyślny stosunek bajtów do i-węzłów?
Pretzel
@Pretzel: Myślę, że pamiętam, że domyślnie jest to jeden i-węzeł na każde 4k. Właśnie sprawdziłem komputer ( tune2fs -l /dev/sda1) i okazało się, że mam stosunek 1 i-węzła na każde cztery bloki, a każdy blok ma rozmiar 1k. Jak bardzo można to uznać za „domyślne”, nie wiem.
Bananguin