Czy ukośnik (/) jest częścią nazwy katalogu głównego Linux?


46

Czy slash ( /) jest naprawdę częścią nazwy katalogu głównego Linux? A może to tylko symbol?

A co z tym /etci tak dalej?

Aktualizacja

Załóżmy, że /dev/sda2jest urządzeniem blokowym katalogu głównego Linux.

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24-mar-2018)
debugfs:   pwd
[pwd] INODE: 2 PATH: /
[root] INODE: 2 PATH: /
debugfs:   stat /
I-węzeł: 2    Typ: katalog     Tryb: 0755 Flagi: 0x80000
Generacja: 0 Wersja: 0x00000000: 00000077
Użytkownik: 0 Grupa: 0 Projekt: 0 Rozmiar: 4096
Plik ACL: 0
Linki: 25 Blockcount: 8
Fragment: Adres: 0 Liczba: 0 Rozmiar: 0
 ctime: 0x5b13c9f1: 3f017990 - niedz. 3 czerwca 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - niedz. 3 czerwca 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - niedz. 3 czerwca 15:28:57 2018
crtime: 0x5aad1843: 00000000 - sob. mar 17 16:59:39 2018
Rozmiar dodatkowych pól i-węzłów: 32
ZAKRESY:
(0): 9249

Jest tam więc katalog, i-węzeł # 2, ale nie ma on nazwy.


1
Jeśli chodzi o twoją ostatnią aktualizację pokazującą niektóre debugfswyniki. Czy możesz wyjaśnić, jak to zmienia pytanie?
Kusalananda

Nie jest. Chciałem tylko uzupełnić odpowiedzi. ale nie chciałem dodawać kolejnego. więc to zaktualizowałem. jeśli umieścisz wiersz odpowiedzi w odpowiedzi, usuniesz je
mlibre

Odpowiedzi:


61

Standard POSIX.1-2008 mówi

Ścieżka składająca się z pojedynczej nazwy /powinna zostać przeniesiona do katalogu głównego procesu. Ścieżka zerowa nie może zostać pomyślnie rozwiązana.

Norma wprowadza także rozróżnienie między nazwami plików i ścieżkami . /to nazwa ścieżki do katalogu głównego. Nazwa katalogu to „katalog główny”, ale w systemie plików nie ma nazwy, nie ma nazwy pliku. Gdyby miała nazwę pliku, nazwa ta byłaby pozycją katalogu w katalogu nad katalogiem głównym, a takiego katalogu nie ma.

Znak /nigdy nie może być częścią nazwy pliku, ponieważ jest separatorem ścieżki.

Dla jasności: /nie jest to nazwa katalogu głównego, ale ścieżka do niego, jego ścieżka .

/etcto inna nazwa ścieżki. Jest to nazwa bezwzględnej ścieżki do etckatalogu. Nazwa katalogu w tej ścieżce to etc(nazwa pliku to etc).

/usr/local/bin/curljest ścieżką do curlpliku wykonywalnego w taki sam sposób, /etcjak ścieżkę do etckatalogu.


„Gdyby miał nazwę pliku, nazwa ta byłaby pozycją katalogu w katalogu nad katalogiem głównym” Technicznie byłyby to dwie rzeczy - numer i nazwa i-węzła (jak wiemy, to i-węzeł 2). Warto również zauważyć, że /..wskazuje na to /i /ma dla siebie pozycję w katalogu - to stare dobre /.; wszystkie te 3 rzeczy wskazują na ten sam i-węzeł - 2.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Technicznie katalog główny to „na proces”, co ma znaczenie w środowiskach chroot. W chroocie numerem i-węzła katalogu głównego nie byłby konkretny numer (byłby to numer i-węzła katalogu głównego chroot). Myślę też, że liczba 2 (w sytuacjach bez chrootowania) zależy od używanego systemu plików.
Kusalananda

Zauważyłem również, że /jest to zdefiniowane w kategoriach katalogu głównego na proces, ale nie wiedziałem, że i-węzeł chrootniekoniecznie musi być 2. Bardzo interesujący fakt. Rodzi to także pytanie, jaki jest /katalog uprzywilejowanych procesów jądra. Czy to oznacza, że ​​mają tylko procesy w przestrzeni użytkownika, /z którymi się kojarzą?
Sergiy Kolodyazhnyy

