Contactos

Sistema de archivos ext2. Cómo acceder a los sistemas de archivos Ext2, Ext3, Ext4 en un entorno Windows. organización lógica ext2

Si tiene dos sistemas operativos instalados, Windows y Linux, probablemente le gustaría estar contenido en particiones de un sistema operativo gratuito directamente desde Windows, sin reiniciar la computadora.

Desafortunadamente, no hay soporte para particiones del sistema operativo Linux en Windows. Pero en vano. Me parece que esto podría ser un bonito gesto por parte de Microsoft.

El quid del problema es que Windows utiliza un sistema basado en archivos. sistema NTFS, y Linux tiene su propia forma de organizar archivos, el sistema de archivos extendido, ultima versión que tiene el número de serie 4.

Linux es más fácil de usar que su hermano comercial: Linux admite el sistema de archivos NTFS de Windows de forma predeterminada. Por supuesto, no podrá instalar Linux en una partición NTFS, pero podrá leer y escribir datos desde dicha partición.

Ext2 IFS

Ext2 IFS es compatible con las versiones Windows NT4.0/2000/XP/2003/Vista/2008 x86 y x64 y le permite ver el contenido de las particiones ext2 de Linux y también puede escribir en ellas. La utilidad instala el controlador del sistema ext2fs.sys, que extiende características de Windows e incluye soporte completo para ext2: a las particiones ext2 se les asignan letras de unidad, y los archivos y carpetas que contienen se muestran en los cuadros de diálogo de todas las aplicaciones, por ejemplo, en el Explorador.

Ext2 FSD

Ext2 FSD – conductor libre Para sistemas windows(versiones 2K/XP/VISTA/7 x86 y x64). Al igual que la utilidad anterior, que también es un controlador en esencia, incluye soporte completo para el sistema de archivos ext2 en Windows.

LTOOLS – un conjunto de utilidades línea de comando, que le permite leer y escribir datos en/desde particiones Linux ext2, ext3 y ReiserFS (sistemas de archivos estándar de Linux) desde una máquina que ejecuta DOS o Windows.

Existe una versión del programa con un shell gráfico (escrito en Java): LTOOLSgui, así como una versión con un shell gráfico escrito en .

Ext2Leer

El postre es, como siempre, el más delicioso.

Ext2Read es una utilidad de tipo administrador de archivos que le permite ver y escribir en particiones ext2/ext3/ext4. Es compatible con LVM2 y, lo que lo distingue de otros programas de esta revisión, el sistema de archivos ext4. Soporte integrado para copia recursiva de directorios.

Y aquí está el segundo postre. Al principio se dijo que un buen gesto por parte de Microsoft sería habilitar de forma predeterminada el soporte para particiones Linux en Windows.

Sin embargo, el gesto se realizó en el vigésimo aniversario de Linux. Ver por ti mismo.

Eso es todo. Gracias por su atención. Iré a luchar contra los abejorros. Hay muchísimos de ellos esta primavera. 🙂

14 Jun

Sistemas de archivos ext2, ext3, XFS, ReiserFS, NTFS

Sistema de archivos - este es el orden que determina la forma de organizar, almacenar y nombrar datos en cualquier medio de almacenamiento electrónico en las computadoras.

La variedad de sistemas de archivos se explica por el hecho de que cada uno fue inventado para su propio conjunto específico de tareas. Algunos escriben archivos pequeños muy rápidamente (digamos, hasta 1 GB), pero al mismo tiempo interactúan mal con archivos grandes o no funcionan con ellos en absoluto. Algunos son buenos desde el punto de vista de la seguridad, otros desde el punto de vista de la velocidad de lectura/escritura. Cada sistema de archivos tiene sus propias ventajas, desventajas, vulnerabilidades y capacidades distintivas.

EN linux Los tipos de sistemas de archivos más utilizados son:

  1. ext2- representa Segunda Extendida Sistema de archivos (segundo sistema de archivos extendido). Desarrollado por Remy Card en 1993 como sistema de archivos para el kernel de Linux, de 1993 a 2001 fue el sistema de archivos principal linux.
    La ventaja es alta velocidad leer escribir.
    La principal desventaja del sistema. ext2 es que no está diarioizado, pero precisamente por eso tiene un gran rendimiento ( Inicio sesión es un proceso de registro en diario que almacena una lista de cambios que ayuda a mantener la integridad del sistema de archivos durante diversas fallas del sistema);
  2. ext3- representa Tercer sistema de archivos extendido(tercera versión del sistema de archivos extendido). Desarrollado por Stephen Tweedy en 2001, todavía se utiliza hoy en día en distribuciones. linux. Nació como un mejorado. ext2.
    La ventaja de este sistema es que está registrado, es decir, su confiabilidad aumenta significativamente en comparación con ext2.
    La desventaja es un rendimiento y una velocidad de lectura/escritura ligeramente inferiores.
  3. XFS— Desarrollado por la empresa. Gráficos de silicio en 1993, se añadió al núcleo linux como sistema de archivos en 2002 en toda la familia de distribuciones linux, en este momento utilizado como "nativo" en la distribución sombrero rojo.
    La ventaja es la presencia de registro de metadatos, alta estabilidad operativa, se admite la distribución de flujos de entrada/salida en grupos, altas velocidades de lectura/escritura, es posible desfragmentar incluso cuando la partición está montada y puede aumentar el tamaño de el sistema de archivos. Funciona más eficazmente con archivos grandes.
    La desventaja es que el tamaño de la partición no se puede reducir, el proceso de procesamiento de metadatos no es tan rápido y funciona notablemente más lento con archivos pequeños que con otros tipos de sistemas de archivos.
  4. ReiserFS- desarrollado por la empresa Nombresys bajo la dirección de Hans Reiser en 2001. Usado solo en sistemas operativos linux. Fue el primer sistema de archivos registrado en ser adoptado en el kernel.
    La ventaja de este sistema de archivos es que funciona muy rápidamente con archivos pequeños (la velocidad de lectura/escritura es mayor que la del ext4), admite el registro.
    La desventaja es que su desarrollo se ha ralentizado notablemente debido al arresto de su líder, Hans Reiser, y no hay cifrado en segundo plano.
  5. NTFS- representa Sistema de archivos de nueva tecnología(sistema de archivos nueva tecnología). Desarrollado en julio de 1993 por la corporación. microsoft. Ampliamente utilizado en varios sistemas operativos, así como en diversos medios de almacenamiento.
    La ventaja es la capacidad incorporada de limitar el acceso a los datos para diferentes usuarios, así como asignar restricciones a volumen máximo Espacio del disco, uso de un sistema de diario, lectura/escritura de archivos pequeños a alta velocidad.
    La desventaja es que para operación estable no se necesita pequeño RAM Una PC con archivos grandes es lenta y la longitud de la ruta a los archivos es limitada (32.767 caracteres Unicode).

De esta forma sencilla descubrimos los “sistemas de archivos ext2, ext3, XFS, ReiserFS, NTFS«!

Cómo en Entorno de Windows hacer posible acceder a una partición de disco o a un medio extraíble con sistemas de archivos Ext2/3/4 ? Si, por ejemplo, en el ordenador también hay un segundo sistema linux. Y necesitas trabajar con sus datos del medio ambiente. ventanas. U otro ejemplo: cuando se montan Windows dentro discos virtuales con instalado en maquinas virtuales sistemas linux o Androide. Con Ext2/3/ 4 Windows no puede funcionar de forma nativa; necesita herramientas de terceros para ello. ¿Qué tipo de medios son estos? Miremos los que aparecen a continuación.

***
Las tres primeras herramientas permitirán leer únicamente dispositivos de información desde Ext2/3/4. La última solución le permitirá leer y escribir datos. Todas las herramientas que se analizan a continuación son gratuitas.

1. Lector de Linux DiskInternals

Un programa simple es un administrador de archivos primitivo, diseñado como uno estándar. Explorador de Windows, con soporte para sistema de archivos Extensión 2/3/4 , Reiser4 , HFS , UFS2. En la ventana del programa veremos particiones y dispositivos con linux o Androide.

Para copiar, debe seleccionar una carpeta o archivo, presione el botón "Ahorrar".

Luego especifique la ruta de copia.

2. Complemento para Total Commander DiskInternals Reader

Los fanáticos de lo popular pueden extraer datos linux o Androide dentro de Windows usando esto administrador de archivos. Pero primero instale un complemento especial. Uno de estos complementos es que puede conectar y leer dispositivos de información formateados en Ext2/3/4 , Grasa/exGRASA , HFS/HFS+ , ReiserFS. Descargue el complemento, descomprima su archivo dentro , confirme la instalación.

vamos a lanzar (importante) en nombre del administrador. Vayamos a la sección. Hacer clic.

Aquí, junto con otras particiones de disco y medios, el que tiene Ext2/3/4 .

Los datos se copian tradicionalmente manera: presionando F5 en el segundo panel.

3. Complemento para Total Commander ext4tc

Alternativa simplificada decisión previaext4tc, otro complemento para . Puede conectarse para leer dispositivos de información formateados sólo en Ext2/3/4. Descargue el complemento, descomprima su archivo dentro del administrador de archivos e inicie la instalación.

vamos a lanzar (importante) en nombre del administrador. Hacer clic. Vamos a .

Si necesita copiar datos, utilice la forma habitual con la tecla F5.

4. Controlador de soporte Ext2Fsd

Programa Ext2Fsd– este es el conductor Ext2/3/4, implementa soporte para estos sistemas de archivos a nivel del sistema operativo. Puede trabajar con particiones de disco y unidades formateadas en estos sistemas de archivos como con las normales compatibles. Dispositivos Windows información en la ventana del Explorador o programas de terceros. El controlador le permite leer y escribir datos.

Descarga lo último versión actual Ext2Fsd.

Durante la instalación activamos (si es para trabajo a largo plazo) tres casillas de verificación sugeridas:

1 — Ejecución automática del controlador con Windows;
2 - Soporte de grabación para ext2;
3 - Soporte de formato para ext3.

