¿Es la barra inclinada (/) parte del nombre del directorio raíz de Linux?

46

¿Slash ( /) es realmente parte del nombre del directorio raíz de Linux? ¿O es solo un símbolo para ello?

¿Qué /etctal y así sucesivamente?

Actualizar

Supongamos que /dev/sda2es el dispositivo de bloque de un directorio raíz de Linux.

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24-mar-2018)
debugfs:   pwd
[pwd] INODE: 2 RUTA: /
[raíz] INODE: 2 RUTA: /
debugfs:   stat /
Inode: 2    Tipo:     modo de directorio : 0755 Banderas: 0x80000
Generación: 0 Versión: 0x00000000: 00000077
Usuario: 0 Grupo: 0 Proyecto: 0 Tamaño: 4096
Archivo ACL: 0
Enlaces: 25 Blockcount: 8
Fragmento: Dirección: 0 Número: 0 Tamaño: 0
 ctime: 0x5b13c9f1: 3f017990 - Dom 3 de junio 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - Dom 3 de junio 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - Dom 3 de junio 15:28:57 2018
crtime: 0x5aad1843: 00000000 - sáb mar 17 16:59:39 2018
Tamaño de campos de inodo extra: 32
EXTENSIONES
(0): 9249

Entonces hay un directorio allí, inodo # 2, pero no tiene un nombre.

mlibre
fuente
1
En cuanto a su actualización reciente que muestra algunos debugfsresultados. ¿Puedes aclarar cómo esto cambia la pregunta?
Kusalananda
No lo hace. Solo quería completar las respuestas. pero no quise agregar otro. así que lo actualicé si puede poner la línea deasease en su respuesta, los eliminará
mlibre

Respuestas:

61

El estándar POSIX.1-2008 dice

Un nombre de ruta que consta de un solo /se resolverá en el directorio raíz del proceso. Un nombre de ruta nulo no se resolverá con éxito.

El estándar además hace una distinción entre nombres de archivo y nombres de ruta . /es la ruta de acceso de la ruta del directorio raíz. El nombre del directorio es "el directorio raíz", pero en el sistema de archivos no tiene nombre, no tiene un nombre de archivo. Si tuviera un nombre de archivo, ese nombre sería una entrada de directorio en el directorio sobre el directorio raíz, y no existe dicho directorio.

El carácter /nunca puede ser parte de un nombre de archivo, ya que es el separador de ruta.

Para mayor claridad: /no es el nombre del directorio raíz, sino la ruta , su nombre de ruta .

/etcEs otro nombre de ruta. Es el nombre de la ruta absoluta al etcdirectorio. El nombre del directorio en esa ruta es etc(su nombre de archivo es etc).

/usr/local/bin/curles la ruta del curlarchivo ejecutable de la misma manera que /etcla ruta del etcdirectorio.

Kusalananda
fuente
"Si tuviera un nombre de archivo, ese nombre sería una entrada de directorio en el directorio sobre el directorio raíz" Técnicamente serían dos cosas: número y nombre de inodo (que como sabemos es inodo 2). También es interesante notar que /..apunta hacia atrás /y /tiene una entrada de directorio para sí misma, eso es lo bueno de siempre /.; todas esas 3 cosas apuntan al mismo inodo - 2.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Técnicamente , el directorio raíz es "por proceso", lo que importa en entornos chroot. En un chroot, el número de inodo del directorio raíz no sería un número particular (sería el número de inodo de la raíz de chroot). Además, creo que el número 2 (en situaciones no controladas) depende del sistema de archivos utilizado.
Kusalananda
También noté que /se define en términos de raíz por proceso, pero no sabía que el inodo chrootno es necesariamente 2. Hecho muy interesante. También plantea una pregunta sobre cuál es el /directorio para los procesos privilegiados del núcleo. ¿Eso significa que solo los procesos de espacio de usuario tienen /con los que se asocian?
Sergiy Kolodyazhnyy
37

la barra diagonal es un separador ; los nombres de directorio no incluyen separadores, pero los nombres de ruta completos incluyen los separadores.

Entonces el "nivel raíz" / no tiene nombre . En la mayoría de los sistemas tipo Unix, esto se trata como un caso especial .y ..(aunque, por supuesto, no hay diferencia entre los dos en el nivel raíz).

La nomenclatura puede diferir. POSIX.1-2017, por ejemplo, enumera algunas definiciones de uso común :

  • 3.2 Nombre de ruta absoluto

    Un nombre de ruta que comienza con uno o más de dos <slash>caracteres; ver también Pathname .

  • 3.271 Nombre de ruta

    Una cadena que se usa para identificar un archivo. En el contexto de POSIX.1-2008, un nombre de ruta puede estar limitado a {PATH_MAX} bytes, incluido el byte nulo de terminación. Tiene <slash>caracteres iniciales opcionales , seguidos de cero o más nombres de archivo separados por <slash>caracteres. Un nombre de ruta puede contener opcionalmente uno o más <slash>caracteres finales . Se <slash>considera que varios caracteres sucesivos son iguales a uno <slash>, excepto en el caso de exactamente dos <slash>personajes principales .

    Nota: Si un nombre de ruta consta de solo bytes correspondientes a caracteres del conjunto de caracteres de nombre de archivo portátil (consulte Conjunto de caracteres de nombre de archivo portátil ), <slash>caracteres y una sola terminación<NUL>carácter, el nombre de ruta se podrá utilizar como una cadena de caracteres en todas las configuraciones regionales compatibles; de lo contrario, el nombre de ruta podría ser solo una cadena (en lugar de una cadena de caracteres). Además, dado que <slash>se requiere que la codificación de un solo byte del carácter sea la misma en todas las configuraciones regionales y que no ocurra dentro de un carácter de varios bytes, las referencias a un <slash>carácter dentro de un nombre de ruta están bien definidas incluso cuando el nombre de ruta no es un carácter cuerda. Sin embargo, esta propiedad no se cumple necesariamente para los caracteres restantes dentro del conjunto de caracteres de nombre de archivo portátil.

  • 3.272 Componente de nombre de ruta

    Ver Filename en Filename .

  • 3.170 Nombre de archivo

    Una secuencia de bytes que consta de 1 a {NAME_MAX}bytes utilizados para nombrar un archivo. Los bytes que componen el nombre no deben contener los caracteres <NUL>o <slash>. En el contexto de un nombre de ruta, cada nombre de archivo irá seguido de uno <slash>o un <NUL>carácter; en otro lugar, un nombre de archivo seguido de un <NUL>carácter forma una cadena (pero no necesariamente una cadena de caracteres). Los nombres de archivo salpican y dot-dottienen un significado especial. Un nombre de archivo a veces se denomina "componente de nombre de ruta". Ver también Pathname .

