W jaki sposób katalogi są implementowane w systemach plików Unix?


19

Moje pytanie brzmi: w jaki sposób wdrażane są katalogi? Wierzę w strukturę danych taką jak zmienna, np. Tabela, tablica lub podobne. Ponieważ UNIX jest Open Source, mogę sprawdzić w źródle, co robi program, gdy utworzył nowy katalog. Czy możesz mi powiedzieć, gdzie szukać lub rozwinąć temat? Czy katalog „jest” plikiem, który mógłbym zrozumieć i czy katalog jest rzeczywiście plikiem? Nie jestem pewien, czy to prawda, że ​​pliki są przechowywane „w” plikach, ale nadal można powiedzieć słowo plik o prawie wszystkim i nie jestem pewien, co absolutnie nie jest plikiem, ponieważ można nazwać nawet zmienną plik. Na przykład link z pewnością nie jest plikiem, a link jest jak katalog, ale to narusza to, że katalog jest plikiem?


1
Czy interesuje Cię jakiś konkretny system plików?
Ignacio Vazquez-Abrams,

3
W systemie UNIX wszystko jest plikiem (mądrość historyczna). Ale nie każdy system UNIX jest oprogramowaniem typu open source. Gnu to nie Unix, wiesz? Open Solaris jest uniksowym oprogramowaniem typu open source, podczas gdy Linux jest tylko systemem operacyjnym typu unixoid. :) I tak - systemy plików - Reiserfs? Ext2-3-4? XFS? NFS?
użytkownik nieznany

2
Link to tak naprawdę plik.
mattdm,

5
Symboliczny link jest plikiem. Twarde łącze jest krawędzią na grafie systemu plików.
dmckee,

3
Reklama: możesz być zainteresowany propozycją witryny rozwoju systemów operacyjnych .
Gilles 'SO - przestań być zły'

Odpowiedzi:


22

Wewnętrzna struktura katalogów zależy od używanego systemu plików. Jeśli chcesz dokładnie wiedzieć, co się dzieje, spójrz na implementacje systemu plików.

Zasadniczo w większości systemów plików katalog jest tablicą asocjacyjną między nazwami plików (klucze) a numerami i-węzłów (wartości). Coś takiego :¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

Ta lista jest zakodowana w mniej lub bardziej wydajny sposób w łańcuchu (zwykle) bloków 4KB. Zauważ, że zawartość zwykłych plików jest przechowywana podobnie. W przypadku katalogów nie ma sensu wiedzieć, jaki rozmiar jest rzeczywiście używany w tych blokach. Dlatego rozmiary katalogów zgłaszane przez dusą wielokrotnościami 4KB.

I-węzły służą do wiązania bloków ze sobą, tworząc jeden byt, mianowicie „plik” w sensie ogólnym. Są one identyfikowane przez numer, który jest jakimś adresem, a każdy z nich jest zwykle przechowywany jako pojedynczy, specjalny blok.

Zarządzanie tym wszystkim odbywa się w trybie jądra. Oprogramowanie prosi tylko o utworzenie katalogu z funkcją o nazwie int mkdir(const char *pathname, mode_t mode);prowadzącej do wywołania systemowego, a cała reszta odbywa się za kulisami.

Informacje o strukturze linków:

Twardy link nie jest plikiem, to po prostu nowy wpis do katalogu (tj. Skojarzenie nazwa - numer i-węzła ) odnoszący się do istniejącej jednostki i-węzła². Oznacza to, że do tego samego i-węzła można uzyskać dostęp z różnych nazw ścieżek. W szczególności, ponieważ metadaty (uprawnienia, własność, znaczniki czasu…) są przechowywane w obrębie i-węzła, są one unikalne i niezależne od nazwy ścieżki wybranej do uzyskania dostępu do pliku.

Dowiązanie symboliczne to plik, który różni się od celu. Oznacza to, że ma swój własny i-węzeł. Kiedyś był traktowany jak zwykły plik: ścieżka docelowa była przechowywana w bloku danych. Ale teraz, ze względu na wydajność w najnowszych systemach plików ext , ścieżki krótsze niż 60 bajtów są przechowywane w samym i-węzle (za pomocą pól, które normalnie byłyby używane do przechowywania wskaźników do bloków danych).

-
1. uzyskano to przy użyciu ls -ai1 testdir.
2. którego typ musi być obecnie inny niż „katalog”.


Dziękuję za opracowanie, dzięki czemu mogę zrozumieć różnicę między katalogami a plikami na poziomie programowym.
Niklas