En la etapa de preacabado, activamos la opción para iniciar la ventana del administrador de controladores, junto con la asignación de información a los dispositivos desde Ext2/3/4 letras de unidad.

En la ventana que se abre Veremos a los medios con la carta ya asignada. Por ejemplo, en nuestro caso, un transportista con ext4 se da la primera carta gratis F.

Ahora podemos trabajar con el disco. F en la ventana del Explorador.

Asigne una letra a los nuevos dispositivos conectados con Ext2/3/4 posible usando Menú de contexto llamó a cada uno de los que se muestran en la ventana dispositivos. Pero simplemente asignando una letra de unidad, dicho dispositivo no aparecerá después reiniciar Windows, esta solución es sólo para una sesión de computadora. Para crear un nuevo dispositivo con Ext2/3/4 permanentemente visible en el entorno de Windows, debe hacer doble clic en él para abrir la ventana de configuración y establecer los parámetros de conexión permanente. En la segunda columna necesitas:

Para media removible active la casilla de verificación indicada con el número 1 en la captura de pantalla y especifique la letra de la unidad;
Para discos y particiones internos, active la casilla de verificación indicada en la captura de pantalla a continuación con el número 2 y también especifique la letra de la unidad.

(Segundo sistema de archivos extendido).

· Historia del desarrollo de los sistemas de archivos Linux.

· Estructura de partición de disco en ext2fs

·

· Catálogos

· Archivos de dispositivo

·

·

· Biblioteca EXT2fs

· Herramientas del sistema EXT2fs

· Cálculo de rendimiento

facultad de matematicas

Programa de software

2do año 5to gr.

Chichirov Andrei

Falso sistema EXT2fs (Segundo sistema de archivos extendido).

Historia del desarrollo de los sistemas de archivos Linux.

Las primeras versiones de Linux se desarrollaron basándose en el sistema operativo Minix. Sería más fácil compartir discos entre dos sistemas que desarrollar un nuevo sistema de archivos, por lo que Linus Torvalds decidió introducir soporte para el sistema de archivos Minix en Linux. En ese momento, este sistema de archivos era un producto de software bastante eficiente con relativamente una pequeña cantidad errores.

Sin embargo, las limitaciones asociadas con la estructura del sistema de archivos Minix eran bastante altas, por lo que comenzaron a pensar en desarrollar un nuevo sistema de archivos para Linux.

Para simplificar la implementación del nuevo sistema de archivos en el kernel de Linux, se desarrolló un sistema de archivos virtual (VFS). VFS fue escrito originalmente por Chris Provenzano y luego reescrito por Linus Torvalds antes de integrarse en el kernel.

Después de instalar VFS en el kernel, en abril de 1992 se desarrolló un nuevo sistema de archivos, EXTfs (Sistema de archivos extendido), que se agregó a la versión 0.96c de Linux. En el nuevo sistema de archivos, se eliminaron dos limitaciones importantes del sistema Minix: su tamaño máximo podía alcanzar los 2 gigabytes y la longitud máxima del nombre del archivo podía ser de 255 caracteres. Esta fue una mejora con respecto al sistema de archivos Minix, aunque aún persistían algunos problemas. No hubo soporte para el acceso compartido, la modificación del descriptor de índice y la modificación de las celdas de tiempo de cambio de archivos. Este sistema de archivos utilizaba listas enlazadas para operar en bloques e inodos libres, lo que afectaba en gran medida el rendimiento del sistema: con el tiempo, las listas se desordenaban y desordenaban, lo que provocaba la fragmentación del sistema de archivos.

La solución a estos problemas fue el lanzamiento en enero de 1993 de versiones alfa de dos nuevos sistemas de archivos: Xia y EXT2fs (Segundo Sistema de Archivos Extendido). En su mayor parte, el sistema de archivos Xia se basó en Minix, con algunas características nuevas agregadas. Esto se debió principalmente a la capacidad de trabajar con nombres de archivos largos, compatibilidad con particiones de disco más grandes y compatibilidad con tres celdas de tiempo de cambio de archivos. Por otro lado, EXT2fs se basó en EXTfs con muchas mejoras y adiciones. También tenía oportunidades de desarrollo futuro.

Cuando se lanzaron estos dos sistemas de archivos, eran funcionalmente aproximadamente iguales. El sistema Xia era más confiable que el EXT2fs al minimizarlo. A medida que se utilizaron más ampliamente, se descubrieron errores en el sistema EXT2fs y se agregaron un gran número de nuevas características y mejoras. El sistema de archivos EXT2fs ahora es muy confiable y se ha convertido en el sistema de archivos estándar de facto de Linux.

La siguiente tabla proporciona información general sobre la funcionalidad proporcionada por varios sistemas de archivos.

MinixFS

Ext FS

Ext2 FS

Xia FS

Tamaño máximo del sistema de archivos

Longitud máxima del archivo

Longitud máxima del nombre de archivo

Soporte para tres celdas de tiempo de cambio de archivos

Posibilidad de ampliación

Tamaño de bloque redimensionable

Protección de la información

Si es necesario, la longitud del nombre del archivo en Extensión 2 se puede aumentar a 1012.

EXT2fs reserva una cierta cantidad de bloques para el usuario root. Normalmente esto es el 5% del total, lo que permite al administrador del sistema evitar quedarse sin espacio. disco duro cuando está lleno del trabajo de los procesos de otros usuarios.

Estructura de partición de disco en ext2fs

Fabricantes unidades de disco duro normalmente entregan sus productos formateados a un nivel bajo. Hasta donde yo sé, esto significa que todo el espacio en disco se divide en "sectores" de 512 bytes de tamaño mediante etiquetas especiales. Dicho disco (o partición de disco) debe estar preparado para su uso en un sistema operativo específico. En MS-DOS o Windows, el procedimiento de preparación se llama formateo y en Linux, creación de un sistema de archivos. Creando un sistema de archivos ext2fs Consiste en crear una determinada estructura lógica en una partición de disco. Esta estructura se construye de la siguiente manera. Primero, se asigna un área de arranque en el disco. El área de inicio se crea en cualquier sistema de archivos. En la partición primaria, contiene un registro de inicio, un fragmento de código que inicia el proceso de carga del sistema operativo al inicio. Esta área no se utiliza en otras particiones. El resto del espacio en disco se divide en bloques. Un bloque puede tener un tamaño de 1, 2 o 4 kilobytes. Un bloque es una unidad direccionable de espacio en disco. Los archivos se asignan en bloques, por lo que existen compensaciones al elegir el tamaño del bloque. Un tamaño de bloque grande, por regla general, reduce la cantidad de accesos al disco al leer o escribir un archivo, pero aumenta la cantidad de espacio desperdiciado, especialmente si hay una gran cantidad de archivos pequeños.

Los bloques de su área se combinan en grupos de bloques. Los grupos de bloques en un sistema de archivos y los bloques dentro de un grupo se numeran secuencialmente, comenzando con 1. El primer bloque de un disco tiene el número 1 y pertenece al grupo número 1. El número total de bloques en un disco (en una partición de disco) es un divisor de la capacidad del disco, expresada en sectores. Y el número de grupos de bloques no tiene por qué dividir el número de bloques, porque es posible que el último grupo de bloques no esté completo. El comienzo de cada grupo de bloques tiene una dirección, que se puede obtener como ((número de grupo - 1)* (número de bloques en el grupo)).

Cada grupo de bloques tiene la misma estructura. Su estructura se presenta en la siguiente tabla.

La estructura de un grupo de bloques de partición de disco en ext2fs

El primer elemento de esta estructura (supermanzana) es el mismo para todos los grupos, y el resto son individuales para cada grupo. El superbloque se almacena en el primer bloque de cada grupo de bloques (excepto el grupo 1, en el que el primer bloque contiene registro de arranque). Supermanzana es el punto de partida del sistema de archivos. Tiene un tamaño de 1024 bytes y Siempre ubicado en un desplazamiento de 1024 bytes desde el comienzo del sistema de archivos. La presencia de varias copias del superbloque se explica por la extrema importancia de este elemento del sistema de archivos. Los duplicados de superbloque se utilizan al recuperar un sistema de archivos después de fallas.

La información almacenada en el superbloque se utiliza para organizar el acceso al resto de datos del disco. El superbloque determina el tamaño del sistema de archivos, la cantidad máxima de archivos en la partición, la cantidad de espacio libre y contiene información sobre dónde buscar áreas no asignadas. Cuando se inicia el sistema operativo, el superbloque se lee en la memoria y todos los cambios en el sistema de archivos se reflejan primero en una copia del superbloque ubicado en el sistema operativo y se escriben en el disco solo periódicamente. Esto mejora el rendimiento del sistema porque muchos usuarios y procesos actualizan archivos constantemente. Por otro lado, cuando el sistema está apagado, el superbloque debe escribirse en el disco, lo que no permite apagar la computadora simplemente apagando la corriente. De lo contrario, la próxima vez que inicie, la información registrada en el superbloque no corresponderá al estado real del sistema de archivos.

La supermanzana tiene la siguiente estructura

Nombre del campo

Tipo

Un comentario

s_inodes_count

ULONGO

Número de inodos en el sistema de archivos.

s_bloques_count

ULONGO

Número de bloques en el sistema de archivos.

s_r_blocks_count

ULONGO

Número de bloques reservados para superusuario

s_free_blocks_count

ULONGO

Contador de bloques gratis

s_free_inodes_count

ULONGO

Contador de inodos gratis

s_first_data_block

ULONGO

El primer bloque que contiene datos. Dependiendo del tamaño del bloque, este campo puede ser 0 o 1.

s_log_block_size

ULONGO

Indicador de tamaño de bloque lógico: 0 = 1 KB; 1 = 2 KB; 2 = 4 KB.

s_log_frag_size

LARGO

Indicador de tamaño de fragmento (parece que el concepto de fragmento no se utiliza actualmente)

s_bloques_por_grupo

ULONGO

Número de bloques en cada grupo de bloques

s_frags_por_grupo

ULONGO

Número de fragmentos en cada grupo de bloques.

