Dlaczego rozmiar katalogu zawsze wynosi 4096 bajtów w Uniksie?

26

Jestem pewien, że plik katalogu ma znacznie mniej informacji niż 4096 bajtów. Wiem, że rozmiar sektora wynosi 4096 bajtów. Ale istnieją normalne pliki mniejsze niż to.

Dlaczego Unix rezerwuje 4096 bajtów dla każdego folderu?

Lazer
źródło

Odpowiedzi:

30

Jest to początkowy rozmiar niezbędny do przechowywania metadanych dotyczących plików zawartych w tym katalogu (w tym nazw). Początkowy przydział jest równy rozmiarowi jednego sektora, ale w razie potrzeby może wzrosnąć powyżej tego. Raz przydzielone miejsce nie jest zwalniane, jeśli pliki są usuwane, aby zmniejszyć fragmentację.

Na przykład:

$ mkdir testdir
$ cd testdir
$ ls -ld .
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:28 ./
$ for ((i=0; i<1000; i++)); do touch some_longish_file_name_$i; done
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ rm some_longish_file_name_*
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ cd ..
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 testdir/
$ rmdir testdir ; mkdir testdir
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:29 testdir/

źródło

harrymc
źródło
3
Dziękujemy za część „Przestrzeń nie jest zwolniona, jeśli pliki zostaną usunięte”. Przywróciłem kopię zapasową i nie byłem pewien, dlaczego dwa inne identyczne katalogi miały różne rozmiary.
Tomasz Zieliński
11

Czasami 4096 bajtów jest najmniejszą jednostką alokacji dla niektórych systemów plików. Właśnie dlatego katalog ma 4096.

To samo dotyczy plików. Chociaż niektóre pliki mogą zgłaszać mniej niż 4096, w rzeczywistości zajmują co najmniej 4096 miejsca na dysku.

Pablo Santa Cruz
źródło
4
Tak, jak powiedział Pablo. Rozmiar, na który patrzysz z plikiem, to rozmiar zawartości pliku, a nie rozmiar dysku. Rozmiar tych małych plików na dysku wynosi w rzeczywistości 4096, podobnie jak katalog, ponieważ może on alokować miejsce na dysku tylko w blokach tego rozmiaru
Dan McGrath
1
To nie ma nic wspólnego z pytaniem.
harrymc
To jest niepoprawne. Zobacz zaakceptowaną odpowiedź.
Duncan X Simpson
Błędny? Czy to nie jest kombinacja obu odpowiedzi? 4096 to rozmiar strony, zobacz systemy stronicowania pamięci, aby uzyskać więcej informacji.
Harrichael
5

4096 jest zarezerwowany w celu zmniejszenia fragmentacji, ponieważ często rzeczywisty rozmiar zawartych metadanych zmienia się w zależności od zawartości katalogu. Jeśli stale rośnie i kurczy się (powiedzmy, że zawiera pliki dziennika lub zawartość dynamiczną) z czasem może to zaszkodzić wydajności. Prawdopodobnie nie zdarzyło się to w przypadku jednego folderu, ale w całym systemie plików byłoby to szybko dodawane.

MDMarra
źródło
3

To zależy od systemu plików. Na ext2 / 3/4 jest to „4096. Na reiserfs może to być 9608 (mój $HOME) 1032 ( /tmp) lub 48 (niektóre reż /tmp.).

Domyślnie w bloku ext2 / 3/4 jest 4096 - i plik nie może zająć mniej. Jeśli plik jest mniejszy, to i tak zajmuje cały blok. Ponieważ nie ma sensu pytać o logiczny rozmiar katalogu, a ta informacja i tak prawdopodobnie nie znajduje się na dysku i musi coś zgłosić, raportując rozmiar bloku razy liczbę wykonanych bloków, tj. Zajmowaną przestrzeń fizyczną.

Maciej Piechotka
źródło
Jestem pewien, że rozmiar pliku również nie jest przechowywany z plikami. Obliczany jest w razie potrzeby. Ale w przypadku plików zgłasza actualrozmiar pliku.
Lazer
1
Rozmiar pliku jest przechowywany z i-węzłem. Na pewno i-węzeł ext2 zawiera w sobie rozmiar w bajtach. W przeciwnym razie niemożliwe byłoby ustalenie, gdzie kończy się plik, ponieważ \0jest to charakter prawny w plikach binarnych. PS. Możliwe jest tworzenie FS, które go nie przechowują - ale po prostu nie wysyłają rodzinnie (i prawdopodobnie nie są to żadne inne popularne).
Maciej Piechotka