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.
fuente
Respuestas:
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¹:
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
du
son 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.
fuente
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]):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 ".
fuente
touch
que crea un archivo vacío y ver qué hace.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
. Eldentry
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 latest
entrada del directorio raíz y un tercer objeto dentry para lafoo
entrada del directorio de prueba.fuente
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".
fuente
locate
funciona y cómo esto se relaciona con la actualización del programa de localización mediante la ejecuciónupdatedb
(especifico que uso el arranque de PC-BSD, DragonflyBSD y Ubuntu Natty desde CD en vivo y comparando diferentes instalaciones e interfaces)