s_inodes_por_grupo

ULONGO

Número de inodos en cada grupo de bloques

s_mtime

ULONGO

La hora en que se montó por última vez el sistema de archivos.

tiempo_s_w

ULONGO

Hora en la que se escribió por última vez el sistema de archivos

s_mnt_count

CORTO

Contador del número de montajes del sistema de archivos. Si este contador alcanza el valor especificado en el siguiente campo (s_max_mnt_count), se debe verificar el sistema de archivos (esto se hace al reiniciar) y el contador se restablece a cero.

s_max_mnt_count

CORTO

Un número que determina cuántas veces se puede montar el sistema de archivos.

s_magia

CORTO

"Número mágico" (0xEF53) que indica que el sistema de archivos es de tipo ex2fs

s_estado

CORTO

Banderas que indican el estado actual del sistema de archivos (está limpio, etc.)

s_errores

CORTO

Banderas que especifican procedimientos para procesar mensajes de error (qué hacer si se encuentran errores).

s_pad

CORTO

Relleno

s_lastcheck

ULONGO

Hora de la última comprobación del sistema de archivos

s_checkinterval

ULONGO

Período de tiempo máximo entre comprobaciones del sistema de archivos

s_creador_os

ULONGO

Una indicación del tipo de sistema operativo en el que se creó el sistema de archivos.

s_rev_level

ULONGO

Versión (nivel de revisión) del sistema de archivos.

s_reservado

ULONGO

Relleno hasta 1024 bytes

Después del superbloque hay una descripción del grupo de bloques (Descriptores de grupo). Esta descripción es una matriz con la siguiente estructura.

Nombre del campo

Tipo

Objetivo

bg_block_bitmap

ULONGO

Dirección del bloque que contiene el mapa de bits del bloque de este grupo

bg_inode_bitmap

ULONGO

Dirección del bloque que contiene el mapa de bits de inodo de este grupo

bg_inode_table

ULONGO

Dirección del bloque que contiene la tabla de inodos de este grupo.

bg_free_blocks_count

CORTO

Contador del número de bloques libres en este grupo

bg_free_inodes_count

CORTO

Número de inodos libres en este grupo

bg_used_dirs_count

CORTO

El número de inodos en un grupo determinado que son directorios.

bg_pad

CORTO

Relleno

bg_reservado

ULONGO

Relleno

El tamaño de la descripción del grupo de bloques se puede calcular como (tamaño_grupo_bloque_en_ext2 * número_de_grupos) / tamaño_bloque(redondo si es necesario).

La información almacenada en la descripción del grupo se utiliza para localizar los mapas de bits del bloque y del inodo, así como la tabla de inodos. No olvides que los bloques y grupos de bloques están numerados empezando por el 1.

Un mapa de bits de bloque es una estructura en la que cada bit indica si el bloque correspondiente está asignado a un archivo. Si el bit es 1, entonces el bloque está ocupado. Este mapa se utiliza para buscar bloques libres en los casos en los que es necesario asignar espacio para un archivo. El mapa de bits del bloque ocupa un número de bloques igual a. (número_de_bloques_en_grupo / 8) / tamaño_bloque(redondo si es necesario).

El mapa de bits de inodos realiza una función similar a la tabla de inodos: muestra qué inodos están en uso.

La siguiente área en la estructura del grupo de bloques se utiliza para almacenar la tabla de inodos del archivo. La estructura del inodo en sí se analiza con más detalle en la siguiente subsección.

Bueno, y finalmente, todo el espacio restante en el grupo de bloques se asigna para almacenar los archivos reales.

Sistema de archivos ext 2 se caracteriza por:

  • estructura jerarquica,
  • procesamiento coordinado de conjuntos de datos,
  • extensión de archivo dinámica,
  • protección de la información en archivos,
  • Tratar los dispositivos periféricos (como terminales y dispositivos de cinta) como archivos.

Representación de archivos internos

Cada archivo en el sistema Ext 2 tiene un índice único. El índice contiene la información que necesita cualquier proceso para acceder al archivo. Los procesos acceden a archivos utilizando un conjunto bien definido. llamadas al sistema e identificar el archivo con una cadena de caracteres que sirve como nombre de archivo compuesto. Cada nombre compuesto identifica de forma única un archivo, por lo que el núcleo del sistema convierte este nombre en un índice de archivo. El índice incluye una tabla de direcciones donde se encuentra la información del archivo en el disco. Dado que cada bloque de un disco tiene su propio número, esta tabla almacena una colección de números de bloques de disco. Para aumentar la flexibilidad, el kernel agrega un archivo bloque a bloque, lo que permite que la información del archivo se distribuya por todo el sistema de archivos. Pero este diseño complica la tarea de buscar datos. La tabla de direcciones contiene una lista de números de bloque que contienen información perteneciente a un archivo, pero cálculos simples muestran que una lista lineal de bloques de archivos en un índice es difícil de administrar. Para que una estructura de índice pequeña permita trabajar con archivos grandes, la tabla de direcciones de bloques de disco se alinea con la estructura que se muestra en la Figura 1.

La mayoría de los archivos en un sistema Ext 2 no superan los 10 KB o incluso 1 KB. Debido a que 10 KB de un archivo se encuentran en bloques de direccionamiento directo, se puede acceder a la mayoría de los datos almacenados en los archivos en un solo acceso al disco. Por lo tanto, en lugar de recurrir a archivos grandes, trabajando con archivos tamaño estándar procede rápidamente.

Inodos de archivo

Cada archivo en el disco está asociado con un solo inodo de archivo, que se identifica por su número secuencial: el índice del archivo. Esto significa que la cantidad de archivos que se pueden crear en un sistema de archivos está limitada por la cantidad de inodos, que se especifica explícitamente cuando se crea el sistema de archivos o se calcula en función del tamaño físico de la partición del disco. Los inodos existen en el disco en forma estática y el núcleo los lee en la memoria antes de trabajar con ellos.

El inodo del archivo tiene la siguiente estructura:

Nombre del campo

Tipo

Descripción

yo_modo

CORTO

El tipo y los derechos de acceso a este archivo.

yo_fluido

CORTO

Identificador del propietario del archivo (Owner Uid).

yo_talla

ULONGO

Tamaño del archivo en bytes.

yo_atime

ULONGO

Hora del último acceso al archivo (Tiempo de acceso).

I_ctime

ULONGO

Hora de creación del archivo.

soy hora

ULONGO

Hora de la última modificación del fichero.

I_dtime

ULONGO

Hora de eliminación del archivo.

me_gid

CORTO

ID de grupo (GID).

I_enlaces_count

CORTO

Los enlaces cuentan.

Yo_bloques

ULONGO

El número de bloques ocupados por el archivo.

I_flags

ULONGO

Banderas de archivos (Archivo de banderas)

Yo_reservado1

ULONGO

Reservado para SO

Yo bloqueo

ULONGO

Punteros a bloques en los que se escriben datos de archivos (un ejemplo de direccionamiento directo e indirecto en la Fig. 1)

I_version

ULONGO

Versión del archivo (para NFS)

I_archivo_acl

ULONGO

archivo ACL

I_dir_acl

ULONGO

ACL de directorio

yo_faddr

ULONGO

Dirección de fragmento

yo_frag

UCHAR

Número de fragmento

I_fsize

UCHAR

Tamaño del fragmento

I_pad1

CORTO

Relleno

Yo_reservado2

ULONGO

Reservado

El campo tipo de archivo y derechos de acceso es una palabra de dos bytes, cada bit del cual sirve como indicador que indica la relación del archivo con un tipo específico o la configuración de un derecho de archivo específico.

Identificador

Significado

Propósito de la bandera (campo)

S_IFMT

F000

Máscara de tipo de archivo

S_IFSOCK

A000

Conector de dominio

S_IFLNK

C000

S_IFREG

8000

archivo normal

S_IFBLK

6000

Dispositivo orientado a bloques

S_IFDIR

4000

Catalogar

S_IFCHR

2000

Dispositivo orientado a bytes (caracteres)

S_IFIFO

1000

Tubería con nombre (fifo)

S_ISUID

0800

SUID - cambiar bit de propietario

S_ISGID

0400

SGID - bit de cambio de grupo

S_ISVTX

0200

Bit de guardado de tarea (bit adhesivo)

S_IRWXU

01C0

Máscara de derechos del propietario del archivo

S_IRUSR

0100

derecho a leer

S_IWUSR

0080

Escribe bien

S_IXUSR

0040

Derecho a ejecutar

S_IRWXG

0038

Máscara de derechos de grupo

S_IRGRP

0020

derecho a leer

S_IWGRP

0010

Escribe bien

S_IXGRP

0008

Derecho a ejecutar

S_IRWXO

0007

Máscara de derechos de otros usuarios

S_IROTH

0004

derecho a leer

S_IWOTH

0002

Escribe bien

S_IXOTH

0001

Derecho a ejecutar

Entre los inodos, hay varios inodos que están reservados para propósitos especiales y desempeñan un papel especial en el sistema de archivos. Estos son los siguientes descriptores

Identificador

Significado

Descripción

EXT2_BAD_INO

Un inodo que enumera las direcciones de los bloques defectuosos en el disco (inodo de bloques defectuosos)

EXT2_ROOT_INO

Inodo del directorio raíz del sistema de archivos (Inodo raíz)

EXT2_ACL_IDX_INO

inodo ACL

EXT2_ACL_DATA_INO

inodo ACL

EXT2_BOOT_LOADER_INO

Inodo del cargador de arranque

EXT2_UNDEL_DIR_INO

Recuperar inodo de directorio

EXT2_FIRST_INO

Primer inodo sin reservas

El identificador más importante de esta lista es el identificador del directorio raíz. Este identificador apunta al directorio raíz, que, como todos los directorios, consta de entradas con la siguiente estructura:

Nombre del campo

Tipo

Descripción

Inodo

ULONGO

número de inodo del archivo

rec_len

CORTO

Longitud de esta entrada

nombre_len

CORTO

Longitud del nombre del archivo

