¿Por qué un nuevo directorio tiene un conteo de enlaces duros de 2 antes de agregarle algo?

38

Digamos que acabo de crear el directorio newDirectory y luego hago el comando ls -ld. Veo que el número de enlaces duros es 2. ¿Qué hace exactamente el enlace duro 2 desde el principio? ¿También es el número de subdirectorios en el directorio actual igual al número de enlaces duros - 2?

John
fuente

Respuestas:

39

Históricamente , el primer sistema de archivos Unix creó dos entradas en cada directorio: .apuntando al directorio en sí y ..apuntando a su padre. Esto proporcionó una manera fácil de atravesar el sistema de archivos, tanto para aplicaciones como para el sistema operativo mismo.

Por lo tanto, cada directorio tiene un recuento de enlaces de 2 + n donde n es el número de subdirectorios. Los enlaces son la entrada para ese directorio en su padre, la propia .entrada del directorio y la ..entrada en cada subdirectorio. Por ejemplo, suponga que este es el contenido del subárbol enraizado en /parenttodos los directorios:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

Luego dirtiene un recuento de enlaces de 5: la direntrada en /parent, la .entrada en /parent/diry las tres ..entradas en cada uno de /parent/dir/sub1, /parent/dir/sub2y /parent/dir/sub3. Como /parent/dir/sub1no tiene subdirectorio, su número de enlaces es 2 (la sub1entrada /parent/diry la .entrada /parent/dir/sub1).

Para minimizar la cantidad de mayúsculas y minúsculas especiales para el directorio raíz, que no tiene un padre "adecuado", el directorio raíz contiene una ..entrada que apunta a sí mismo. De esta manera, también tiene un conteo de enlaces de 2 más el número de subdirectorios, siendo 2 /.y /...

Los sistemas de archivos posteriores han tendido a realizar un seguimiento de los directorios principales en la memoria y, por lo general, no necesitan .y ..existen como entradas reales; Los sistemas Unix modernos típicos tratan .y ..como valores especiales como parte del código del sistema de archivos independiente del tipo de sistema de archivos. Algunos sistemas de archivos aún incluyen entradas .y .., o pretenden hacerlo aunque no aparezca nada en el disco.

La mayoría de los sistemas de ficheros todavía informan de un número de enlaces de 2 + n para los directorios independientemente de si .y ..existen entradas, pero hay excepciones, por ejemplo btrfs no hace esto.

Gilles 'SO- deja de ser malvado'
fuente
44
..señalar al padre no afecta el recuento de enlaces del directorio actual. El recuento de 2 proviene .y el nombre del directorio (original) en sí mismo. La forma en que lo pones es un poco ambiguo, y hace que parezca .y ..son los dos. ..sólo debe utilizarse para explicar cómo las matemáticas se resuelve a 2+n:)
th3an0maly
@ th3an0maly Señalar al padre afecta al recuento de enlaces del padre. Realmente no veo cómo "la ... entrada en cada subdirectorio" es ambigua, y no entiendo lo que quiere decir con "el nombre del directorio en sí".
Gilles 'SO- deja de ser malvado'
En realidad, esta respuesta: unix.stackexchange.com/a/101516/160264 es exactamente lo que he estado insinuando. Léelo después de que leí tu respuesta, ya que la tuya fue la de arriba.
th3an0maly
@ th3an0maly Todavía no tengo idea de lo que estás insinuando. ¿Podría expresarlo claramente, en lugar de insinuar?
Gilles 'SO- deja de ser malvado'
La respuesta de @ goldilocks es clara. Lo que quise decir es que tu respuesta podría ser más como la suya. Pero entonces no había leído su respuesta cuando estaba leyendo tu respuesta. La primera línea es exactamente lo que decía mi comentario original: "Hay uno para el directorio en sí y otro para el .interior". Si aún no está claro para usted, lamento no poder aclararlo más. Todo lo que podría hacer mejor es copiar y pegar su respuesta aquí en los comentarios.
th3an0maly
13

Hay uno para el directorio en sí y otro para el .interior.

¿También es el número de subdirectorios en el directorio actual igual al número de enlaces duros - 2?

Eso tiene sentido, ya que cada subdirectorio crea un ..enlace rígido, y más allá de eso, no puede crear enlaces rígidos a directorios. 1 Sin embargo, no confiaría en esto por nada serio, especialmente. ya que es fácil contar los subdirectorios y obtener el número real.

Si solo está mirando la lssalida para tener una idea de cuántos subs hay, entonces le da una idea decente.

1 O al menos, no puedes con ln. No lo he intentado mediante programación, y man 2 linkes ambiguo: no hay un error obvio para vincular a un directorio, aunque hay un par que podría aplicarse ( EMLINK, EPERM). Entonces, a menos que haya algún estándar en alguna parte que diga que los únicos enlaces duros posibles a un directorio son .y .., nuevamente, solo trataría ese recuento de enlaces duros como una pista casual.

encerrada dorada
fuente
2
Si los enlaces a directorios están permitidos y si puede contar subdirecciones desde el recuento de enlaces, ambos dependen del sistema de archivos que esté utilizando, algunos permiten, otros no.
alanc
Tenga en cuenta que Time Machine de macOS en realidad enlaza los directorios a las copias de seguridad anteriores; de esa manera pueden fingir que cada copia de seguridad incremental es una copia completa, y pueden eliminar cualquiera de los incrementales sin afectar a los demás. También es muy frágil, estaba jugando con llamadas de sistema regulares y mangué completamente mi sistema de archivos.
w00t