37

ukośnik jest separatorem ; nazwy katalogów nie zawierają separatorów, ale pełne nazwy ścieżek obejmują separatory.

Zatem „poziom root” / nie ma nazwy . W większości systemów uniksowych jest to traktowane jako szczególny przypadek podobny .do ..( i oczywiście nie ma różnicy między nimi na poziomie root).

Nomenklatura może się różnić. Na przykład POSIX.1-2017 zawiera listę często używanych definicji :

  • 3.2 Bezwzględna nazwa ścieżki

    Nazwa ścieżki rozpoczynająca się od jednego lub więcej niż dwóch <slash>znaków; patrz także Ścieżka .

  • 3.271 Nazwa ścieżki

    Ciąg używany do identyfikacji pliku. W kontekście POSIX.1-2008 nazwa ścieżki może być ograniczona do bajtów {PATH_MAX}, w tym kończącego bajtu zerowego. Ma opcjonalne <slash>znaki początkowe , po których następuje zero lub więcej nazw plików oddzielonych <slash>znakami. Nazwa ścieżki może opcjonalnie zawierać jeden lub więcej końcowych <slash>znaków. Wiele kolejnych <slash>znaków jest uważanych za takie same jak jeden <slash>, z wyjątkiem przypadku dokładnie dwóch wiodących <slash>znaków.

    Uwaga: jeśli nazwa ścieżki składa się tylko z bajtów odpowiadających znakom z przenośnego zestawu znaków nazwy pliku (patrz Przenośny zestaw znaków nazwy pliku ), <slash>znaków i jednego zakończenia<NUL>znak, nazwa ścieżki będzie użyteczna jako ciąg znaków we wszystkich obsługiwanych lokalizacjach; w przeciwnym razie nazwa ścieżki może być tylko ciągiem (a nie ciągiem znaków). Ponadto, ponieważ kodowanie jednobajtowe <slash>znaku musi być takie samo we wszystkich lokalizacjach narodowych i nie może występować w znaku wielobajtowym, odwołania do <slash>znaku w nazwie ścieżki są dobrze zdefiniowane, nawet jeśli nazwa ścieżki nie jest znakiem strunowy. Jednak ta właściwość niekoniecznie zachowuje pozostałe znaki w zestawie znaków przenośnej nazwy pliku.

  • 3.272 Składnik nazwy ścieżki

    Zobacz Nazwa pliku w Nazwa pliku .

  • 3.170 Nazwa pliku

    Sekwencja bajtów składająca się z 1 do {NAME_MAX}bajtów używanych do nazwania pliku. Bajty tworzące nazwę nie mogą zawierać znaków <NUL>lub <slash>. W kontekście nazwy ścieżki po każdej nazwie pliku następuje znak <slash>lub <NUL>; gdzie indziej nazwa pliku, po której następuje <NUL>znak, tworzy ciąg znaków (ale niekoniecznie ciąg znaków). Nazwy plików mają kropkę i dot-dotmają specjalne znaczenie. Nazwa pliku jest czasem nazywana „komponentem ścieżki”. Zobacz także Pathname .

Więc ... jeśli szukasz wyjaśnień , może to nie być twój pierwszy przystanek. Samouczki, takie jak ta strona z koncepcjami systemu UNIX, są pomocne, np. Wskazują, że „pełna ścieżka” jest synonimem „absolutnej” ścieżki.


3
Nitpick: kropka i kropka to kropki, a nie ścieżki. W rzeczywistości standard POSIX ma dziwne sformułowanie: „W specjalnym przypadku kropka-kropka może odnosić się do samego katalogu głównego”. (mój nacisk).
Kusalananda

Zatem odczytanie specyfikacji do litery /nie jest prawidłową nazwą pliku lub ścieżką i nie jest łańcuchem zawierającym takie komponenty, ale nadal jest całkowicie poprawną nazwą ścieżki dla jednego określonego katalogu. Co musi istnieć, choć część, która tego wymaga, nie wspomina o swojej „nazwie”. Jakoś uważam to za nieco zabawne.
ilkkachu