Nombre

CARBONIZARSE

Nombre del archivo

Una entrada de directorio individual no puede cruzar el límite de un bloque (es decir, debe estar ubicada completamente dentro de un solo bloque). Por lo tanto, si la siguiente entrada no cabe por completo en un bloque determinado, se transfiere al siguiente bloque y la entrada anterior continúa para llenar el bloque hasta el final.

Figura 1 Bloques de direccionamiento directo e indirecto en el índice

Figura 2 Tamaño de archivo en bytes con un tamaño de bloque de 1 KB

Figura 3. Ejemplo de índice de disco

La Figura 3 muestra el índice del disco de un determinado archivo. Este índice pertenece a un archivo normal cuyo propietario es "mjb" y cuyo tamaño es de 6030 bytes. El sistema permite al usuario "mjb" leer, escribir y ejecutar el archivo; Los miembros del grupo "os" y todos los demás usuarios solo pueden leer o ejecutar el archivo, pero no escribir datos en él. El expediente fue leído por última vez el 23 de octubre de 1984 a las 13:45 horas y escrito por última vez el 22 de octubre de 1984 a las 10:30 horas. El índice fue modificado por última vez el 23 de octubre de 1984 a las 13:30 horas, aunque en ese momento no se escribió ninguna información en el expediente. El kernel codifica todos los datos anteriores en un índice. Tenga en cuenta la diferencia al escribir en el disco el contenido del índice y el contenido del archivo. El contenido de un archivo cambia sólo cuando se escribe en el archivo. El contenido del índice cambia tanto cuando cambia el contenido del archivo como cuando cambian el propietario del archivo, los derechos de acceso y el conjunto de punteros. Cambiar el contenido de un archivo automáticamente hace que se ajuste el índice, pero ajustar el índice no significa cambiar el contenido del archivo.

Catálogos

Los directorios son los archivos a partir de los cuales se construye la estructura jerárquica del sistema de archivos; Desempeñan un papel importante al convertir el nombre del archivo en un número de índice. Un directorio es un archivo cuyo contenido es un conjunto de entradas que consta del número de índice y el nombre del archivo incluido en el directorio. Un nombre calificado es una cadena de caracteres terminada en un carácter nulo y separada por una barra ("/") en varios componentes. Cada componente excepto el último debe ser el nombre de un directorio, pero el último componente puede ser el nombre de un archivo que no sea un directorio. En UNIX versión V, la longitud de cada componente está limitada a 14 caracteres; Así, junto con los 2 bytes asignados al número de índice, el tamaño de la entrada del directorio es de 16 bytes.

Desplazamiento de bytes
dentro del directorio

Número de índice
(2 bytes)

Nombrearchivo

1798

en eso

1276

fsck

clri

1268

motd

1799

montar

mknod

2114

contraseña

1717

desmontar

1851

Lista de Verificación

fsdbld

configuración

1432

getty

chocar

mkfs

Figura 4 Formato del directorio /etc

La Figura 4 muestra el formato del directorio "etc". Cada directorio contiene archivos cuyos nombres se indican con un punto y dos puntos ("." y "..") y cuyos números de índice coinciden con los números de índice. de este catálogo y directorio principal, respectivamente. El número de índice del archivo es "." en el directorio "/etc" tiene una dirección en el desplazamiento 0 y un valor de 83. El número de inodo para el archivo ".." tiene una dirección en el desplazamiento 16 desde el inicio del directorio y un valor de 2. Entradas en el El directorio puede estar vacío, pero el número de inodo es 0. Por ejemplo, la entrada en la dirección 224 en el directorio "/etc" está vacía, a pesar de que alguna vez contuvo un punto de entrada para un archivo llamado "crash". El programa mkfs inicializa el sistema de archivos para que los números de inodo de los archivos sean "." y ".." en el directorio raíz son los mismos que el número de índice raíz del sistema de archivos.

El kernel almacena datos en un directorio tal como lo hace en un tipo de archivo normal, utilizando una estructura de índice y bloques con niveles de direccionamiento directo e indirecto. Los procesos pueden leer datos de directorios de la misma manera que leen archivos normales, pero el kernel reserva el acceso de escritura exclusivo al directorio, lo que garantiza que la estructura del directorio sea correcta. Los permisos de directorio tienen el siguiente significado: el permiso de lectura otorga a los procesos la capacidad de leer datos del directorio; el permiso de escritura permite que un proceso cree nuevas entradas en un directorio o elimine las antiguas (usando las operaciones del sistema creat, mknod, link y unlink), cambiando así el contenido del directorio; El derecho de ejecución permite que un proceso busque un directorio por nombre de archivo (ya que "ejecutar" un directorio no tiene sentido).

Cuando un proceso utiliza una ruta de archivo, el núcleo busca en los directorios el número de inodo correspondiente. Una vez que el nombre del archivo se ha convertido en un número de inodo, el inodo se coloca en la memoria y luego se utiliza en solicitudes posteriores.

El concepto de sistema de archivos Unix incluye el concepto de enlace. Un solo inodo se puede asociar con múltiples nombres de archivos. El descriptor contiene un campo que almacena el número al que está asociado el archivo. Agregar un enlace consiste en crear una entrada de directorio donde el número de inodo apunta a otro inodo e incrementar el contador de enlaces en el inodo. Cuando se elimina un enlace, el kernel disminuye el contador de enlaces y elimina el identificador si el contador llega a cero.

Estos enlaces se denominan enlaces duros y sólo se pueden utilizar dentro de un sistema de archivos (no se puede crear un enlace para un archivo de otro sistema de archivos). Además, un enlace físico sólo puede apuntar a un archivo (un enlace físico a un directorio puede provocar un bucle en el sistema de archivos).

En la mayoría de los sistemas Unix existe otro tipo de enlace. Estos enlaces, que contienen sólo el nombre del archivo, se denominan simbólicos. Cuando el kernel procesa dichos enlaces, al convertir la ruta del archivo en un inodo, el kernel reemplaza el nombre del enlace con el contenido del inodo (es decir, el nombre del archivo de destino) y reinterpreta la ruta del archivo. Dado que un enlace simbólico no apunta a un inodo, es posible crear enlaces a archivos ubicados en otro sistema de archivos. Estos enlaces pueden apuntar a cualquier tipo de archivo, incluso a archivos inexistentes. Los enlaces simbólicos se utilizan ampliamente porque no tienen las mismas restricciones que los enlaces físicos. Sin embargo, ocupan algo de espacio en el disco donde se encuentran el inodo y los bloques de datos. Su uso puede provocar algunos retrasos en la conversión de la ruta del archivo a un inodo, debido al hecho de que el núcleo debe reinterpretar la ruta del archivo al procesar un enlace simbólico.

Archivos de dispositivo

En los sistemas operativos tipo Unix, se accede a los dispositivos a través de archivos especiales. Un archivo de este tipo no ocupa espacio en el sistema de archivos. Es sólo un punto de acceso al controlador del dispositivo.

Hay dos tipos de archivos de dispositivo: de carácter y de bloque. Cuando usa un tipo de carácter, solo puede intercambiar datos con un dispositivo en modo de caracteres, mientras que los archivos de dispositivo de tipo bloque solo le permiten intercambiar bloques usando un búfer. Cuando se realiza una solicitud de E/S a un archivo de dispositivo, la solicitud se reenvía al controlador de dispositivo apropiado. Cada uno de estos archivos tiene un número mayor que identifica el tipo de dispositivo y un número menor que identifica el dispositivo en sí.

Funciones adicionales de EXT2fs

Además de las funciones estándar de Unix, EXT2fs proporciona algunas funciones adicionales que normalmente no son compatibles con los sistemas de archivos Unix.

Los atributos de archivo le permiten cambiar cómo reacciona el kernel cuando trabaja con conjuntos de archivos. Puede establecer atributos en un archivo o directorio. En el segundo caso, los archivos creados en este directorio heredan estos atributos.

Durante el montaje del sistema, se pueden configurar algunas funciones relacionadas con los atributos del archivo. La opción de montaje permite al administrador elegir cómo se crean los archivos. En un sistema de archivos específico de BSD, los archivos se crean con el mismo ID de grupo que el directorio principal. Las características del System V son algo más complejas. Si un directorio tiene su bit setgid establecido, entonces archivos creados hereda el ID de grupo de ese directorio, y los subdirectorios heredan el ID de grupo y el bit setgid. De lo contrario, los archivos y directorios se crean con el ID del grupo principal del proceso de llamada.

El sistema EXT2fs puede utilizar modificación de datos sincrónica similar al sistema BSD. La opción de montaje permite al administrador especificar que todos los datos (inodos, bloques de bits, bloques indirectos y bloques de directorio) se escriban en el disco de forma sincrónica cuando se modifican. Esto puede usarse para lograr una alta capacidad de registro de datos, pero también da como resultado un rendimiento deficiente. En realidad, esta función no se suele utilizar porque, además de degradar el rendimiento, puede provocar la pérdida de datos del usuario que no se marcan al comprobar el sistema de archivos.

EXT2fs le permite seleccionar el tamaño del bloque lógico al crear un sistema de archivos. Puede tener un tamaño de 1024, 2048 o 4096 bytes. El uso de bloques más grandes da como resultado operaciones de E/S más rápidas (ya que se realizan menos solicitudes de disco) y, por lo tanto, menos movimiento de cabeza. Por otro lado, el uso de bloques grandes genera una pérdida de espacio en disco. Normalmente, el último bloque de un archivo no se utiliza completamente para almacenar información, por lo que a medida que aumenta el tamaño del bloque, aumenta la cantidad de espacio desperdiciado en el disco.

EXT2fs le permite utilizar enlaces simbólicos acelerados. Cuando se utilizan dichos enlaces, no se utilizan bloques de datos del sistema de archivos. El nombre del archivo de destino no se almacena en el bloque de datos, sino en el propio inodo. Esta estructura le permite ahorrar espacio en disco y acelerar el procesamiento de enlaces simbólicos. Por supuesto, el espacio reservado para un identificador es limitado, por lo que no todos los enlaces pueden representarse como enlaces acelerados. La longitud máxima del nombre de un archivo en un enlace acelerado es de 60 caracteres. En un futuro próximo está previsto ampliar este esquema a archivos pequeños.

