Jak mogę zwiększyć liczbę i-węzłów w systemie plików ext4?


61

Miałem problem (nowy dla mnie) w zeszłym tygodniu. Mam system plików ext4 (Fedora 15). Aplikacja działająca na serwerze nagle przestała działać. Nie mogłem znaleźć problemu na pierwszy rzut oka.

dfpokazało 50% dostępnej powierzchni. Po przeszukaniu około godziny zobaczyłem post na forum, w którym używał ten facet df -i. Opcja wyszukuje użycie i-węzłów. W systemie brakowało i-węzłów, prosty problem, którego nie zdawałem sobie sprawy. Partycja miała tylko 3,2 mln i-węzłów.

Teraz moje pytania brzmią: czy mogę sprawić, aby system miał więcej i-węzłów? Czy należy / można go ustawić podczas formatowania dysku? Z iloma i-węzłami 3,2M ile plików mogę mieć?


1
Każdy plik lub katalog używa jednego i-węzła. Twardy link do pliku nie tworzy i-węzła. en.wikipedia.org/wiki/Inode
Paul Tomblin

Odpowiedzi:


33

Wygląda na to, że masz dużo więcej plików niż zwykle.

Nie wiem, czy istnieje rozwiązanie umożliwiające dynamiczną zmianę rozmiaru tabeli i-węzłów. Obawiam się, że musisz wykonać kopię zapasową danych, utworzyć nowy system plików i przywrócić dane.

Aby stworzyć nowy system plików z tak ogromną tabelą i-węzłów, musisz użyć opcji „-N” programu mke2fs (8).

Polecam najpierw użyć opcji „-n” (która nie tworzy fs, ale wyświetla przydatne informacje), aby uzyskać szacunkową liczbę i-węzłów. W razie potrzeby użyj „-N”, aby utworzyć system plików z określonymi numerami i-węzłów.


11
Możesz użyć, mke2fs -iaby określić liczbę i-węzłów. Jego dokumentacja wskazuje, że „nie jest możliwe zwiększenie liczby i-węzłów w systemie plików po jego utworzeniu”.
Gilles

2
@piovisqui: każdy plik zużywa się na i-węźle, który jest wskaźnikiem w systemie plików. jeśli plik jest dowiązaniem twardym do innego pliku, ma ten sam i-węzeł.
Hanan N.,

6
@Gilles -iOpcje określają rozmiar i-węzła, a nie ich liczbę. -NOpcja ustawia węzłów numerycznych.
theillien

1
Relacja między i-węzłami a numerami plików niekoniecznie musi wynosić 1: 1. Pierwszy i-węzeł zawiera listę wskaźników do bloków, w których plik jest przechowywany. Jeśli lista bloków nie mieści się w obrębie jednego i-węzła, to i-węzeł zawiera listę wskaźników do i-węzłów, które zawierają listę bloków, w których plik jest przechowywany. Jeśli tam nie pasuje, to przechodzi 3 zestawy i-węzłów dla tej listy bloków itp.
StuWhitby 14.04.15

2
@StuWhitby To nie do końca prawda. Pojedynczy i-węzeł ma kilka bezpośrednich wskaźników oraz pojedynczy, podwójny i potrójny pośredni wskaźnik. Jeśli lista bloków nie może zmieścić się w bezpośrednich wskaźnikach, wówczas pojedynczy wskaźnik pośredni wskaże blok danych (NIE innego i-węzła), który zawiera więcej wskaźników. Jeśli potrzebnych jest więcej wskaźników, podwójny wskaźnik pośredni wskazuje blok zawierający pojedyncze wskaźniki pośrednie, a potrójny wskaźnik pośredni w bloku z podwójnymi wskaźnikami pośrednimi. Tak więc plik używa tylko jednego i-węzła, bez względu na rozmiar.
user125355,

11

Jako inne obejście można zasugerować rozważenie spakowania ogromnych kolekcji plików do nieskompresowanego (!) tarArchiwum, a następnie użycia go archivemountdo zamontowania go jako systemu plików. Archiwum tar jest lepsze do udostępniania niż obraz systemu plików i zapewnia podobną wydajność podczas tworzenia kopii zapasowej w chmurze lub innym magazynie.


Jeśli kolekcja ma być tylko do odczytu, squashfsmoże być opcją, ale wymaga pewnych opcji włączonych w jądrze, a xzkompresja jest dostępna również dla tar o tej samej wydajności.


2
Niezła sugestia.
piovisqui

11

Dzięki 3,2 miliona i-węzłów możesz mieć łącznie 3,2 miliona plików i katalogów (ale wiele dowiązań twardych do pliku używa tylko jednego i-węzła).

Tak, można to ustawić podczas tworzenia systemu plików na partycji. Opcje -T usage-type, -N number-of-inodeslub -i bytes-per-inodewszystkie mogą ustawić liczbę i-węzłów. Zwykle używam -i, po porównaniu danych wyjściowych du -si find | wc -ldla podobnej kolekcji plików i dopuszczeniu pewnego luzu.

