A barra (/) faz parte do nome do diretório raiz do Linux?

46

A barra ( /) realmente faz parte do nome do diretório raiz do Linux? Ou é apenas um símbolo para isso?

Que /etctal e assim por diante?

Atualizar

Suponha que /dev/sda2seja o dispositivo de bloco de um diretório raiz do Linux.

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24 / mar / 2018)
debugfs:   pwd
[pwd] INODE: 2 CAMINHO: /
[raiz] INODE: 2 CAMINHO: /
debugfs:   stat /
Inode: 2    Tipo: diretório     Modo: 0755 Sinalizadores: 0x80000
Geração: 0 Versão: 0x00000000: 00000077
Usuário: 0 Grupo: 0 Projeto: 0 Tamanho: 4096
Arquivo ACL: 0
Links: 25 Quantidade: 8
Fragmento: Endereço: 0 Número: 0 Tamanho: 0
 Por favor, digite seu e-mail do Facebook para receber um link de criação de senha.
 Atime: 0x5b13ca0f: 3b3ee380 - Dom Jun 3 15:29:27 2018
 Mtime: 0x5b13c9f1: 3f017990 - Dom Jun 3 15:28:57 2018
Crtime: 0x5aad1843: 00000000 - sáb 17 mar 16:59:39 2018
Tamanho dos campos extra de inode: 32
EXTENSÕES:
(0): 9249

Portanto, há um diretório lá, no inode # 2, mas não tem um nome.

mlibre
fonte
1
Em relação à sua atualização recente, mostrando alguma debugfssaída. Você pode esclarecer como isso muda a questão?
Kusalananda
Não tem. Eu só queria completar as respostas. mas eu não queria adicionar outro. então eu atualizei. se vc pode colocar thease linha em sua resposta em vão excluí-los
mlibre

Respostas:

61

O padrão POSIX.1-2008 diz

Um nome de caminho que consiste em um único /deve ser resolvido no diretório raiz do processo. Um nome de caminho nulo não deve ser resolvido com êxito.

O padrão ainda faz uma distinção entre nomes de arquivos e nomes de caminhos . /é o nome do caminho para o caminho do diretório raiz. O nome do diretório é "o diretório raiz", mas no sistema de arquivos é sem nome, não possui um nome de arquivo. Se tivesse um nome de arquivo, esse nome seria uma entrada de diretório no diretório acima do diretório raiz e não existe esse diretório.

O caractere /nunca pode fazer parte de um nome de arquivo, pois é o separador de caminho.

Para maior clareza: /não é o nome do diretório raiz, mas o caminho para ele, o nome do caminho .

/etcé outro nome de caminho. É o nome do caminho absoluto para o etcdiretório. O nome do diretório nesse caminho é etc(seu nome do arquivo é etc).

/usr/local/bin/curlé o nome do caminho do curlarquivo executável da mesma maneira que /etco nome do caminho do etcdiretório.

Kusalananda
fonte
"Se tivesse um nome de arquivo, esse nome seria uma entrada de diretório no diretório acima do diretório raiz". Seriam duas coisas, tecnicamente - número e nome do inode (que, como sabemos, é o inode 2). Também é interessante observar que /..aponta para trás /e /possui uma entrada de diretório para si - esse é o bom e velho /.; todas essas 3 coisas estão apontando para o mesmo inode - 2.
Sergiy Kolodyazhnyy 03/06
@SergiyKolodyazhnyy Tecnicamente , o diretório raiz é "por processo", o que importa em ambientes chroot. Em um chroot, o número de inode do diretório raiz não seria um número específico (seria o número de inode da raiz chroot). Além disso, acho que o número 2 (em situações sem chroot) depende do sistema de arquivos usado.
Kusalananda
Também notei que isso /é definido em termos de raiz por processo, mas não sabia que o inode chrootnão é necessariamente 2. Um fato muito interessante. Também levanta uma questão de qual é o /diretório para processos privilegiados do kernel. Isso significa que apenas os processos de espaço do usuário têm os /quais eles se associam?
Sergiy Kolodyazhnyy 03/06
37

barra é um separador ; os nomes de diretório não incluem separadores, mas os nomes de caminho completos incluem os separadores.

Portanto, o "nível raiz" / não tem nome . Na maioria dos sistemas tipo Unix, isso é tratado como um caso especial .e ..(embora, é claro, não exista diferença entre os dois no nível raiz).

Nomenclatura pode ser diferente. O POSIX.1-2017, por exemplo, lista algumas definições comumente usadas :

  • 3.2 Nome do caminho absoluto

    Um nome de caminho que começa com um ou mais de dois <slash>caracteres; veja também Pathname .

  • 3.271 Nome do caminho

    Uma sequência usada para identificar um arquivo. No contexto de POSIX.1-2008, um nome de caminho pode ser limitado a bytes {PATH_MAX}, incluindo o byte nulo final. Possui <slash>caracteres iniciais opcionais , seguidos por zero ou mais nomes de arquivos separados por <slash>caracteres. Um nome de caminho pode opcionalmente conter um ou mais <slash>caracteres finais . Vários <slash>caracteres sucessivos são considerados iguais a um <slash>, exceto no caso de exatamente dois <slash>caracteres iniciais .

    Nota: Se um nome de caminho consistir em apenas bytes correspondentes a caracteres do conjunto de caracteres de nome de arquivo portátil (consulte Conjunto de Caracteres de Nome de Arquivo Portátil ), <slash>caracteres e uma única terminação<NUL>caractere, o nome do caminho será utilizável como uma sequência de caracteres em todos os locais suportados; caso contrário, o nome do caminho pode ser apenas uma sequência (em vez de uma sequência de caracteres). Além disso, como a codificação de byte único do <slash>caractere deve ser a mesma em todos os locais e não ocorrer em um caractere de vários bytes, as referências a um <slash>caractere em um nome de caminho são bem definidas, mesmo quando o nome do caminho não é um caractere corda. No entanto, essa propriedade não é necessariamente válida para os caracteres restantes no conjunto de caracteres do nome do arquivo portátil.

  • 3.272 Componente do nome do caminho

    Consulte Nome do arquivo em Nome do arquivo .

  • 3.170 Nome do arquivo

    Uma sequência de bytes que consiste em 1 em {NAME_MAX}bytes usada para nomear um arquivo. Os bytes que compõem o nome não devem conter os caracteres <NUL>ou <slash>. No contexto de um nome de caminho, cada nome de arquivo deve ser seguido por um <slash>ou um <NUL>caractere; em outro lugar, um nome de arquivo seguido por um <NUL>caractere forma uma sequência de caracteres (mas não necessariamente uma sequência de caracteres). Os nomes dos arquivos pontuam e dot-dottêm um significado especial. Um nome de arquivo às vezes é chamado de "componente do nome do caminho". Veja também Pathname .