EXT2fs monitorea el estado del sistema de archivos. El núcleo utiliza un campo separado en el superbloque para indicar el estado del sistema de archivos. Si el sistema de archivos está montado en modo lectura/escritura, entonces su estado se establece en "No limpio". Si se desmonta o se vuelve a montar en modo de solo lectura, su estado se establece en "Limpiar". Durante las comprobaciones del estado del sistema de archivos y del arranque del sistema, esta información se utiliza para determinar si es necesaria una verificación del sistema de archivos. El kernel también coloca algunos errores en este campo. Cuando el kernel detecta una discrepancia, el sistema de archivos se marca como "erróneo". El verificador del sistema de archivos prueba esta información para verificar el sistema, incluso si su estado es realmente Limpio.

Ignorar las pruebas del sistema de archivos durante mucho tiempo a veces puede generar algunas dificultades, por lo que EXT2fs incluye dos métodos para verificar el sistema periódicamente. El superbloque contiene el contador de montaje del sistema. Este contador se incrementa cada vez que el sistema se monta en modo de lectura/escritura. Si su valor alcanza el máximo (también se almacena en el superbloque), entonces el programa de prueba del sistema de archivos comienza a verificarlo, incluso si su estado es "Limpio". La hora de la última verificación y el intervalo máximo entre comprobaciones también se almacenan en el superbloque. Cuando se alcanza el intervalo máximo entre análisis, se ignora el estado del sistema de archivos y se inicia su análisis.

El sistema EXT2fs contiene herramientas para configurarlo. El programa tune2fs se puede utilizar para cambiar:

  • acciones cuando se detecta un error. Cuando el kernel detecta una discrepancia, el sistema de archivos se marca como "Error" y se puede realizar una de las siguientes tres acciones: continuar la ejecución, volver a montar el sistema de archivos en modo de solo lectura para evitar daños o reiniciar el sistema para verificar el sistema de archivos.
  • valor máximo de montaje.
  • Intervalo máximo entre controles.
  • Número de bloques lógicos reservados para el usuario root.

Las opciones especificadas en el montaje también se pueden usar para cambiar lo que hace el kernel cuando detecta un error.

El uso de atributos permite a los usuarios eliminar archivos confidenciales. Cuando se elimina un archivo de este tipo, se escribe información aleatoria en los bloques que se utilizaron anteriormente para colocar este archivo. Esto evita que personas ajenas obtengan acceso al contenido anterior de este archivo mediante un editor de disco.

Recientemente se han agregado nuevos tipos de archivos al sistema EXT2fs, tomados del sistema de archivos BSD 4.4. Los archivos del primer tipo se pueden utilizar únicamente para lectura: nadie tiene derecho a modificarlos o eliminarlos. Esto se puede utilizar para proteger archivos de configuración importantes. Otro tipo de archivo es un archivo que se puede abrir en modo de escritura y los datos solo se pueden agregar al final del archivo. Los archivos de este tipo tampoco se pueden eliminar ni cambiar de nombre. Se pueden utilizar como archivos de registro, cuyo tamaño sólo puede crecer.

Optimización del rendimiento

El sistema EXT2fs contiene muchas funciones que optimizan su rendimiento, lo que conduce a una mayor velocidad de intercambio de información al leer y escribir archivos.

EXT2fs utiliza activamente el búfer del disco. Cuando es necesario leer un bloque, el kernel emite una solicitud de operación de E/S a varios bloques adyacentes. Por lo tanto, el núcleo intenta asegurarse de que el siguiente bloque a leer ya se haya cargado en el búfer del disco. Estas operaciones suelen realizarse al leer archivos de forma secuencial.

El sistema EXT2fs también contiene una gran cantidad de optimizaciones para la ubicación de la información. Los grupos de bloques se utilizan para agrupar los inodos y bloques de datos correspondientes. El kernel siempre intenta colocar los bloques de datos de un archivo en el mismo grupo, así como su descriptor. Esto tiene como objetivo reducir el movimiento de los cabezales de unidad al leer el descriptor y sus bloques de datos correspondientes.

Al escribir datos en un archivo, EXT2fs preasigna hasta 8 bloques contiguos al asignar un nuevo bloque. Este método le permite lograr un alto rendimiento bajo una carga pesada del sistema. Esto también permite colocar archivos en bloques contiguos, lo que acelera su lectura posterior.

biblioteca EXT2fs

Para simplificar el uso de los recursos EXT2fs y el funcionamiento de las estructuras de control de este sistema de archivos, se desarrolló la biblioteca libext2fs. Esta biblioteca contiene funciones que se pueden utilizar para definir y modificar datos del sistema de archivos EXT2 accediendo directamente al dispositivo físico.

La mayoría de las utilidades EXT2fs (mke2fs, e2fsck, tune2fs, dumpe2fs, debugfs, etc.) utilizan esta biblioteca. Esto simplifica enormemente la modificación de estas utilidades, ya que cualquier cambio a introducir características adicionales al sistema de archivos EXT2fs sólo debe realizarse en la biblioteca EXT2fs.

Dado que la interfaz de la biblioteca EXT2fs es bastante amplia y abstracta, con su ayuda se pueden escribir fácilmente programas que requieren acceso directo al sistema de archivos. Por ejemplo, la biblioteca EXT2fs se utilizó durante la transferencia del volcado BSD 4.4 y la restauración de algunas utilidades. Se requirieron muy pocos cambios para adaptar estas herramientas a Linux (tuvimos que reemplazar varias funciones que interactúan con el sistema de archivos con llamadas a la biblioteca EXT2fs).

La biblioteca EXT2fs proporciona acceso a las operaciones de varias clases. La primera clase son las operaciones relacionadas con el sistema de archivos. Cualquier programa puede abrir o cerrar un sistema de archivos, leer o escribir un bloque de bits o crear un nuevo sistema de archivos en el disco. También hay funciones para manipular una lista de bloques defectuosos del sistema de archivos.

La segunda clase de operaciones trabaja con directorios. Un programa que utiliza la biblioteca EXT2fs puede crear o expandir un directorio, así como agregar o eliminar entradas en un directorio. Hay funciones tanto para determinar la ruta a un archivo usando un inodo como para determinar la ruta a un archivo usando un descriptor específico.

La última clase de operaciones opera en identificadores de índice. Es posible leer la tabla de descriptores, leer o escribir un descriptor y ver todos los bloques del descriptor especificado. Es posible utilizar funciones para asignar y liberar bloques y descriptores.

Herramientas del sistema EXT2fs

Se han desarrollado controles potentes para el sistema EXT2fs. Estas herramientas se utilizan para crear, modificar y corregir cualquier inconsistencia en los sistemas de archivos EXT2fs. El programa mke2fs se utiliza para montar una partición de disco que contiene un sistema de archivos EXT2fs vacío.

El programa tune2fs se puede utilizar para configurar los parámetros del sistema de archivos. Con su ayuda, puede cambiar la respuesta a errores, el número máximo de montajes del sistema, el intervalo máximo entre comprobaciones del sistema y el número de bloques lógicos reservados para el usuario root.

Quizás la herramienta más interesante sea el comprobador del sistema de archivos. E2fsck está diseñado para eliminar inconsistencias en el sistema de archivos después de un cierre incorrecto de todo el sistema. La versión inicial del programa e2fsck se basa en el programa fsck de Linus Torvald para el sistema de archivos Minix. Sin embargo, la versión actual del programa se reescribe usando la biblioteca EXT2fs y es más rápida y puede corregir más errores en el sistema al verificarlo, en comparación con la versión original.

El programa e2fsck fue diseñado para ejecutarse a máxima velocidad. Dado que los programas de verificación del sistema de archivos provocan la carga del disco, los algoritmos e2fsck deben optimizarse para que se acceda a las estructuras del sistema de archivos con mucha menos frecuencia. Y, además, el orden de comprobación de inodos y directorios se realizaría por número de bloque para reducir el tiempo que lleva mover los cabezales de las unidades de disco.

En la primera pasada, e2fsck recorre todos los inodos del sistema de archivos y examina cada inodo como un elemento independiente del sistema. Por lo tanto, otros objetos del sistema de archivos no se verifican durante esta prueba. Uno de los objetivos de dichas comprobaciones es verificar la existencia del tipo de archivo que se está comprobando, así como la correspondencia de todos los bloques del descriptor con los bloques con números existentes. La primera pasada verifica los mapas de bits que indican el uso de bloques y descriptores.

Si e2fsck encuentra bloques de datos cuyos números están contenidos en más de un descriptor, entonces se ejecutan los pasos 1B a 1D para resolver la discrepancia, ya sea aumentando los bloques a compartir o eliminando uno o más descriptores.

La primera pasada es la que lleva más tiempo, ya que todos los inodos deben leerse en la memoria y comprobarse. Para reducir el tiempo de las operaciones de E/S en pasadas posteriores, toda la información necesaria permanece en el búfer. Un rasgo característico de este esquema es la búsqueda de todos los bloques de directorios del sistema de archivos. Para obtener esta información, en la segunda pasada se vuelven a leer las estructuras de descriptores de todos los directorios del sistema de archivos.

En la segunda pasada, los directorios se verifican como elementos separados del sistema de archivos. Cada bloque de directorio se verifica por separado, sin hacer referencia a otros bloques de directorio. Esto permite a e2fsck ordenar todos los bloques de directorio por número de bloque y verificarlos en orden ascendente, reduciendo así el tiempo de acceso al disco. Los bloques de directorio se prueban para garantizar que sus entradas sean válidas y que contengan referencias a identificadores con números existentes (como se determinó en la primera pasada).

Para el primer bloque de directorio en cada descriptor de directorio, se verifica la existencia de entradas "." y "..", y que el número de descriptor de la entrada "." coincide con el directorio actual. (El número de descriptor de la entrada ".." no se prueba hasta la tercera pasada).