Entonces ... si está buscando una aclaración , esa podría no ser su primera parada. Los tutoriales como esta página de Conceptos de UNIX son útiles, por ejemplo, señalar que "ruta completa" es sinónimo de "ruta absoluta".

Thomas Dickey
fuente
3
Nitpick: dot y dot-dot son nombres de archivo, no nombres de ruta. En realidad, el estándar POSIX tiene la curiosa formulación "Como un caso especial, en el directorio raíz, punto-punto puede referirse al directorio raíz mismo". (mi énfasis)
Kusalananda
Entonces, leer la especificación al pie de la letra, /no es un nombre de archivo válido o un componente de nombre de ruta, y no es una cadena que contiene dichos componentes, pero sigue siendo un nombre de ruta completamente válido para un determinado directorio. Lo que tiene que existir, aunque la parte que exige esto no menciona su "nombre". De alguna manera, esto me parece un poco divertido.
ilkkachu
Se responde en POSIX : tiene caracteres iniciales opcionales, seguidos de cero o más nombres de archivo separados por caracteres.
Thomas Dickey
@Kusalananda revisa la justificación de las especificaciones para su énfasis. el mayo de especificación define una clara declaración de garantía con respecto a las pruebas de implementación. donde se usa may , la especificación asegura cualquier adherente incipiente del comportamiento definido. en otras palabras, cualquier aplicación puede depender ..en /la vinculación /.
mikeserv
19

En Unix, los archivos (y los directorios son solo archivos) no tienen "nombres". Los enlaces tienen nombres, los enlaces son entradas en un directorio que asigna nombres a archivos.

Usted puede decir, que los enlaces dan nombres a los archivos, pero nota: esto implica que un archivo puede tener más de un nombre, ya que puede tener más de un enlace.

Dado que el directorio raíz es, bueno, el directorio raíz, no existe un directorio "superior" dentro del cual pueda haber un enlace, por lo que no puede haber un nombre asociado. Teóricamente sería posible agregar un enlace al directorio raíz dentro de otro directorio, pero la mayoría de los Unices prohíben agregar enlaces a directorios existentes, ya que puede conducir a ciclos en la jerarquía del sistema de archivos (que en realidad es un gráfico dirigido) y detectar ciclos en un gráfico es costoso, pero no detectarlos puede conducir a una recursión infinita cuando se intenta resolver nombres dentro del núcleo.

Entonces, básicamente, el directorio raíz no tiene nombre, porque no hay ningún directorio sobre él dentro del cual podamos registrar el nombre.

Como se señaló en otras respuestas, necesitamos distinguir entre un nombre y una ruta (nombre). Se puede hacer referencia al directorio raíz a través de la ruta (nombre) /.

Jörg W Mittag
fuente
Sí, los archivos pueden tener más de un nombre, al igual que las personas. El esposo de mi hija menor normalmente usa su segundo nombre, pero obviamente también tiene que responder a su primer nombre. El nombre principal del directorio raíz es "/", pronunciado "barra oblicua", porque su nombre de ruta absoluto es "/" (y los nombres basados ​​en nombres de ruta relativos no son particularmente útiles). (Llamarlo "root" se arriesga a confundirse con "/ root", que siempre debería llamarse "barra diagonal".
Monty Harder
1
Me gusta el punto de que no tiene nombre porque no hay un directorio más alto en el que registrar ese nombre. Eso aclara el concepto muy bien.
Joe
7

El uso de la palabra "nombre" es un poco flexible; puede referirse a un "nombre de ruta completamente calificado"; podría referirse a la "entrada de directorio"; podría referirse al "nombre de archivo" pasado a varias funciones o rutinas.

Entonces, por ejemplo, /etc/fooy /var/tmp/../../etc/fooy /tmp/../../../../../../fooson todas formas de referirse al mismo archivo; todos son nombres válidos , como es foocuando están en el /etcdirectorio.

Así que volvamos a lo básico.

Un nombre de archivo en Unix está compuesto de componentes separados por el separador de directorio /. Casi la única restricción en los componentes es que no pueden contener los /caracteres o NUL; todo lo demás está permitido.

Por lo que el "nombre de ruta completo" de /etces la cadena completa: /etc. Esto significa que tiene el etccomponente en el directorio raíz.

Del mismo modo /x/y/z/footendría el foocomponente en el /x/y/zdirectorio.

Ahora el directorio raíz es único porque no tiene ningún componente en un directorio padre; que solamente tiene el nombre de ruta completo como su nombre: /.

Stephen Harris
fuente