La barra (/) fa parte del nome della directory principale di Linux?


46

Slash ( /) fa davvero parte del nome della directory principale di Linux? O è solo un simbolo per questo?

Che dire /etce così via?

Aggiornare

Supponiamo che /dev/sda2sia il dispositivo a blocchi di una directory principale di Linux.

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24-mar-2018)
debugfs:   pwd
[pwd] INODO: 2 PERCORSO: /
[root] INODO: 2 PERCORSO: /
debugfs:   stat /
Inodo: 2    Tipo: directory     Modalità: 0755 Flag: 0x80000
Generazione: 0 Versione: 0x00000000: 00000077
Utente: 0 Gruppo: 0 Progetto: 0 Dimensione: 4096
File ACL: 0
Collegamenti: 25 Blockcount: 8
Frammento: Indirizzo: 0 Numero: 0 Dimensione: 0
 ctime: 0x5b13c9f1: 3f017990 - dom 3 giu 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - dom 3 giu 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - dom 3 giu 15:28:57 2018
crtime: 0x5aad1843: 00000000 - sab 17 mar 16:59:39 2018
Dimensione dei campi inode aggiuntivi: 32
ESTENSIONI:
(0): 9249

Quindi c'è una directory lì dentro, inode # 2, ma non ha un nome.


1
Per quanto riguarda il tuo recente aggiornamento che mostra alcuni debugfsoutput. Puoi chiarire come questo cambia la domanda?
Kusalananda

Non è così. Volevo solo completare le risposte. ma non volevo aggiungerne un altro. così l'ho aggiornato. se riesci a inserire la riga nella tua risposta, li eliminerai
martedì

Risposte:


61

Lo standard POSIX.1-2008 dice

Un percorso composto da un singolo /deve essere risolto nella directory principale del processo. Un percorso null non deve essere risolto con successo.

Lo standard fa inoltre una distinzione tra nomi di file e nomi di percorsi . /è il nome percorso per il percorso della directory principale. Il nome della directory è "la directory principale", ma nel filesystem è senza nome, non ha un nome file. Se avesse un nome file, quel nome sarebbe una voce della directory nella directory sopra la directory root e non esiste tale directory.

Il personaggio /non può mai far parte di un nome file in quanto è il separatore di percorso.

Per chiarezza: /non è il nome della directory principale, ma il percorso , il nome percorso .

/etcè un altro nome di percorso. È il nome del percorso assoluto della etcdirectory. Il nome della directory in quel percorso è etc(il suo nome file è etc).

/usr/local/bin/curlè il percorso del curlfile eseguibile nello stesso modo in cui /etcè il percorso della etcdirectory.


"Se avesse un nome file, quel nome sarebbe una voce della directory nella directory sopra la directory root" Sarebbe due cose, tecnicamente - numero di inode e nome (che come sappiamo è inode 2). È anche interessante notare che /..rimanda a /, e /ha una voce di directory per sé - questo è il buon vecchio /.; tutte queste 3 cose indicano lo stesso inode - 2.
Sergiy Kolodyazhnyy il

@SergiyKolodyazhnyy Tecnicamente , la directory principale è "per processo", che conta negli ambienti chroot. In un chroot, il numero di inode della directory radice non sarebbe un numero particolare (sarebbe il numero di inode della radice chroot). Inoltre, penso che il numero 2 (in situazioni non chroot) dipenda dal filesystem utilizzato.
Kusalananda

Ho anche notato che /è definito in termini di root per processo ma non sapevo che l'inode in chrootnon fosse necessariamente 2. Fatto molto interessante. Solleva anche una domanda su quale sia la /directory per i processi del kernel privilegiati. Ciò significa che solo i processi dello spazio utente hanno /con cui si associano?
Sergiy Kolodyazhnyy,

37

slash è un separatore ; i nomi di directory non includono i separatori, ma i nomi di percorso completi includono i separatori.