Nie, nie można tego zmienić w istniejącym systemie plików. Jednak:

  • Jeśli korzystasz z LVM lub system plików znajduje się na jednostce LUN w sieci SAN (bezpośrednio w jednostce LUN lub jako ostatnia partycja w jednostce LUN) lub masz puste miejsce na dysku po partycji, możesz ją powiększyć, a następnie użyj resize2fsdo rozwinięcia systemu plików. To z grubsza dodaje więcej i-węzłów proporcjonalnie do dodanej przestrzeni. Jeśli chcesz uniknąć wyczerpania się i-węzłów przed przestrzenią, zakładając, że przyszłe pliki będą miały mniej więcej ten sam rozmiar, ustaw odpowiednio wysoki procent zarezerwowanego bloku za pomocą tune2fs -m.
  • Jeśli masz wystarczająco dużo miejsca i możesz przełączyć system plików w tryb offline, przełącz go w tryb offline, utwórz nowy system plików z większą liczbą i-węzłów i skopiuj wszystkie pliki.
  • Jeśli tylko podzbiór plików korzysta z dużej liczby i-węzłów i masz wystarczającą ilość wolnego miejsca, utwórz system plików na urządzeniu pętlowym wspieranym przez plik w systemie plików, utwórz system plików z większą liczbą i-węzłów (a może także mniejszych bloków) i przenieś do niego niepoprawne katalogi. To prawdopodobnie hit wydajności i kłopot konserwacyjny, ale jest to alternatywa.
  • I oczywiście, jeśli możesz usunąć wiele niepotrzebnych plików, to też powinno pomóc.

6

Mam alternatywne rozwiązania dla tej sytuacji. Powiedzmy, że masz 1000 i-węzłów na partycji 10G. Jednak ze względu na limit i-węzłów nie należy wykorzystywać całej przestrzeni partycji . Ale w tych rozwiązaniach będziesz mógł wykorzystać pozostałą przestrzeń partycji bez jej formatowania .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

do stałego montażu

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
Witamy w U&L. Pozwoliłem sobie sformatować twoją odpowiedź na bardziej typową reprezentację kodu tutaj, wstawiając podpowiedź ( $) w celu wyraźnego rozróżnienia między poleceniami a danymi wyjściowymi (jeśli byłyby to tylko polecenia, podpowiedź jest zwykle pomijana). Zmieniłem też SHOUTING w odważnym podkreśleniu fazy, co moim zdaniem zamierzałeś. Możesz cofnąć zmiany, jeśli wprowadzę w błąd
Anthon

Myślę, że to rozwiązanie ma logikę, ale musisz zarządzać rozmiarem podczas uruchamiania dd.
piovisqui

3
Dane są błędne, trzeba użyć urządzenia pętlowego, a może nawet unionfs w zależności od aplikacji, ale jest to jedyne rozwiązanie pozwalające uniknąć formatowania i przywracania z kopii zapasowej, co nie jest przyjemnością, gdy spieszy się z milionami plików. Są okoliczności, w których może to uratować dzień!
medoc

6

Ostatnio napotkałem ten problem podczas korzystania z aktualizacji apt lub aptitude.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Wydane polecenie:

du /|sort -k1 -n

Ujawniono, że większość plików znajduje się w podfolderach dla kilku wersji jądra:

/usr/src/linux-headers

Usunięto te podfoldery i problem i-węzła został naprawiony.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

czy „du / | sort -k1 -n” pokazuje i-węzły?
Sieroty

Nie. Miało to posortować katalogi, pokazując, które z nich mają najwięcej plików, foldery, które zużywały dużo i-węzłów, ale mniej rzeczywistego wykorzystania miejsca: sytuacja 30% wolnego miejsca na dysku, ale 100% wykorzystania i-węzłów pokazana powyżej.
kph0x1

Naprawdę nie rozumiem, jak „du” pokazało, ile plików ma jakaś flaga? Czy mógłbyś wyjaśnić bardziej szczegółowo?
Sieroty

Brak flag dla dupolecenia. W powyższym przykładzie użyto katalogu głównego systemu plików, patrząc tylko na przestrzeń. Dane wyjściowe są sortowane potokowo, aby pokazać, które katalogi zawierały najwięcej plików. W powyższym przykładzie nie ma liczenia dla plików, czyli części „ile plików” pytania. duJednak źródłem wyjściowym były jądra ; np. wiele małych plików, podfolderów z poprzednich kompilacji, ta rzecz idealnie nadaje się do usunięcia w celu uwolnienia i-węzłów. Wciąż pozostaje ręczny, ludzki przegląd duwyników, /usr/src/linux-headersbył wtedy oczywisty.
kph0x1

1
du pokazuje TYLKO bajty - nie pliki. I wyprowadzasz wyjście tylko z polecenia du do sortowania. Jak więc sort -k1 -n sortuje dane wyjściowe w taki sposób, jaki zaproponowałeś? Jedyne, co widzę, to to, że „du / | sort -k1 -n” sortuje tylko każdy wiersz na podstawie wielkości w bajtach. Nic więcej
sieroty

2

wypróbuj du -s --inodes * 2>/dev/null |sort -gcd do ostatniego katalogu wyjściowego i powtórz.

Pełne ujawnienie: nie wszystkie --inodesflagi wsparcia systemu operacyjnego dla polecenia du (mój Mac OS nie ma), ale wiele systemów Linux obsługuje .

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.