Então ... se você estiver procurando esclarecimentos , talvez essa não seja sua primeira parada. Tutoriais como esta página de conceitos do UNIX são úteis, por exemplo, apontando que "nome do caminho completo" é sinônimo de "nome do caminho" absoluto ".

Thomas Dickey
fonte
3
Nitpick: ponto e ponto são nomes de arquivos, não nomes de caminhos. Na verdade, o padrão POSIX possui a curiosa formulação "Como um caso especial, no diretório raiz, ponto-ponto pode se referir ao próprio diretório raiz". (minha ênfase).
Kusalananda
Portanto, ler a especificação na letra /não é um nome de arquivo ou componente de nome de caminho válido e não é uma string que contém esses componentes, mas ainda é um nome de caminho completamente válido para um determinado diretório. O que tem que existir, embora a parte que exige isso não mencione seu "nome". De alguma forma, acho isso um pouco divertido.
21916 ilkkachu
É respondida no POSIX : Possui caracteres iniciais opcionais, seguidos por zero ou mais nomes de arquivos separados por caracteres.
21416 Thomas Thomas Dickey
@Kusalananda revise a lógica das especificações para sua ênfase. o may in spec define é uma declaração clara de garantia com relação aos testes de implementação. onde may é usado, as especificações garantem qualquer aderente ao comportamento definido. em outras palavras, qualquer implementação pode depender ..da /vinculação /.
precisa saber é o seguinte
19

No Unix, arquivos (e diretórios são apenas arquivos) não possuem "nomes". Links têm nomes, links são entradas em um diretório que mapeia nomes para arquivos.

Você pode dizer que os links dão nomes aos arquivos, mas observe: isso implica que um arquivo pode ter mais de um nome, pois pode ter mais de um link.

Como o diretório raiz é, bem, o diretório raiz, não há um diretório "superior" dentro do qual possa haver um link para ele, portanto, não pode haver um nome associado a ele. Teoricamente, seria possível adicionar um link ao diretório raiz dentro de outro diretório, mas a maioria dos Unices proíbe adicionar links aos diretórios existentes, pois isso pode levar a ciclos na hierarquia do sistema de arquivos (que na verdade é um gráfico direcionado) e detectar ciclos. em um gráfico é caro, mas não detectá-los pode levar a uma recursão infinita ao tentar resolver nomes no kernel.

Então, basicamente, o diretório raiz não tem nome, porque não há diretório acima dele dentro do qual possamos gravar o nome.

Como foi apontado em outras respostas, precisamos distinguir entre um nome e um caminho (nome). O diretório raiz pode ser consultado através do caminho (nome) /.

Jörg W Mittag
fonte
Sim, os arquivos podem ter mais de um nome, assim como as pessoas. O marido da minha filha mais nova normalmente atende pelo nome do meio, mas ele obviamente tem que responder também ao primeiro nome. O nome principal do diretório raiz é "/", pronunciado "barra", porque seu nome de caminho absoluto é "/" (e nomes baseados em nomes de caminho relativos não são particularmente úteis). (Chamar de "root" corre o risco de confusão com "/ root", que sempre deve ser chamada de "barra de raiz".
Monty Harder
1
Eu gosto do ponto que ele não tem nome porque não há diretório mais alto para gravar esse nome. Isso esclarece bem o conceito.
30716 Joe
7

O uso da palavra "nome" é um pouco flexível; pode se referir a um "nome completo do caminho"; pode se referir à "entrada de diretório"; pode se referir ao "nome do arquivo" passado para várias funções ou rotinas.

Assim, por exemplo, /etc/fooe /var/tmp/../../etc/fooe /tmp/../../../../../../foosão todas as maneiras de se referir ao mesmo arquivo; todos são nomes válidos , como foono /etcdiretório.

Então, vamos voltar ao básico.

Um nome de arquivo no unix é composto de componentes separados pelo separador de diretório /. Praticamente a única restrição aos componentes é que eles não podem conter os /caracteres ou NUL; qualquer outra coisa é permitida.

Assim, o "nome do caminho totalmente qualificado" de /etcé a sequência completa: /etc. Isso significa que ele possui o etccomponente no diretório raiz.

Da mesma forma /x/y/z/footeria o foocomponente no /x/y/zdiretório

Agora, o diretório raiz é único, pois não possui componente em um diretório pai; -lo única tem o caminho completo como o seu nome: /.

Stephen Harris
fonte