Quindi il "livello root" / non ha nome . Sulla maggior parte dei sistemi simili a Unix, questo è trattato come un caso speciale simile ( .e ..ovviamente non c'è differenza tra i due a livello di root).

La nomenclatura può differire. POSIX.1-2017, ad esempio, elenca alcune definizioni comunemente utilizzate :

  • 3.2 Percorso assoluto

    Un percorso che inizia con un singolo o più di due <slash>caratteri; vedi anche Pathname .

  • 3.271 Nome percorso

    Una stringa utilizzata per identificare un file. Nel contesto di POSIX.1-2008, un percorso può essere limitato a {PATH_MAX} byte, incluso il byte null di terminazione. Ha <slash>caratteri iniziali opzionali , seguiti da zero o più nomi di file separati da <slash>caratteri. Un percorso può contenere facoltativamente uno o più <slash>caratteri finali . Più <slash>personaggi successivi sono considerati uguali a uno <slash>, tranne nel caso di esattamente due <slash>personaggi principali .

    Nota: se un percorso è composto solo da byte corrispondenti a caratteri del set di caratteri del nome file portatile (vedere Set di caratteri del nome file portatile ), <slash>caratteri e una singola terminazione<NUL>carattere, il percorso sarà utilizzabile come stringa di caratteri in tutte le impostazioni locali supportate; in caso contrario, il percorso potrebbe essere solo una stringa (anziché una stringa di caratteri). Inoltre, poiché la codifica a byte singolo del <slash>carattere deve essere la stessa in tutte le locali e non deve avvenire all'interno di un carattere a più byte, i riferimenti a un <slash>carattere all'interno di un nome di percorso sono ben definiti anche quando il nome di percorso non è un carattere corda. Tuttavia, questa proprietà non è necessariamente valida per i caratteri rimanenti nel set di caratteri del nome file portatile.

  • 3.272 Componente percorso

    Vedi Nome file in Nome file .

  • 3.170 Nome file

    Una sequenza di byte composta da 1 a {NAME_MAX}byte utilizzata per denominare un file. I byte che compongono il nome non devono contenere i caratteri <NUL>o <slash>. Nel contesto di un nome percorso, ciascun nome file deve essere seguito da un <slash>o un <NUL>carattere; altrove, un nome file seguito da un <NUL>carattere forma una stringa (ma non necessariamente una stringa di caratteri). I nomi dei file punteggiano e dot-dothanno un significato speciale. Un nome file viene talvolta definito "componente nome percorso". Vedi anche Pathname .

Quindi ... se stai cercando chiarimenti , quella potrebbe non essere la tua prima tappa. Tutorial come questa pagina Concetti di UNIX sono utili, ad esempio, sottolineando che "nome percorso completo" è sinonimo di "nome percorso" assoluto ".


3
Nitpick: punto e punto-punto sono nomi di file, non nomi di percorsi. In realtà, lo standard POSIX ha la curiosa formulazione "Come caso speciale, nella directory root, dot-dot può riferirsi alla directory root stessa." (la mia enfasi).
Kusalananda

Quindi, leggere la specifica alla lettera, /non è un nome file valido o un componente nome percorso, e non è una stringa che contiene tali componenti ma è comunque un nome percorso completamente valido per una determinata directory. Che deve esistere, anche se la parte che lo richiede non menziona il suo "nome". In qualche modo, lo trovo leggermente divertente.
ilkkachu,

Ha una risposta in POSIX : ha caratteri iniziali opzionali, seguiti da zero o più nomi di file separati da caratteri.
Thomas Dickey,

@Kusalananda esamina la motivazione della tua enfasi. il may in spec definisce è una chiara dichiarazione di fideiussione per quanto riguarda i test di implementazione. dove può essere utilizzato, le specifiche assicurano qualsiasi membro in erba aderente al comportamento definito. In altre parole, qualsiasi implementazione può contare su ..al /collegamento /.
mikeserv,

19

In Unix, i file (e le directory sono solo file) non hanno "nomi". I collegamenti hanno nomi, i collegamenti sono voci in una directory che associa i nomi ai file.

Si potrebbe dire che i collegamenti danno nomi ai file, ma nota: questo implica che un file può avere più di un nome, poiché può avere più di un collegamento.

Dato che la directory root è, beh, la directory root, non esiste una directory "superiore" all'interno della quale potrebbe esserci un link, quindi non può esserci un nome associato. In teoria sarebbe possibile aggiungere un collegamento alla directory principale all'interno di qualche altra directory, ma la maggior parte degli Unices proibisce l'aggiunta di collegamenti alle directory esistenti, perché può portare a cicli nella gerarchia del filesystem (che in realtà è un grafico diretto) e rilevare cicli in un grafico è costoso, ma non rilevarli può portare a una ricorsione infinita quando si cerca di risolvere i nomi all'interno del kernel.

Quindi, in sostanza, la directory principale non ha un nome, perché non esiste alcuna directory al di sopra della quale possiamo registrare il nome.

Come è stato sottolineato in altre risposte, dobbiamo distinguere tra un nome e un percorso (nome). È possibile fare riferimento alla directory principale tramite il percorso (nome) /.


Sì, i file possono avere più di un nome, proprio come le persone. Il marito di mia figlia più giovane di solito porta il suo secondo nome, ma ovviamente deve rispondere anche al suo nome. Il nome principale della directory principale è "/", pronunciato "barra", perché il suo nome di percorso assoluto è "/" (e i nomi basati su nomi di percorso relativi non sono particolarmente utili). (Chiamarlo "root" rischia di confondersi con "/ root", che dovrebbe sempre essere chiamato "slash root".
Monty Harder

1
Mi piace il fatto che non abbia un nome perché non esiste una directory più alta in cui registrare quel nome. Ciò chiarisce bene il concetto.
Joe,

7

L'uso della parola "nome" è un po 'flessibile; può fare riferimento a un "nome percorso completo"; potrebbe riferirsi alla "voce della directory"; potrebbe riferirsi al "nome file" passato a varie funzioni o routine.

Così, per esempio, /etc/fooe /var/tmp/../../etc/fooe /tmp/../../../../../../foosono tutti i modi di fare riferimento allo stesso file; sono tutti nomi validi , come fooquando nella /etcdirectory.

Quindi torniamo alle basi.

Un nome file in unix è composto da componenti separati dal separatore di directory /. Praticamente l'unica limitazione ai componenti è che non possono contenere i /caratteri o NUL; tutto il resto è permesso.

Così il "percorso completo" di /etcè la stringa completa: /etc. Ciò significa che ha il etccomponente nella directory principale.

Allo stesso modo /x/y/z/fooavrebbe il foocomponente nella /x/y/zdirectory.

Ora la directory principale è unica in quanto non ha alcun componente in una directory padre; essa soltanto ha il percorso completo come il suo nome: /.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.