Odpowiedź w POSIX : Ma opcjonalne początkowe znaki, po których następuje zero lub więcej nazw plików oddzielonych znakami.
Thomas Dickey,

@Kusalananda zapoznaj się z uzasadnieniem swojego nacisku. maja w specyfikacjach także wyznacza wyraźne stwierdzenie poręczenia w odniesieniu do badań wdrożeniowych. gdzie można zastosować, specyfikacja zapewnia każdego początkującego zwolennika określonego zachowania. Innymi słowy, każda realizacja może polegać ..na /łączenie /.
mikeserv

19

W Uniksie pliki (i katalogi to tylko pliki) nie mają „nazw”. Linki mają nazwy, linki to wpisy w katalogu, które mapują nazwy na pliki.

Państwo może powiedzieć, że linki podać nazwy plików, ale uwaga: oznacza to, że plik może mieć więcej niż jedną nazwę, ponieważ może mieć więcej niż jeden link.

Ponieważ katalog główny jest katalogiem głównym, nie ma katalogu „wyżej”, w którym mógłby być link do niego, więc nie może być z nim powiązana nazwa. Teoretycznie byłoby możliwe dodanie linku do katalogu głównego w innym katalogu, ale większość Uniksów zabrania dodawania linków do istniejących katalogów, ponieważ może to prowadzić do cykli w hierarchii systemu plików (która jest w rzeczywistości grafem kierowanym) i wykrywania cykli na wykresie jest kosztowne, ale jego niewykrycie może prowadzić do nieskończonej rekurencji podczas próby rozpoznania nazw w jądrze.

Zasadniczo więc katalog główny nie ma nazwy, ponieważ nie ma nad nim katalogu, w którym moglibyśmy zapisać nazwę.

Jak wskazano w innych odpowiedziach, musimy rozróżnić nazwę od ścieżki (nazwy). Do katalogu głównego można się odwołać poprzez ścieżkę (nazwę) /.


Tak, pliki mogą mieć więcej niż jedną nazwę, tak jak ludzie. Mąż mojej młodszej córki zwykle nosi jego drugie imię, ale oczywiście musi również odpowiedzieć na swoje pierwsze imię. Główna nazwa katalogu głównego to „/”, wymawiane jako „ukośnik”, ponieważ jego bezwzględna nazwa ścieżki to „/” (a nazwy oparte na ścieżkach względnych nie są szczególnie pomocne). (Nazywanie go „rootem” grozi pomyleniem z „/ root”, które zawsze powinno się nazywać „slash root”.
Monty Harder

1
Podoba mi się to, że nie ma nazwy, ponieważ nie ma wyższego katalogu, w którym można by zapisać tę nazwę. To ładnie wyjaśnia tę koncepcję.
Joe

7

Użycie słowa „nazwa” jest nieco elastyczne; może odnosić się do „w pełni kwalifikowanej nazwy ścieżki”; może odnosić się do „wpisu katalogu”; może odnosić się do „nazwy pliku” przekazywanej do różnych funkcji lub procedur.

Tak więc, na przykład, /etc/fooa /var/tmp/../../etc/fooi /tmp/../../../../../../foosą wszystkie sposoby odnoszenia się do tego samego pliku; wszystkie są poprawnymi nazwami , tak jak foow /etckatalogu.

Wróćmy więc do podstaw.

Nazwa pliku w systemie UNIX składa się z komponentów oddzielonych separatorem katalogów /. Prawie jedynym ograniczeniem dotyczącym komponentów jest to, że nie mogą one zawierać /znaków NUL; wszystko inne jest dozwolone.

Więc „pełna nazwa ścieżka” /etcjest pełny ciąg: /etc. Oznacza to, że ma etcskładnik w katalogu głównym.

Podobnie /x/y/z/foomiałby fookomponent w /x/y/zkatalogu.

Teraz katalog główny jest unikalny, ponieważ nie ma żadnego komponentu w katalogu nadrzędnym; to tylko ma pełną ścieżkę jak sama nazwa: /.

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.