¿Slash ( /
) es realmente parte del nombre del directorio raíz de Linux? ¿O es solo un símbolo para ello?
¿Qué /etc
tal y así sucesivamente?
Actualizar
Supongamos que /dev/sda2
es 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.
linux
filesystems
filenames
fhs
mlibre
fuente
fuente
debugfs
resultados. ¿Puedes aclarar cómo esto cambia la pregunta?Respuestas:
El estándar POSIX.1-2008 dice
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 ./etc
Es otro nombre de ruta. Es el nombre de la ruta absoluta aletc
directorio. El nombre del directorio en esa ruta esetc
(su nombre de archivo esetc
)./usr/local/bin/curl
es la ruta delcurl
archivo ejecutable de la misma manera que/etc
la ruta deletc
directorio.fuente
/..
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./
se define en términos de raíz por proceso, pero no sabía que el inodochroot
no 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?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
3.271 Nombre de ruta
3.272 Componente de nombre de ruta
3.170 Nombre de archivo
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".
fuente
/
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...
en/
la vinculación/
.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)
/
.fuente
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/foo
y/var/tmp/../../etc/foo
y/tmp/../../../../../../foo
son todas formas de referirse al mismo archivo; todos son nombres válidos , como esfoo
cuando están en el/etc
directorio.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
/etc
es la cadena completa:/etc
. Esto significa que tiene eletc
componente en el directorio raíz.Del mismo modo
/x/y/z/foo
tendría elfoo
componente en el/x/y/z
directorio.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:
/
.fuente