Durante el segundo paso, la información correspondiente al directorio principal se almacena en un búfer.

Cabe señalar que al final del segundo paso, casi todas las operaciones de E/S en el disco están completas. Toda la información necesaria para los pases tercero, cuarto y quinto está contenida en la memoria; sin embargo, los pases restantes cargan el procesador y ocupan menos del 5-10% del tiempo total de ejecución de e2fsck.

En el tercer paso, se verifican las conexiones del directorio. E2fsck verifica las rutas de cada directorio hacia la raíz utilizando la información obtenida durante el segundo paso. Aquí se marca la entrada ".." para cada directorio. Todos los directorios identificados después de verificar y que no tienen una conexión con el directorio raíz se colocan en el directorio /lost+found.

En el cuarto paso, e2fsck verifica los recuentos de referencia para cada inodo revisando todos los inodos y comparando los recuentos de referencia (esta información se guarda del primer paso) con los contadores internos que se calcularon durante el segundo y tercer paso. Todos los archivos recuperados con un recuento de referencias de cero también se colocan en el directorio /lost+found.

Finalmente, en el quinto paso, e2fsck verifica que toda la información del sistema de archivos coincida. Aquí, los mapas de bits de bloques y descriptores obtenidos en pases anteriores se comparan con los valores reales y, si es necesario, la información en el disco se ajusta en consecuencia.

Otra herramienta útil es el depurador del sistema de archivos. Debugfs es un poderoso programa que le permite determinar y configurar el estado de un sistema de archivos. Básicamente, es una interfaz interactiva para la biblioteca EXT2fs, es decir, traduce comandos escritos en llamadas a funciones de la biblioteca.

Debugfs se puede utilizar para determinar la estructura interna de un sistema de archivos, reparar manualmente un sistema dañado o crear pruebas condicionales para e2fsck. Desafortunadamente, este programa puede dañar el sistema de archivos si no sabes cómo usarlo. Con esta herramienta, simplemente puede destruir el sistema de archivos. Por lo tanto, debugfs abre el sistema de archivos en modo de solo lectura de forma predeterminada. Para acceder en modo lectura/escritura, especifique la opción -w.

Cálculo de rendimiento

Los resultados de la prueba de Bonnie se pueden ver en la siguiente tabla:

Grabación carácter a carácter (Kb/s)

Grabación en bloque (Kb/s)

Doblaje (Kb/s)

Lectura carácter a carácter (Kb/s)

Lectura de bloque (Kb/s)

BSD asíncrono

Sincronización BSD

ext2fs

1237

1033

xia fs

Los resultados son bastante buenos con E/S en bloque: el sistema EXT2fs supera a otros sistemas en términos de rendimiento. Esto se debe a las optimizaciones incluidas en los procedimientos de colocación. La grabación también se realiza con bastante rapidez, debido a que se realiza en modo grupo. La alta velocidad de lectura se debe al hecho de que los bloques se han asignado al archivo, por lo que los cabezales de la unidad no se mueven entre dos lecturas y la optimización de la lectura previa está en pleno funcionamiento.

Por otro lado, el sistema FreeBSD tiene un mayor rendimiento para E/S simbólicas. Esto puede deberse al hecho de que FreeBSD y Linux utilizan procedimientos diferentes para las bibliotecas C correspondientes. Además, lo más probable es que FreeBSD tenga una biblioteca de lectura simbólica más optimizada y, por lo tanto, el rendimiento aquí es ligeramente mejor.

Resultados de la prueba de Andrés

Los resultados de la prueba de Andrew se pueden ver en la siguiente tabla:

Pasaje 1 Creación

Pasar 2 Copiar

Pasaje 3 Comprobación de estado

Pasar 4 verificación byte por byte

Compilación del pasaje 5

2203

7391

6319

17466

75314

Sincronización BSD

2330

7732

6317

17499

75681

ext2fs

Los resultados de las dos primeras pasadas muestran que Linux gana con el intercambio de datos asíncrono. Al crear directorios y archivos, el sistema BSD escribe identificadores de directorio y entradas de directorio de forma sincrónica. Se especula que el soporte asíncrono para FreeBSD aún no se ha implementado por completo.

En la tercera pasada, los valores para Linux y BSD son muy similares. Si bien BSD funciona mejor, agregar un búfer de nombre de archivo al VFS de Linux elimina este problema.

En los pases cuarto y quinto, Linux es más rápido que FreeBSD, principalmente debido al uso de una gestión unificada del búfer. El tamaño del búfer puede crecer según sea necesario y ocupar más memoria que FreeBSD, que utiliza un tamaño fijo. Una comparación de los resultados de los sistemas EXT2fs y Xia fs muestra que las optimizaciones incluidas en EXT2fs realmente se utilizan: la diferencia en el rendimiento de estos sistemas es de aproximadamente un 5-10%.

Conclusión

El sistema de archivos EXT2 es el más utilizado entre los usuarios de Linux. Proporciona funciones estándar de Unix y funciones adicionales. Además, gracias a la optimización incluida en el kernel, muestra excelentes resultados de rendimiento.

El sistema EXT2fs incluye funciones que le permiten agregar nuevas capacidades. Algunas personas están trabajando en el desarrollo de extensiones para el sistema de archivos real: Posix ACL, recuperación archivos eliminados y compresión de archivos en tiempo real.

Primero, el sistema EXT2fs se integró en el kernel de Linux y ahora se está migrando activamente a otros sistemas operativos. EXT2fs también es un componente importante del sistema operativo Masix, que actualmente está siendo desarrollado por uno de los autores.

VLADIMIR MESHKOV

arquitectura del sistema de archivos ext2

El artículo analiza la estructura lógica de ext2, el sistema de archivos del sistema operativo Linux.

Componentes principales del sistema de archivos ext2

Como ocurre con cualquier sistema de archivos UNIX, el sistema de archivos ext2 incluye los siguientes componentes:

  • bloques y grupos de bloques;
  • nodo de información;
  • supermanzana.

Bloques y grupos de bloques

Todo el espacio de la partición del disco se divide en bloques de tamaño fijo, múltiplos del tamaño del sector: 1024, 2048 y 4096 bytes. El tamaño del bloque se especifica al crear un sistema de archivos en una partición del disco duro. Un tamaño de bloque más pequeño ahorra espacio en el disco duro, pero también limita talla máxima sistema de archivos. Todos los bloques tienen números de serie. Para reducir la fragmentación y la cantidad de movimientos de los cabezales del disco duro al leer grandes cantidades de datos, los bloques se combinan en grupos.

Centro de información

El concepto básico de un sistema de archivos es el nodo de información o inodo. Esta es una estructura especial que contiene información sobre los atributos y la ubicación física del archivo. Los atributos de un archivo son su tipo (archivo normal, directorio, etc.), derechos de acceso al mismo, ID del propietario, tamaño y hora de creación. La información de ubicación física es una secuencia de números de bloque absolutos que contienen datos de archivos.

Supermanzana

Superbloque es el elemento principal del sistema de archivos ext2. Contiene la siguiente información del sistema de archivos (la lista está incompleta):

  • el número total de bloques e inodos en el sistema de archivos;
  • número de bloques e inodos libres en el sistema de archivos;
  • tamaño de bloque del sistema de archivos;
  • número de bloques e inodos en el grupo;
  • tamaño del inodo;
  • identificador del sistema de archivos;
  • número del primer bloque de datos.

En otras palabras, este es el número del bloque que contiene el superbloque. Este número es siempre 0 si el tamaño del bloque del sistema de archivos es mayor que 1024 bytes y 1 si el tamaño del bloque es 1024 bytes.

La integridad del superbloque afecta directamente el rendimiento del sistema de archivos. El sistema operativo crea varias copias de seguridad del superbloque para poder restaurarlo en caso de daños. La copia maestra se encuentra en un desplazamiento de 1024 bytes desde el comienzo de la partición en la que se creó el sistema de archivos (los primeros 1024 bytes están reservados para el cargador del sistema operativo).

Las primeras versiones del sistema de archivos ext2 creaban copias del superbloque al comienzo de cada grupo de bloques. Esto resultó en una gran cantidad de espacio en disco desperdiciado, por lo que luego se redujo la cantidad de copias de seguridad de superbloques y se asignaron los grupos de bloques 0, 1, 3, 5 y 7 para acomodarlos.

Formato de grupo de bloques

generalizado esquema estructural El sistema de archivos ext2 se muestra en la Fig. 1.

Casi todos los grupos de bloques tienen el mismo formato. En cada grupo, además de los bloques de información, se almacena en forma de mapa de bits información sobre la ocupación de los bloques y el inodo del grupo. El grupo de bloques 0 también incluye un superbloque y una tabla de descriptores de grupo, que veremos a continuación.

El mapa de bits de ocupación del bloque suele estar ubicado en el primer bloque de un grupo. Si hay un superbloque de respaldo en el grupo, el mapa de bits se ubica en el segundo bloque del grupo. El tamaño del mapa de bits es de un bloque. Cada bit de este mapa representa el estado del bloque. Si el bit está puesto (1), entonces el bloque está ocupado; si está puesto a cero (0), el bloque está libre. El primer bloque del grupo corresponde al bit cero de la tarjeta, el segundo bloque al primer bit, etc.

Los inodos ubicados dentro del mismo grupo se recopilan en una tabla. En el mapa de bits de ocupación de inodos de un grupo, cada bit caracteriza el estado de un elemento en la tabla de inodos del grupo.

Cada grupo de bloques se describe mediante un descriptor de grupo de bloques. Un descriptor de grupo es una estructura que contiene información sobre las direcciones del mapa de bits de ocupación de bloques, el mapa de bits de ocupación de inodos y la tabla de inodos del grupo correspondiente. Todos los descriptores de grupo se recopilan en una tabla de descriptores de grupo, que se almacena en el grupo de bloques 0. Lo mismo que para el superbloque, Sistema operativo crea copias de seguridad tablas de descriptores de grupo.