12

Aby rozwinąć post od Stéphane Gimeneza, utworzenie nowego katalogu to proces tworzenia nowego i-węzła o wartości st_mode S_IFDIR (z trybem uprawnień), tworząc dwa wpisy w pierwszym bloku danych nowego i-węzła za pomocą linku ( 2) wywołanie systemowe: „.” który wskazuje na ten nowy i-węzeł i „..”, który wskazuje na katalog nadrzędny, a następnie tworzy pozycję w katalogu nadrzędnym z i-węzłem i nazwą nowego katalogu - pierwsza i ostatnia część są wykonywane przez wywołanie systemowe mknod ( 2). Poza tym obecnie tylko root może używać mknod (2) do takich zadań, o których mówimy.

Na przykład mkdir("/home/larry.user/xyzzy", 0666)jest zasadniczo następujący (był to kod C z dni SysV [1]):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, „Programowanie systemu UNIX”, 1987, s. 69–71.

Było to zbyt podatne na błędy (i jeden z głównych powodów fsck), dlatego utworzono wywołanie systemowe mkdir (2), aby móc to zrobić za Ciebie.

Zauważ, że za pomocą mknod (2) można utworzyć obiekt amy systemu plików: zwykły plik, katalog, plik urządzenia, dowiązanie symboliczne itp. Tak więc, aby odpowiedzieć na jedno z pytań OP, tak, katalog jest plikiem, co oznacza powiedzenie „it to obiekt reprezentowany przez i-węzeł, rezydujący w systemie plików, który zachowuje się z interfejsem we / wy ".


Dziękuję za bardzo interesującą odpowiedź. Rozumiem i myślę, że mogę także zajrzeć do źródła programu, touchktóry tworzy pusty plik i zobaczyć, co robi.
Niklas

2

jeśli chcesz uzyskać więcej informacji na temat systemów plików Unix / Linux, polecam 2 książki Zrozumienie jądra systemu Linux i rozwoju jądra systemu Linux . To są najlepsze książki do zrozumienia jądra Linuksa.

W systemach uniksowych „Common File Model” każdy katalog jest traktowany jako plik zawierający listę plików i katalogów.

W VFS (Virtual File Systems) katalogi są reprezentowane w strukturze o nazwie dentry. Jest dentry to struktura C z nazwą łańcucha ( d_name ), wskaźnikiem do i-węzła ( d_inode ) i wskaźnikiem do protezy macierzystej ( d_parent ). I-węzeł to struktura do obsługi informacji o pliku w systemie plików. Na przykład, jeśli masz katalog /tmp/test/foo, VFS utworzy obiekt dentry dla każdego komponentu w nazwie ścieżki. SO utworzy zatem obiekt dentystyczny /, drugi obiekt dentystyczny do testwpisania katalogu głównego i trzeci obiekt dentystyczny do foowpisu katalogu testowego.


Dziękuję Dimitri. Chcę zrozumieć, dlaczego niektóre projekty wybrały określoną strukturę danych, taką jak B-Tree, drzewo binarne, trie lub tablica asocjacyjna. Myślę, że ważne jest, aby wybrać odpowiednią strukturę danych / model danych. Poznanie różnych implementacji daje szczegóły, których szukam.
Niklas

1

Możesz zacząć od przeczytania http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Aby uzyskać więcej informacji, skorzystaj z doskonałej klasycznej książki „Projektowanie i wdrażanie systemu operacyjnego 4.4 BSD”.


Dzięki za link. Rozumiem, że oba pliki to katalogi, w zasadzie są to tablice interpretowane jako pliki lub katalogi. Proszę mnie poprawić, jeśli się mylę.
Niklas

1
Katalogi są tradycyjnie tylko specjalnie sformatowanymi plikami, ale nie jest to już prawdą: en.wikipedia.org/wiki/ReiserFS#Design W ReiserFS i niektórych innych katalogach są wpisy w bazie danych. Katalogi mogą działać jak tablice, ale to tylko abstrakcja programowania.
Bruce Ediger,

Dziękuję bardzo za wskazanie szczegółów. Teraz myślę, że rozumiem więcej, jak działają systemy plików, wciąż zastanawiam się, jak i dlaczego program locatedziała i jak to się wiąże z aktualizacją programu do zlokalizowania poprzez uruchomienie updatedb(spec używam PC-BSD, DragonflyBSD i Ubuntu Natty podczas uruchamiania z Live CD i testowania różnych instalacji i interfejsy)
Niklas
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.