Czy mogę zabraknąć miejsca na dysku, tworząc bardzo dużą liczbę pustych plików?

35

Powszechnie wiadomo, że puste pliki tekstowe mają zero bajtów:

wprowadź opis zdjęcia tutaj

Jednak każdy z nich zawiera metadane , które według moich badań są przechowywane w i- węzłach i zajmują miejsce .

Biorąc to pod uwagę, wydaje mi się logiczne, że można zapełnić dysk, tworząc wyłącznie puste pliki tekstowe. Czy to jest poprawne? Jeśli tak, ile pustych plików tekstowych musiałbym wypełnić, powiedzmy, 1 GB?


Aby wykonać kilka kontroli, uruchamiam, df -iale to najwyraźniej pokazuje% używanych i-węzłów (?) Zamiast ich wagi.

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho
Luchonacho
źródło
Powiązane: unix.stackexchange.com/q/62049
moooeeeep

Odpowiedzi:

40

To wyjście sugeruje 28786688ogólnie i-węzły, po czym /dev/sda2powróci kolejna próba utworzenia pliku w głównym systemie plików (urządzeniu ) ENOSPC(„Brak miejsca na urządzeniu”).

Objaśnienie: w pierwotnym projekcie systemu plików * nix maksymalna liczba i-węzłów jest ustawiana podczas tworzenia systemu plików. Przeznaczone jest dla nich dedykowane miejsce. Możesz skończyć się z i-węzłów, zanim zabraknie miejsca na dane lub odwrotnie. Najpopularniejszy domyślny system plików Linux ext4nadal ma to ograniczenie. Informacje na temat rozmiarów i-węzłów na ext4 można znaleźć na stronie podręcznika mkfs.ext4.

Linux obsługuje inne systemy plików bez tego ograniczenia. Włączone btrfsmiejsce jest przydzielane dynamicznie. „Struktura i-węzła jest stosunkowo niewielka i nie będzie zawierać danych osadzonych plików ani danych atrybutów rozszerzonych”. (ext3 / 4 przydziela trochę miejsca w i-węzłach dla rozszerzonych atrybutów ). Oczywiście nadal możesz zabraknąć miejsca na dysku, tworząc zbyt dużo wpisów metadanych / katalogu.

Myśląc o tym, tmpfs jest kolejnym przykładem, w którym i-węzły są przydzielane dynamicznie. Trudno wiedzieć, co df -iw praktyce oznaczałoby maksymalną liczbę i-węzłów w praktyce dla tych systemów plików. Nie dołączałbym żadnego znaczenia do pokazanej wartości.


„XFS alokuje także i-węzły dynamicznie. Podobnie JFS. Tak samo zrobił / robi reiserfs. Podobnie jak F2FS. Tradycyjne systemy plików Unix przydzielają i-węzły statycznie w czasie mkfs, podobnie jak współczesne systemy plików, takie jak ext4, które śledzą ich dziedzictwo, ale w dzisiejszych czasach wyjątek, nie reguła.

„BTW, XFS pozwala ci ustawić limit maksymalnego procentu miejsca zajmowanego przez i-węzły, dzięki czemu możesz zabraknąć i-węzłów, zanim dojdziesz do punktu, w którym nie możesz dołączyć do istniejących plików. (Domyślnie 25% dla FSes poniżej 1 TB, 5% dla systemów plików do 50 TB, 1% dla większych.) W każdym razie to wykorzystanie miejsca na metadane (i-węzły i mapy zasięgu) zostanie odzwierciedlone w regularnych df -h”- Peter Cordes w komentarzu do tej odpowiedzi

sourcejedi
źródło
Czy mówisz, że jeśli utworzę 28786688-667980=28118708puste pliki, to w efekcie skończą mi się i-węzły i „zepsuję mój system”?
luchonacho
1
XFS alokuje także i-węzły dynamicznie. JFS również. Tak zrobiłem / robi reiserfs. Podobnie F2FS . Tradycyjne systemy plików uniksowe przydzielają i-węzły statycznie w czasie mkfs, podobnie jak współczesne systemy plików, takie jak ext4, które śledzą swoje dziedzictwo, ale obecnie jest to wyjątek, a nie reguła. (Chyba że ważycie rzeczy według zainstalowanej bazy, w której prawdopodobnie poprawne jest stwierdzenie, że większość systemów plików znajdujących się obecnie na dysku w systemach * nix w środowisku naturalnym ma statyczne alokacje).
Peter Cordes
BTW, XFS pozwala ustawić limit maksymalnego procentu miejsca używanego przez i-węzły, dzięki czemu możesz zabraknąć i-węzłów, zanim dojdziesz do punktu, w którym nie możesz dołączyć do istniejących plików. (Domyślnie jest to 25% dla plików FS poniżej 1 TB, 5% dla systemów plików do 50 TB, 1% dla większych). W każdym razie to wykorzystanie miejsca na metadane (i-węzły i mapy zasięgu) będzie odzwierciedlone w regularnych df -h, @luchonacho.
Peter Cordes
26

Tworzenie pustych plików wymaga użycia następujących elementów:

  • i-węzły, po jednym na plik;
  • dodatkowe wpisy w katalogu, także jeden na plik, ale zagregowane.

