¿Cómo se implementan los directorios en los sistemas de archivos Unix?

19

Mi pregunta es ¿cómo se implementan los directorios? Puedo creer una estructura de datos como una variable, por ejemplo, tabla, matriz o similar. Como UNIX es de código abierto, puedo mirar en el código fuente lo que hace el programa cuando crea un nuevo directorio. ¿Me puede decir dónde buscar o elaborar sobre el tema? ¿Que un directorio "es" un archivo que podría entender y es un directorio realmente un archivo? No estoy seguro de que sea cierto que los archivos se almacenan "en" archivos mientras todavía está en forma, podría decir la palabra archivo sobre casi cualquier cosa y no estoy seguro de qué es absolutamente un archivo, ya que podría llamar incluso a una variable archivo. Por ejemplo, un enlace ciertamente no es un archivo y un enlace es como un directorio, pero esto viola que un directorio es un archivo.

Niklas
fuente
1
¿Está interesado en algún sistema de archivos en particular?
Ignacio Vázquez-Abrams
3
En UNIX, todo es un archivo (sabiduría histórica). Pero no todos los UNIX son de código abierto. Gnu no es Unix, ¿sabes? Open Solaris es un Unix de código abierto, mientras que Linux es solo un sistema operativo unixoide. :) Y sí - sistemas de archivos - Reiserfs? Ext2-3-4? XFS? NFS?
usuario desconocido el
2
Un enlace también es en realidad un archivo.
mattdm
55
Un enlace simbólico es un archivo. Un enlace duro es una ventaja en el gráfico del sistema de archivos.
dmckee
3
Anuncio: puede interesarle la propuesta del sitio de Desarrollo de Sistemas Operativos .
Gilles 'SO- deja de ser malvado'

Respuestas:

22

La estructura interna de los directorios depende del sistema de archivos en uso. Si desea saber con precisión qué sucede, eche un vistazo a las implementaciones del sistema de archivos.

Básicamente, en la mayoría de los sistemas de archivos, un directorio es una matriz asociativa entre nombres de archivo (claves) y números de inodes (valores). Algo como esto¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

Esta lista está codificada de una manera más o menos eficiente dentro de una cadena de bloques (generalmente) de 4KB. Tenga en cuenta que el contenido de los archivos normales se almacena de manera similar. En el caso de los directorios, no tiene sentido saber qué tamaño se usa realmente dentro de estos bloques. Es por eso que los tamaños de los directorios informados duson múltiplos de 4KB.

Los inodos están allí para unir bloques, formando una sola entidad, es decir, un "archivo" en el sentido general. Se identifican mediante un número que es algún tipo de dirección y cada uno generalmente se almacena como un bloque único y especial.

La gestión de todo esto ocurre en modo kernel. El software solo solicita la creación de un directorio con una función llamada que int mkdir(const char *pathname, mode_t mode);conduzca a una llamada al sistema, y ​​todo lo demás se realiza detrás de escena.

Sobre estructura de enlaces:

Un enlace duro no es un archivo, es solo una nueva entrada de directorio (es decir, un nombre - asociación de número de inodo ) que se refiere a una entidad de inodo² preexistente². Esto significa que se puede acceder al mismo inodo desde diferentes nombres de ruta. En particular, dado que los metadatos (permisos, propiedad, marcas de tiempo ...) se almacenan dentro del inodo, estos son únicos e independientes del nombre de ruta elegido para acceder al archivo.

Un enlace simbólico es un archivo y es distinto de su objetivo. Esto significa que tiene su propio inodo. Solía ​​manejarse como un archivo normal: la ruta de destino se almacenó en un bloque de datos. Pero ahora, por razones de eficiencia en sistemas de archivos ext recientes , las rutas de menos de 60 bytes de longitud se almacenan dentro del propio inodo (usando los campos que normalmente se usarían para almacenar los punteros en los bloques de datos).

-
1. esto se obtuvo usando ls -ai1 testdir.
2. cuyo tipo debe ser diferente de 'directorio' hoy en día.

Stéphane Gimenez
fuente
Gracias por la elaboración para que pueda entender la diferencia entre directorios y archivos a nivel programático.
Niklas
12