Algoritmo de lectura de archivos

Cada inodo, como un bloque, tiene un número de secuencia que es único dentro del sistema de archivos y contiene información sobre un solo archivo. Por tanto, para acceder al contenido de un archivo, es necesario conocer el número de serie del inodo correspondiente.

Como se mencionó anteriormente, la información sobre la ubicación física del archivo está contenida en el inodo. Esta información es una secuencia de números de bloque de 32 bits que contienen los datos del archivo (Figura 1). Los primeros 12 números son enlaces directos a bloques de información (número de bloques directos). El número 13 es un enlace indirecto (número de bloques indirectos). Contiene la dirección del bloque en el que se almacenan las direcciones de los bloques de información. El número 14 es un enlace indirecto doble (número de bloques dobles), el número 15 es un enlace indirecto triple (número de bloques triples).

El nombre del archivo no está incluido en el inodo; la correspondencia entre los nombres de los archivos y los números de inodo se realiza a través de directorios.

Catálogos

Los archivos en los sistemas UNIX y POSIX se almacenan en un sistema de archivos jerárquico en forma de árbol. La raíz del sistema de archivos es el directorio raíz, indicado por el símbolo "/". Cada nodo intermedio en el árbol del sistema de archivos es un directorio. Los vértices terminales de un árbol de sistema de archivos son directorios o archivos vacíos. La ruta absoluta de un archivo consta de los nombres de todos los directorios que conducen a el archivo especificado, comenzando desde el directorio raíz. Entonces, el nombre de ruta /home/test.file significa que el archivo test.file se encuentra en directorio de inicio, que a su vez se encuentra en el directorio raíz "/".

Un directorio, como un archivo, se describe mediante un inodo. El contenido de un directorio es una serie de entradas, cada una de las cuales contiene información sobre un archivo que está "dentro" del directorio actual.

Una entrada de directorio tiene el siguiente formato:

  • número de serie del inodo del archivo;
  • longitud del registro en bytes;
  • Nombre del archivo;
  • longitud del nombre del archivo.

La búsqueda del número de inodo de un archivo siempre comienza desde el directorio raíz. Por ejemplo, para obtener el número de inodo de un archivo ubicado en el directorio raíz, el sistema operativo debe obtener el contenido del directorio raíz, encontrar una entrada con el nombre de este archivo y extraer el número de inodo del archivo de esta entrada.

Los primeros números de inodo están reservados por el sistema de archivos; su lista está contenida en el archivo de encabezado:

* Números de inodo especiales

#define EXT2_BAD_INO 1 /* Inodo de bloques defectuosos */

#define EXT2_ROOT_IN 2 /* Inodo raíz */

#define EXT2_ACL_IDX_IN 3 /* inodo ACL */

#define EXT2_ACL_DATA_INO 4 /* inodo ACL */

#define EXT2_BOOT_LOADER_INO 5 /* Inodo del cargador de arranque */

#define EXT2_UNDEL_DIR_INO 6 /* Recuperar inodo del directorio */

El inodo número 2 (inodo raíz) está reservado para escribir el directorio raíz. Este inodo está en el grupo de bloques 0 y ocupa la segunda posición en la tabla de inodos de este grupo. El número del primer inodo no reservado se almacena en el superbloque.

Una vez determinado el número de inodo de un archivo, el núcleo calcula el número del grupo en el que se encuentra este inodo y su posición en la tabla de inodos del grupo. Al leer desde esta posición de inodo, el sistema operativo recibe información completa sobre el archivo, incluidas las direcciones de los bloques en los que se almacena el contenido del archivo.

El número del grupo de bloques en el que se encuentra el inodo se calcula mediante la fórmula:

grupo = (inode_num - 1) / inodes_per_group

Dónde:

  • grupo– el número del grupo de bloques requerido;
  • num_inodo– número de serie del inodo que define el archivo;
  • inodos_por_grupo– el número de inodos en el grupo (esta información se encuentra en el superbloque).

La posición del inodo en la tabla de inodos del grupo está determinada por la fórmula:

índice = (inode_num - 1) % inodes_per_groupe

donde índice es la posición del inodo en la tabla.

Veamos un ejemplo de cómo obtener el contenido del archivo test.file ubicado en el directorio raíz. Para leer el archivo /test.file necesita:

  • busque una entrada sobre este archivo en la matriz de entradas del directorio raíz;
  • extraiga el número de serie del inodo del archivo, calcule el número del grupo en el que se encuentra este inodo;
  • extraiga la dirección de la tabla de inodos del grupo del descriptor de este grupo;
  • calcule la posición del inodo en esta tabla;
  • leer el inodo del archivo;
  • extraiga las direcciones de los bloques de información del inodo y lea la información contenida en estos bloques.

En la Fig. La Figura 2 muestra en detalle los pasos para leer el archivo /test.file.

    Pasos 1 a 6: leer el directorio raíz:

  1. Del grupo de bloques 0 se lee la tabla de descriptores de grupo.
  2. El descriptor 0 del grupo de bloques se recupera de la tabla de descriptores de grupo y de ella se lee la dirección de la tabla de inodos del grupo 0.
  3. La tabla de inodos se lee del grupo de bloques 0.
  4. El número de inodo del directorio raíz es fijo e igual a 2, por lo que el segundo elemento se lee de la tabla de inodos del grupo 0, que contiene la dirección del bloque con el contenido del directorio raíz. Supongamos que este bloque está ubicado en el grupo de bloques A.
  5. Del grupo de bloques A, se lee un bloque que contiene entradas del directorio raíz.
  6. Se realiza una búsqueda de una entrada denominada "test.file". Si se encuentra una entrada de este tipo, se extrae de ella el número de inodo del archivo “test.file”.
  7. Una vez determinado el número de inodo, puede acceder a los bloques de información del archivo (pasos 7-11):

  8. Se calcula el número de grupo en el que se encuentra el inodo dado y su posición en la tabla de inodos de grupo (suponiendo que el número de grupo es B y la posición de la tabla es X).
  9. De la tabla de descriptores de grupo, recuperamos el descriptor del grupo de bloques B y de él se lee la dirección de la tabla de inodos de este grupo de bloques.
  10. La tabla de inodos se lee del grupo de bloques B.
  11. De la tabla de inodos del grupo de bloques B, se lee el inodo ubicado en la posición X.
  12. Desde el inodo de lectura, se extraen las direcciones del bloque con el contenido del archivo /test.file y se lee la información del bloque con la dirección especificada.

Implementación de software del algoritmo de lectura de archivos.

Datos iniciales: disponibles sección dura disco en el que se crea el sistema de archivos ext2. Esta sección corresponde al archivo del dispositivo /dev/hda3. Se ha creado un subdirectorio home en el directorio raíz de la partición, y en él se encuentra un archivo test.file con el siguiente contenido:

¿Vivirían los cítricos en los matorrales del sur?

¡Sí, pero una copia falsa!

1234567890-=

¡No penséis nada malo, esto no es una tontería, sino un ejercicio de prueba del curso de formación para operadores de telégrafos en las tropas de comunicaciones de la antigua URSS!

¡Atención! Una cosa a considerar punto importante. El archivo creado no se escribirá inmediatamente en el disco, sino que primero irá al búfer del disco. Un intento de obtener inmediatamente el contenido de un archivo utilizando el algoritmo anterior no conducirá a nada, ya que la información sobre este archivo no está físicamente disponible en el disco. Es necesario "forzar" al sistema a escribir el búfer del disco en el disco. La forma más sencilla de hacerlo es realizar una operación de reinicio. Por lo tanto, una vez creado el archivo, reinicie el sistema.

Nuestra tarea es utilizar el archivo del dispositivo /dev/hda3 para leer el archivo /home/test.file usando acceso directo a sus bloques de información.

Consideremos la implementación de software del módulo que realiza esta operación.

Archivos de encabezado:

#incluir

#incluir

#incluir

#incluir

#incluir

#incluir

El archivo de encabezado define tipos estructurales que describen los componentes principales del sistema de archivos ext2: superbloque, descriptor de grupo de bloques, nodo de información, entrada de directorio.

Veamos brevemente los campos que se incluyen en cada una de estas estructuras:

  1. Estructura de superbloque estructura ext2_super_block:
    • __u32 s_inodes_count– número total de inodos en el sistema de archivos;
    • __u32 s_bloques_count– el número total de bloques en el sistema de archivos;
    • __u32 s_free_blocks_count– número de bloques libres;
    • __u32 s_free_inodes_count– número de inodos libres;
    • __u32 s_first_data_block– número del primer bloque de datos (número del bloque en el que está situado el superbloque);
    • __u32 s_log_block_size– Este valor se utiliza para calcular el tamaño del bloque. El tamaño del bloque está determinado por la fórmula: tamaño del bloque = 1024<< s_log_block_size;
    • __u32 s_bloques_por_grupo– número de bloques en el grupo;
    • __u32 s_inodos_por_grupo– número de inodos en el grupo;
    • __u16 s_magia– identificador del sistema de archivos ext2 (firma 0xEF53);
    • __u16 s_inode_size– tamaño del nodo de información (inodo);
    • __u32 s_first_ino– número del primer inodo no reservado.
  2. Estructura del descriptor del grupo de bloques struct ext2_group_desc:
    • __u32 bg_block_bitmap– mapa de bits de ocupación de bloques de grupo;
    • __u32 bg_inode_bitmap– mapa de bits de ocupación del grupo de inodos;
    • __u32 bg_inode_table– dirección de la tabla de inodos del grupo.
  3. La estructura del nodo de información struct ext2_inode:
    • __u16 i_mode – tipo de archivo y derechos de acceso. El tipo de archivo está determinado por los bits 12-15 de este campo:
      • 0xA000– enlace simbólico;
      • 0x8000– archivo regular;
      • 0x6000– bloquear el archivo del dispositivo;
      • 0x4000- Catálogo;
      • 0x2000– archivo de dispositivo de caracteres;
      • 0x1000– Canal FIFO.
    • __u32 i_talla– tamaño en bytes;
    • __u32 i_atime– hora del último acceso al fichero;
    • __u32 i_ctime– hora de creación del archivo;
    • __u32 i_mtime– hora de la última modificación;
    • __u32 i_bloques– el número de bloques ocupados por el archivo;
    • __u32 i_bloque– direcciones de bloques de información (incluidos todos los enlaces indirectos).
  4. El valor de EXT2_N_BLOCKS se define en el archivo:

    * Constantes relativas a los bloques de datos.

    #definir EXT2_NDIR_BLOCKS 12

    #definir EXT2_IND_BLOCK EXT2_NDIR_BLOCKS

    #definir EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)

    #definir EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)

    #definir EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)

  5. Estructura de entrada del directorio estructura ext2_dir_entry_2:
  6. #definir EXT2_NAME_LEN 255

  • __u32 inodo– número de inodo del archivo;
  • __u16 rec_len– longitud de la entrada del directorio;
  • __u8 nombre_len– longitud del nombre del archivo;
  • nombre del personaje Nombre del archivo.