Liczba dostępnych i-węzłów jest często określana podczas tworzenia systemu plików i nie można go zmienić (niektóre systemy plików, takie jak Btrfs lub XFS, dynamicznie przydzielają i-węzły). To jest mierzone przez df -i. Po wyczerpaniu i-węzłów nie można tworzyć nowych plików ani katalogów, nawet jeśli jest dostępne miejsce na dysku.

Pozycje katalogu również zajmują miejsce z dostępnego miejsca na dysku. Możesz to zobaczyć, patrząc na rozmiar katalogu: zawsze jest to wielokrotność rozmiaru bloku, a gdy katalog zawiera wiele plików, jego rozmiar rośnie. Jeśli zabraknie miejsca na dysku, możesz nie być w stanie utworzyć nowych plików lub katalogów w katalogu, który jest „pełny” ( tj. Gdy dodanie nowego pliku wymagałoby przydzielenia nowego bloku), nawet jeśli masz dostępne i-węzły.

Więc tak, można zabraknąć miejsca na dysku, używając tylko pustych plików.

Stephen Kitt
źródło
Więc musiałbym utworzyć wystarczającą liczbę pustych plików, aby osiągnąć 100% wykorzystanie i-węzłów?
luchonacho
@luchonacho tak, efektywnie jeden pusty plik na i-węzeł.
Stephen Kitt
Zwróć także uwagę na rozszerzone atrybuty, które mogą dodać do tego miejsce. Na przykład, jeśli katalog ma wiele domyślnych list ACL, utworzenie w nim pliku będzie wymagało miejsca do przechowywania tych list ACL.
Stéphane Chazelas
OK, poprawiam się. Rzecz w tym, że wygląda dziwnie zarówno dla czcionek renderowanych, jak i o stałej szerokości w mojej przeglądarce. Z ciekawości, jak je wstawić? Czy twoja klawiatura ma inny klawisz dla tego znaku i klawisz U + 0022?
Stéphane Chazelas
Dzięki, z ciekawości sprawdziłem, czy są one na moim układzie klawiatury w Wielkiej Brytanii i rzeczywiście są na AltGr + Shift + V / B (podwójne cudzysłowy bez zmiany). Pozostanę przy U + 0022.
Stéphane Chazelas
7

Argument czysto logiczny:

Nazwa pliku składa się z niezerowej ilości bajtów. Nawet przy teoretycznej maksymalnej kompresji w hipotetycznym systemie plików zaprojektowanym tak, aby dopuszczać absolutną maksymalną liczbę nazw plików, każda nazwa pliku nadal zużywa co najmniej jeden bit gdzieś na dysku fizycznym. Prawdopodobnie więcej, ale „1 bit na plik” to banalne minimum.

Oblicz liczbę bitów, które mogą zmieścić się na twoich talerzach, i jest to teoretyczna maksymalna liczba (pustych lub niepustych) plików, które możesz na nim zapisać.

Tak więc odpowiedź brzmi tak. W końcu zabraknie Ci miejsca, bez względu na to, jakiego miejsca używasz, jeśli będziesz dodawać puste pliki. Oczywiście skończy Ci się znacznie szybciej niż maksimum obliczone w ten sposób, ale zabraknie.

AnoE
źródło
0

Po prostu nie, ale możesz zabraknąć i-węzłów na Linuksie, co będzie takie samo, jak zabraknie miejsca.

możesz spróbować czegoś takiego w swojej powłoce n=0; while :; do touch $n; let n=n+1; done

Po prostu upewnij się, że uruchomisz go na maszynie wirtualnej, w przeciwnym razie szybko wyjdziesz z i-węzłów.

in1t3r
źródło
Co robi to polecenie?
luchonacho
Zaczyna się od prawdziwej nieskończonej pętli, która za każdym razem tworzy nazwę pliku, która jest liczbą całkowitą zaczynającą się od 0, a następnie 1 2 3 ... ostatecznie stworzy wystarczającą liczbę plików, aby użyć wszystkich i-węzłów systemu plików.
in1t3r
1
Jeśli uruchomisz to polecenie na partycji / home, jeśli jest ono niezależne, to na partycji / nie będziesz miał problemu, po prostu nie będziesz mógł już pisać na partycji / home. Moja sugestia polega na utworzeniu w nim katalogu o nazwie inodetest cd, a następnie uruchomieniu polecenia po pojawieniu się błędów, których nie można już utworzyć w systemie plików, naciśnij ctrl + C i uruchom, rm -fr inodetestaby pozbyć się wszystkich tych pustych plików i ponownie działać normalnie. :)
in1t3r
0

Nie można zapełnić dysku, tworząc puste pliki - na dysku nadal będzie dużo miejsca na nowe pliki. Ale tak, możesz wyczerpać skończoną podaż wolnych plików i-węzłów systemu plików - w tym momencie nie możesz tworzyć nowych plików (nawet jeśli twój dysk - pod względem zajętej przestrzeni - jest praktycznie pusty). To tylko lista wszystkich używanych i-węzłów systemu plików, a nie dysk ... więc system plików jest pełny, a dysk jest praktycznie pusty. Tabela i-węzłów zajmuje miejsce na dysku, ale tabela nie powiększa się, gdy dodajesz pliki - tak jak arkusz papieru nie rośnie, gdy piszesz w jego wierszach.

(odpowiedź w komentarzu autorstwa Baarda Kopperuda)

Luchonacho
źródło
Nie jesteś pewien, czy potrzebujemy innej odpowiedzi, która mówi to samo ?
Jeff Schaller