Para expandir la publicación de Stéphane Gimenez, crear un nuevo directorio es el proceso de crear un nuevo inodo con el valor st_mode de S_IFDIR (con el modo de permisos), creando dos entradas en el primer bloque de datos del nuevo inodo con el enlace ( 2) llamada al sistema: '.' que apunta a este nuevo inodo y '..' que apunta al directorio padre, luego crea una entrada en el directorio padre con el inodo y el nombre del nuevo directorio: la primera y última parte las realiza la llamada al sistema mknod ( 2) Además, solo root puede usar mknod (2) en estos días para las tareas de las que estamos hablando.

Por ejemplo, mkdir("/home/larry.user/xyzzy", 0666)es esencialmente lo siguiente (este era el código C de los días SysV [1]):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland y Salama, "Programación del sistema UNIX", 1987, pp69-71.

Esto era demasiado propenso a errores (y una de las razones principales para fsck), por lo que se creó una llamada al sistema mkdir (2) para poder hacer esto por usted.

Tenga en cuenta que el objeto del sistema de archivos amy podría crearse con mknod (2): archivo normal, directorio, archivo de dispositivo, enlace simbólico, etc. Entonces, para responder a una de las preguntas del OP, sí, un directorio es un archivo, que significa decir " es un objeto, representado por un inodo, que reside en un sistema de archivos que se comporta con una interfaz de E / S ".

Arcege
fuente
Gracias por la respuesta muy interesante. Entiendo y creo que también puedo buscar en la fuente el programa touchque crea un archivo vacío y ver qué hace.
Niklas
2

si desea obtener más información sobre los sistemas de archivos Unix / Linux, le recomiendo 2 libros: Comprensión del kernel de Linux y The Linux Kernel Development . Esos son los mejores libros para entender el kernel de Linux.

En los sistemas Unix "Modelo de archivo común", cada directorio se considera un archivo, que contiene una lista de archivos y directorios.

En el VFS (Virtual File Systems), los directorios están representados en una estructura llamada dentry. El dentry es una estructura C con un nombre de cadena ( d_name ), un puntero a un inodo ( d_inode ) y un puntero a la dentry padre ( d_parent ). Un inodo es una estructura para manejar información sobre un archivo en el sistema de archivos. Por ejemplo, si tiene el directorio /tmp/test/foo, el VFS creará un objeto dentry para cada componente en el nombre de ruta. Entonces, creará un objeto dentry para /, un segundo objeto dentry para la testentrada del directorio raíz y un tercer objeto dentry para la fooentrada del directorio de prueba.

Dimitri
fuente
Gracias Dimitri Quiero entender por qué algún proyecto eligió una estructura de datos particular como un árbol B, un árbol binario, un trie o una matriz asociativa. Creo que es importante elegir una estructura de datos / modelo de datos adecuada. Conocer las diferentes implementaciones proporciona los detalles que estoy buscando.
Niklas
1

Podrías comenzar leyendo http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Para obtener más detalles, obtenga el excelente libro clásico "Diseño e implementación del sistema operativo 4.4 BSD".

chasquido
fuente
Gracias por el enlace. Entiendo que ambos archivos son directorios, básicamente son matrices que se interpretan como archivos o directorios. Por favor corrígeme si me equivoco ..
Niklas
1
Los directorios son tradicionalmente solo archivos con formato especial, pero eso ya no es cierto: en.wikipedia.org/wiki/ReiserFS#Design En ReiserFS y algunos otros, los directorios son entradas en una base de datos. Los directorios pueden actuar como matrices, pero eso es solo la abstracción de programación.
Bruce Ediger
Muchas gracias por señalar los detalles. Ahora creo que entiendo más cómo funcionan los sistemas de archivos y aún me pregunto cómo y por qué el programa locatefunciona y cómo esto se relaciona con la actualización del programa de localización mediante la ejecución updatedb(especifico que uso el arranque de PC-BSD, DragonflyBSD y Ubuntu Natty desde CD en vivo y comparando diferentes instalaciones e interfaces)
Niklas