Determinemos el nombre de la partición en la que se crea el sistema de archivos, las estructuras globales y las variables.

#define PART_NAME "/dev/hda3"

estructura ext2_super_block sb;

/* buffer para almacenar la tabla de descriptores de grupo */

carbón sin firmar buff_grp;

aficionado al carbón sin firmar; /* buffer de información */

int indev; /* descriptor de archivo del dispositivo */

int BLKSIZE; /* tamaño del bloque del sistema de archivos */

Definamos varias funciones que necesitamos para trabajar:

Función de lectura de superbloque:

nulo read_sb()

Conjunto de memoria(&sb,0.1024);

Movemos 1024 bytes desde el principio de la sección y leemos el superbloque en la estructura struct ext2_super_block sb:

Si(lseek(indev,1024,0)< 0) {

Perror("buscar");

Salir(-1);

Si(leer(indev,(char *)&sb,sizeof(sb))< 0) {

Perror("leer");

Salir(-1);

Comprobando el identificador del sistema de archivos:

Si (sb.s_magic! = EXT2_SUPER_MAGIC) (

Printf("¡Tipo de sistema de archivos desconocido!");

Salir(-1);

El valor EXT2_SUPER_MAGIC se define en el archivo de encabezado.

Mostramos información sobre el sistema de archivos que se encuentra en el superbloque:

printf(" Información del superbloque ----------- ");

Printf("Recuento de inodos - %u ",sb.s_inodes_count);

Printf("Recuento de bloques - %u ",sb.s_blocks_count);

Printf("Tamaño de bloque - %u ",1024<< sb.s_log_block_size);

Printf("Primer inodo - %d ",sb.s_first_ino);

Printf("Magia - 0x%X ",sb.s_magic);

Printf("Tamaño de inodo - %d ",sb.s_inode_size);

Printf("Inodos por grupo - %u ",sb.s_inodes_per_group);

Printf("Bloques por grupo - %u ",sb.s_blocks_per_group);

Printf("Primer bloque de datos - %u ",sb.s_first_data_block);

Devolver;

Función de lectura de la tabla de descriptores de grupo:

nulo read_gdt()

Calcule el tamaño del bloque del sistema de archivos:

TAMAÑO NEGRO = 1024<< sb.s_log_block_size

La tabla de descriptores de grupo se encuentra en el bloque que se ubica inmediatamente después del primer bloque de datos (detrás del superbloque).

Leyendo la tabla:

Si(lseek(indev, (sb.s_first_data_block + 1) * BLKSIZE, 0)< 0) {

Perror("buscar");

Salir(-1);

Si(leer(indev,buff_grp,BLKSIZE)< 0) {

Perror("leer");

Salir(-1);

Devolver;

Función para obtener el contenido de un inodo por su número:

void get_inode(int inode_num, struct ext2_inode *in)

Los parámetros de entrada de la función son el número de secuencia del inodo y la estructura struct ext2_inode.

Estructura ext2_group_desc gd;

Grupo U64, índice, pos;

Calculamos el número del grupo de bloques en el que se encuentra el inodo con el número de serie inode_num:

Grupo = (inode_num - 1) / sb.s_inodes_per_group;

De la tabla de descriptores de grupo, extraiga el descriptor de grupo y cópielo en la estructura struct ext2_group_desc gd:

Memset((void *)&gd, 0, tamaño de(gd));

Memcpy((void *)&gd, buff_grp + (grupo * (sizeof(gd))), sizeof(gd));

Calculamos la posición del inodo con el número de serie inode_num en la tabla de inodos del grupo grupo y leemos este inodo en la estructura struct ext2_inode:

índice = (inode_num - 1) % sb.s_inodes_per_group;

Pos = ((__u64)gd.bg_inode_table) * BLKSIZE + (índice * sb.s_inode_size);

Pread64(indev, in, sb.s_inode_size, pos);

Devolver;

Función de lectura de bloque de datos:

void read_iblock(struct ext2_inode *in, int blk_num)

posición U64;

Los parámetros de entrada de la función son la estructura del inodo y el número de bloque (es decir, el número de la secuencia de bloques de direcciones ubicados en el inodo).

Calculamos el desplazamiento del bloque de información en la sección y leemos este bloque en el búfer de mejora global:

Pos = ((__u64)in->i_block) * BLKSIZE;

Pread64(indev, buff, BLKSIZE, pos);

Devolver;

Función para obtener el contenido del directorio raíz:

anular get_root_dentry()

Estructura ext2_inode en;

Se conoce el número de serie del inodo del directorio raíz, por lo que obtenemos el contenido del inodo del directorio raíz y leemos su contenido en el buffer buff:

get_inode(EXT2_ROOT_INO, &en);

Read_iblock(&en, 0);

El búfer de mejora contendrá el contenido del directorio raíz.

Devolver;

Función para obtener el número de inodo por nombre de archivo:

int get_i_num(char *nombre)

Los parámetros de entrada de la función son el nombre del archivo. El valor de retorno es el número de inodo del archivo.

Int i = 0, rec_len = 0;

Estructura ext2_dir_entry_2 abolladura;

El búfer de mejora contiene una serie de entradas de directorio. Para determinar el número de inodo de un archivo, necesita encontrar una entrada en esta matriz con el nombre de este archivo:

Para (; yo< 700; i++) {

Memcpy((void *)&dent, (buff + rec_len), sizeof(dent));

If(!memcmp(dent.name, name, dent.name_len)) break;

Rec_len += dent.rec_len;

Devolver dent.inode;

Ahora escribamos la función principal:

int principal()

Variables y estructuras:

estructura ext2_inode en;

// ruta absoluta del archivo

Char sin firmar *full_path = "/home/test.file";

Char buff1 sin firmar;

Estático int i = 1;

Int n, i_num, outf, tipo;

El primer carácter de la ruta absoluta de un archivo debe ser una barra diagonal (/). Comprobemos esto:

Si (ruta_completa! = "/") (

Perror("barra");

Salir(-1);

Abra el archivo del dispositivo, lea el superbloque y la tabla de descriptores de grupo:

Indev = abierto(PART_NAME,O_RDONLY);

si(indev)< 0) {

Perror("abierto");

Salir(-1);

Leer_sb();

Read_gdt();

Obtenemos el contenido del directorio raíz:

get_root_dentry();

Ahora el búfer de mejora contiene todas las entradas en el directorio raíz (puede guardarlas en un archivo separado si lo desea). Ahora, dadas las entradas del directorio raíz, podemos acceder al contenido de test.file utilizando el algoritmo de lectura de archivos anterior. Para ello organizamos un ciclo. En el cuerpo del bucle, analizaremos el nombre de la ruta absoluta del archivo, resaltando sus elementos: subdirectorios (solo tenemos uno, inicio) y el nombre del archivo que estamos buscando (test.file). Para cada elemento, determinamos el número de serie del inodo, contamos este inodo y luego obtenemos el contenido del bloque cero (de la secuencia de bloques de direcciones ubicados en el inodo):

mientras(1) (

Memset(buff1,0,sizeof(buff1));

Para (n = 0; norte< EXT2_NAME_LEN; n++, i++) {

Buff1[n] = ruta_completa[i];

If((buff1[n] == "/") || (buff1[n] == "?")) (

Yo++;

Romper;

buff1[n] = "?";

Para cada elemento de la ruta absoluta del archivo, determinamos el número de secuencia del inodo, leemos este inodo en la memoria y luego obtenemos el contenido del bloque cero:

I_num = get_i_num(buff1);

Get_inode(i_num, &in);

Read_iblock(&en, 0);

Mostremos información sobre el archivo (nombre, número de inodo, tamaño y tipo de archivo):

Printf("Número de inodo - %u ", i_num);

Printf("Nombre de archivo - %s ", buff1);

Printf("Tamaño de archivo - %u ",in.i_size);

El tipo de archivo está determinado por los cuatro bits más altos del campo i_mode de la estructura struct ext2_inode:

tipo = ((in.i_mode & 0xF000) >> 12);

Printf("Tipo - %d ",tipo);

Cambiar(tipo) (

Caso (0x04):

Printf("(directorio) ");

Romper;

Caso (0x08):

Printf("(archivo normal) ");

Romper;

Caso (0x06):

Printf("(bloquear archivo de dispositivo) ");

Romper;

Caso (0x02):

Printf("(archivo de dispositivo de caracteres) ");

Romper;

Por defecto:

Printf("(tipo desconocido) ");

Romper;

Comprobando el tipo de archivo. Si se trata de un archivo normal, interrumpimos el ciclo:

Si (escriba & 0x08) (

El búfer de mejora contendrá información leída de los bloques de información del archivo /home/test.file. Escribamos esta información en un archivo:

Salida = open("salida",O_CREAT|O_RDWR,0600);

Escribir(outf, buff, sizeof(buff));

Cerrar(fuera);

Romper;

Salimos:

Cerrar(indev);

Devuelve 0;

Con esto concluye nuestra consideración de la estructura lógica del sistema de archivos ext2.



¿Te gustó el artículo? Compártelo