Ventanas.  virus  Cuadernos.  Internet.  oficina.  Utilidades.  Conductores

El sistema de archivos de Linux suele ser ext4. Está registrando y le permite trabajar convenientemente con datos al resolver la gran mayoría de las tareas. Sin embargo, hay otros. Tipos principales sistemas de archivos y los principios de trabajar con ellos se considerarán en el marco de este material.

Tipos de sistemas de archivos de Linux y sus características

Las características distintivas son la velocidad de trabajo con archivos, la seguridad y los parámetros (como el tamaño del bloque) que existen de forma predeterminada y se establecen cuando se crea el FS. Quizás lo más característica importante es la presencia de un registro. El registro del sistema registra datos o metadatos(solo encabezados) de los cuales se puede recuperar información en caso de falla.

Se puede crear un sistema de archivos en cualquier dispositivo: disco o partición del sistema.

sistema de archivos EXT2

EXT2 es un sistema de archivos ahora obsoleto que apenas se usa en las instalaciones modernas. el principal inconveniente es la falta de registro, lo que, en consecuencia, hace que sea imposible restaurar los datos en caso de falla. Todavía se aplica a medios portátiles información como USB. No se requiere una revista para ellos, ya que ocupa una cierta cantidad de espacio.

También garantiza la máxima velocidad.

  • para EXT2, el tamaño máximo de archivo es -2 TB

sistema de archivos EXT3

EXT2 desplazado, caracteristica principal es la apariencia de la revista, es totalmente compatible con versiones anteriores de EXT2 (EXT2 se puede convertir libremente a EXT3). Ahora también es raro, casi siempre se usa EXT4.

El registro es un área especial en la memoria que registra información sobre todos los cambios.

  • para EXT3 el tamaño máximo de archivo es -2 TB
  • el tamaño máximo de todos los archivos es de 32 TB
  • Cada directorio puede tener hasta 32.000 subdirectorios

Hay tres opciones para registrar en diario (especificadas al crear el sistema de archivos):

  • revista: en los metadatos de la revista, así como en la información misma
  • ordenado: la opción predeterminada, solo los metadatos se guardan después de escribir en el disco
  • reescritura: solo se guardan los metadatos, puede optar por guardarlos antes de escribir en el disco o después

sistema de archivos EXT4

La versión moderna del sistema de archivos extendido, se usa con mayor frecuencia

  • tamaño máximo de archivo -2 TB 16 TB
  • el tamaño máximo de todos los archivos es de 1 EB (exabyte). 1 EB = 1024 PB (petabyte). 1 PB = 1024 TB (terabyte).
  • Cada directorio puede tener hasta 64.000 subdirectorios

En EXT4, el registro se puede desactivar configurando la opción datos cuando se monta en apagado

EXT como principal sistema de archivos y prácticas de trabajo de Linux

El sistema de archivos es creado por el comando mk2fs

La opción de registro deseada se especifica durante el montaje, por ejemplo:

montar /dev/vdc /mnt/1 -t ext3 -o datos=diario

Conversión de EXT2 E a XT3

ReiserFS

ReiserFS (y la implementación moderna de Reiser4 con compatibilidad con SELinux) funcionan bien y son muy productivos, especialmente cuando se trabaja con una gran cantidad de archivos pequeños. ReiserFS no asigna inodos para cada archivo pequeño procesándolos juntos, también ReiserFS usa un diario con varias opciones disponibles. Actualmente, el sistema de archivos es compatible con desarrolladores de Rusia.

Puede crear un FS para un dispositivo con el comando

XFS

XFS es un sistema de archivos con diario. Utiliza RAM para almacenar información, por lo que es posible la pérdida de datos, por ejemplo, cuando se apaga la alimentación.

Para usar XFS en Ubuntu necesitarás instalar paquetes xfsprogs Y volcado xfs

gordo

El sistema de archivos de Linux también existe en el entorno de Windows. Se utiliza cuando es necesario organizar el acceso conjunto a determinados discos y particiones de clientes con diferentes sistemas operativos. En otros casos, no se recomienda su uso porque puede ser difícil cuando se trabaja en Linux.

VLADIMIR MESHKOV

arquitectura del sistema de archivos ext2

El artículo analiza la estructura lógica de ext2: el sistema de archivos Sistema operativo linux

Componentes básicos de un sistema de archivos ext2

Como en cualquier sistema de archivos UNIX, los siguientes componentes se pueden distinguir en el sistema de archivos ext2:

  • bloques y grupos de bloques;
  • nodo de información (nodo de información);
  • supermanzana

Bloques y grupos de bloques

Todo el espacio de 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 disco duro. Un tamaño de bloque más pequeño ahorra espacio en el disco duro, pero también limita el tamaño máximo del sistema de archivos. Todos los bloques tienen números de serie. Para reducir la fragmentación y la cantidad de movimientos del cabezal del disco duro al leer grandes conjuntos de datos, los bloques se combinan en grupos.

Nodo de información

El concepto básico de un sistema de archivos es un nodo de información, un nodo de información o un inodo. Esta es una estructura especial que contiene información sobre los atributos y la ubicación física de un archivo. Los atributos del archivo son su tipo (archivo normal, directorio, etc.), derechos de acceso, identificación del propietario, tamaño, 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 archivo.

supermanzana

El superbloque es el elemento principal del sistema de archivos ext2. Contiene la siguiente información sobre el sistema de archivos (la lista no está completa):

  • el número total de bloques e inodos en el sistema de archivos;
  • el número de bloques e inodos libres en el sistema de archivos;
  • tamaño de bloque del sistema de archivos;
  • el 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 siempre es 0 si el tamaño del bloque del sistema de archivos es superior a 1024 bytes y 1 si el tamaño del bloque es de 1024 bytes.

La salud del sistema de archivos depende directamente de la integridad del superbloque. El sistema operativo crea varias copias de seguridad supermanzana para su restauración en caso de avería. La copia maestra se encuentra en el desplazamiento de 1024 bytes desde el principio 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 de superbloques al comienzo de cada grupo de bloques. Esto resultó en una gran pérdida de espacio en disco, por lo que más tarde 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

Un diagrama de bloques generalizado del 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 información sobre la ocupación de bloques e inodos del grupo en forma de mapa de bits. El grupo de bloques 0 también incluye un superbloque y una tabla de descriptores de grupos, que analizaremos a continuación.

El mapa de bits de bloque ocupado generalmente se encuentra en el primer bloque del 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 indica el estado del bloque. Si el bit está activado (1), el bloque está ocupado; si está activado (0), el bloque está libre. El primer bloque del grupo corresponde al bit cero del mapa, el segundo bloque corresponde al primer bit y así sucesivamente.

Los inodos que están dentro del mismo grupo se recopilan en una tabla. En el mapa de bits de ocupación de inodos de un grupo, cada bit representa 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 ocupado del bloque, el mapa de bits del inodo ocupado 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. Al igual que con el superbloque, el sistema operativo realiza una copia de seguridad de la tabla 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. Así, para acceder al contenido de un archivo es necesario conocer el número ordinal del inodo que le corresponde.

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 número de bloque indirecto. Contiene la dirección del bloque, que almacena 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 es parte del inodo, el mapeo entre los nombres de archivo y los números de secuencia del 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 nodos hoja del árbol del sistema de archivos son directorios o archivos vacíos. El nombre de ruta absoluto de un archivo consta de los nombres de todos los directorios que conducen al archivo especificado, comenzando desde el directorio raíz. Por ejemplo, el nombre de ruta /home/test.file significa que el archivo test.file se encuentra en el directorio de inicio, que a su vez se encuentra en el directorio raíz "/".

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

La entrada del directorio tiene el siguiente formato:

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

La búsqueda del número de inodo de un archivo siempre comienza en 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 en él con el nombre de este archivo y extraer el número de inodo del archivo de esta entrada. .

Los primeros inodos están reservados por el sistema de archivos y se enumeran 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 directorio inodo */

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

Habiendo determinado el número de secuencia del inodo del 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 obtiene información completa sobre el archivo, incluidas las direcciones de los bloques en los que se almacena el contenido del archivo.

El número de 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– número de grupo de bloques deseado;
  • inode_num– número de secuencia del inodo que define el archivo;
  • inodes_per_group– el número de inodos en el grupo (esta información está 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.

Considere un ejemplo de obtener el contenido del archivo test.file ubicado en el directorio raíz. Para leer el archivo /test.file, necesita:

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

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

    Pasos 1-6: lectura del directorio raíz:

  1. Del grupo de bloques 0 se lee la tabla de descriptores de grupo.
  2. El descriptor de grupo de bloques 0 se recupera de la tabla de descriptores de grupo y la dirección de la tabla de inodos del grupo 0 se lee de ella.
  3. La tabla de inodos se lee del grupo de bloques 0.
  4. El número de inodo del directorio raíz se fija en 2, por lo que el segundo elemento se lee de la tabla de inodos del grupo 0, que contiene la dirección del bloque que contiene 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 el bloque que contiene las entradas del directorio raíz.
  6. Se busca la entrada denominada "test.file". Si se encuentra una entrada de este tipo, se recupera el número de inodo de "test.file".
  7. Especificando el número de inodo, se puede acceder a los bloques de información del archivo (pasos 7-11):

  8. Se calcula el número del grupo en el que se encuentra el inodo dado y su posición en la tabla de inodos del grupo (suponiendo que el número de grupo es B y la posición en la tabla es X).
  9. De la tabla de descriptores de grupo, recuperamos el descriptor del grupo de bloques B y leemos 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 en la posición X.
  12. Desde el inodo de lectura, se extraen las direcciones de 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: hay una partición del disco duro en la que se crea el sistema de archivos ext2. Esta partición corresponde al archivo de dispositivo /dev/hda3. El subdirectorio de inicio se ha creado en el directorio raíz de la partición y contiene el archivo test.file con el siguiente contenido:

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

Sí, ¡pero una copia falsa!

1234567890-=

¡No lo piense mal, esto no es una tontería, sino un ejercicio de prueba del curso de capacitación para operadores de telégrafo en las tropas de señales de la antigua URSS!

¡Atención! Uno debe tener en cuenta 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 del archivo utilizando el algoritmo anterior no conducirá a nada, ya que no hay información sobre este archivo físicamente en el disco. Debe "forzar" al sistema a escribir el búfer del disco en el disco. La forma más fácil de hacer esto es realizar una operación de reinicio. Por lo tanto, después de crear el archivo, reinicie el sistema.

Nuestra tarea es usar el archivo de dispositivo /dev/hda3 para leer el archivo /home/test.file accediendo directamente a sus bloques de información.

Considere 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.

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

  1. Estructura de superbloque struct ext2_super_block:
    • __u32 s_inodes_count es el número total de inodos en el sistema de archivos;
    • __u32 s_blocks_count es 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 se encuentra 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_blocks_per_group– el número de bloques en el grupo;
    • __u32 s_inodes_per_group– 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);
    • __u32s_first_ino es el número del primer inodo no reservado.
  2. Estructura del descriptor del grupo de bloques struct ext2_group_desc:
    • __u32 bg_block_mapa de bits– mapa de bits de ocupación de bloque de grupo;
    • __u32 bg_inode_mapa de bits– mapa de bits ocupado del inodo de grupo;
    • __u32 bg_inode_table– la dirección de la tabla de inodos del grupo.
  3. Estructura del nodo de información struct ext2_inode:
    • __u16 i_mode - tipo de archivo y derechos de acceso al mismo. El tipo de archivo está determinado por los bits 12-15 de este campo:
      • 0xA000– enlace simbólico;
      • 0x8000– archivo ordinario;
      • 0x6000– archivo de dispositivo de bloque;
      • 0x4000– directorio;
      • 0x2000– archivo de dispositivo de caracteres;
      • 0x1000– Canal FIFO.
    • __u32 i_tamaño– tamaño en bytes;
    • __u32 i_atime– hora del último acceso al archivo;
    • __u32 i_ctime– tiempo de creación del archivo;
    • __u32 es hora– hora de la última modificación;
    • __u32 i_bloques– el número de bloques ocupados por el archivo;
    • __u32 i_bloquear– direcciones de bloques de información (incluidas todas las referencias indirectas).
  4. El valor de EXT2_N_BLOCKS se define en el archivo:

    * Constantes relativas a los bloques de datos

    #definir EXT2_NDIR_BLOCKS 12

    #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS

    #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)

    #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)

    #define EXT2_N_BLOCKS(EXT2_TIND_BLOCK + 1)

  5. Estructura de entrada de directorio struct ext2_dir_entry_2:
  6. #define EXT2_NAME_LEN 255

  • __u32 inodo– número de inodo de archivo;
  • __u16 rec_len– longitud de la entrada de 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 creó el sistema de archivos, estructuras globales y variables.

#define NOMBRE_PARTE "/dev/hda3"

estructura ext2_super_block sb;

/* búfer para almacenar la tabla de descriptores de grupo */

carácter sin firmar buff_grp;

beneficio de char sin firmar; /* búfer de información */

inversión int; /* descriptor de archivo de dispositivo */

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

Definamos algunas funciones que necesitamos trabajar:

Función de lectura de superbloque:

anular read_sb()

conjunto de memoria(&sb,0,1024);

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

If(lbuscar(indev,1024,0)< 0) {

error("buscar");

Salir(-1);

Si (leer (indev, (char *) y sb, tamaño de (sb))< 0) {

error("leer");

Salir(-1);

Comprobación del ID del sistema de archivos:

If(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 la supermanzana:

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

Printf("Número de inodos - %u ",sb.s_inodes_count);

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

Printf("Tamaño del 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 del inodo - %d ",sb.s_inode_size);

Printf("Inodes 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 tabla de descriptores de grupo:

anular read_gdt()

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

BLKSIZE = 1024<< sb.s_log_block_size

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

Lectura de la tabla:

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

error("buscar");

Salir(-1);

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

error("leer");

Salir(-1);

devolver;

La 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 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 ordinal inode_num:

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

Extraiga el descriptor de grupo de la tabla de descriptores 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 * (tamaño(gd))), tamaño(gd));

Calculamos la posición del inodo con el número ordinal inode_num en la tabla de inodos del 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);

Preread64(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)

U64pos;

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 partición y leemos este bloque en el búfer de mejora global:

Pos = ((__u64)en->i_bloque) * BLKSIZE;

Preread64(indev, buff, BLKSIZE, pos);

devolver;

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

anular get_root_dentry()

Estructura ext2_inode en;

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

get_inode(EXT2_ROOT_INO, &in);

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 del nombre del archivo:

int get_i_num(char *nombre)

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

int i = 0, rec_len = 0;

Estructura ext2_dir_entry_2dent;

El búfer de mejora contiene una matriz de entradas de directorio. Para determinar el número de inodo de un archivo, debe 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;

Regresa dent.inode;

Ahora escribamos la función principal:

int principal()

Variables y estructuras:

estructura ext2_inode en;

// ruta absoluta del archivo

Carácter sin firmar *ruta_completa = "/home/test.file";

buff1 char sin firmar;

int estático i = 1;

int n, i_num, outf, tipo;

El primer carácter en un nombre de ruta absoluto de un archivo debe ser una barra diagonal (/). Vamos a ver:

If(ruta_completa != "/") (

error("barra");

Salir(-1);

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

indev = abierto(PARTE_NOMBRE,O_RDONLY);

si (indev< 0) {

error("abrir");

Salir(-1);

Leer_sb();

Leer_gdt();

Obtenga el contenido del directorio raíz:

get_root_dentry();

El búfer de mejora ahora contiene todas las entradas en el directorio raíz (puede guardarlas en un archivo separado si lo desea). Ahora que tenemos las entradas del directorio raíz, podemos acceder al contenido de test.file usando 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 (tenemos uno, inicio) y el nombre del archivo deseado (test.file). Para cada elemento, determinamos el número ordinal del inodo, leemos este inodo y luego obtenemos el contenido del bloque cero (de la secuencia de bloques de direcciones ubicados en el inodo):

mientras(1) (

conjunto de memoria (buff1,0, tamaño de (buff1));

Para(n = 0 ; n< 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);

Vamos a mostrar 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 del archivo - %u ",in.i_size);

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

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

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

cambiar (tipo) (

Caso (0x04):

Printf("(directorio)");

romper;

Caso (0x08):

Printf("(archivo normal)");

romper;

Caso (0x06):

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

romper;

Caso (0x02):

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

romper;

por defecto:

Printf("(tipo desconocido)");

romper;

Comprobación del tipo de archivo. Si este es un archivo regular, rompemos el ciclo:

Si (tipo & 0x08) (

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

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

Write(outf, buff, sizeof(buff));

cerrar(fuera);

romper;

Salida:

cerrar(indev);

devolver 0;

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

Ahora describiremos el sistema de archivos de disco Linux más popular, ext2. La primera versión de Linux utilizó el sistema de archivos MINIX 1, que tenía nombres de archivo cortos y un tamaño máximo de archivo de 64 MB. El sistema de archivos MINIX 1 finalmente fue reemplazado por el primer sistema de archivos extendido, ext, que permitía nombres de archivo más largos y tamaños de archivo más grandes. Debido a su baja eficiencia (en términos de rendimiento), el sistema ext fue reemplazado por su sucesor ext2, que todavía se usa ampliamente en la actualidad.

La partición del disco con ext2 contiene el sistema de archivos que se muestra en la fig. 10.17 disposición. El bloque 0 no es utilizado por el sistema Linux y contiene el código de inicio de la computadora. Siguiendo el bloque 0, la partición del disco se divide en grupos de bloques (ignorando los límites del cilindro del disco). Cada grupo se organiza de la siguiente manera.


El primer bloque es un superbloque, que almacena información sobre el diseño del sistema de archivos, incluida la cantidad de i-nodos, la cantidad de bloques de disco, el comienzo de la lista de bloques de disco libres (generalmente varios cientos de elementos). A esto le sigue un descriptor de grupo que contiene información sobre la ubicación de los mapas de bits, el número de bloques e i-nodos libres en el grupo y el número de directorios en el grupo. Esta información es importante porque el sistema de archivos ext2 intenta distribuir los directorios uniformemente en el disco.

Los dos mapas de bits realizan un seguimiento de los bloques libres y los i-nodos libres (esto también se hereda del sistema de archivos MINIX 1 y lo distingue de la mayoría de los sistemas de archivos UNIX, que utilizan una lista de bloques libres). El tamaño de cada mapa de bits es de un bloque. Con un tamaño de bloque de 1 KB, este esquema limita el tamaño del grupo de bloques a 8192 bloques y 8192 i-nodes. El primer número es un límite real, y el segundo es prácticamente ninguno. Con bloques de 4 KB, los números son cuatro veces más grandes.

Luego se ubican los i-nodos. Están numerados desde 1 hasta algún máximo. Cada i-nodo tiene un tamaño de 128 bytes y describe exactamente un archivo. El i-node contiene información contable (incluido todo lo que devuelve la llamada stat, que simplemente la toma del i-node), así como información suficiente para localizar todos los bloques de disco que contienen los datos del archivo.

Los i-nodos van seguidos de bloques de datos. Todos los archivos y directorios se almacenan aquí. Si un archivo o directorio consta de más de un bloque, no es necesario que esos bloques sean contiguos en el disco. En realidad, es probable que los bloques de un archivo grande estén dispersos por todo el disco.

Los i-nodos correspondientes a los directorios están dispersos en todos los grupos de bloques de disco. Ext2 intenta colocar los archivos normales en el mismo grupo de bloques que el directorio principal y los archivos de datos en el mismo bloque que el i-nodo del archivo de origen (suponiendo que haya suficiente espacio allí). Esta idea se tomó prestada del sistema de archivos Berkeley Fast. Sistema de archivos(McKusick et al., 1984). Los mapas de bits se utilizan para recibir Arreglos rápidos con respecto a la selección

lugares para nuevos datos del sistema de archivos.

Cuando se asignan nuevos bloques de archivos, ext2 también asigna previamente algunos (ocho) bloques adicionales para el mismo archivo (para minimizar la fragmentación de archivos debido a escrituras futuras). Este esquema distribuye el sistema de archivos a través del disco. También tiene buen desempeño (debido a su naturaleza contigua y fragmentación reducida).

Para acceder a un archivo, primero debe usar una de las llamadas del sistema Linux (como open), que requiere que especifique la ruta al archivo. Esta ruta se analiza y sus directorios constituyentes se extraen de ella. Si se especifica una ruta relativa, la búsqueda comienza desde el directorio actual del proceso; de lo contrario, desde el directorio raíz. En cualquier caso, el i-nodo para el primer directorio es fácil de encontrar: hay un puntero en el descriptor del proceso o (en el caso del directorio raíz) está almacenado en un bloque específico en el disco.

El directorio permite nombres de archivo de hasta 255 caracteres (Figura 10.18). Cada directorio consta de una serie de bloques de disco (de modo que el directorio se puede escribir en el disco de forma atómica). En un directorio, los elementos de archivos y directorios están en orden desordenado (cada elemento sigue inmediatamente al anterior). Los elementos no pueden cruzar los límites de los bloques, por lo que suele haber una cierta cantidad de bytes no utilizados al final de cada bloque de disco.


Cada entrada de directorio en la Fig. 10.18 consta de cuatro campos de longitud fija y un campo de longitud variable. El primer campo es el número de i-nodo, que es 19 para el archivo colosal, 42 para el archivo voluminoso y 88 para el directorio bigdir. Luego viene el campo rec_len, que proporciona el tamaño de la entrada de directorio completa en bytes (posiblemente con bytes de relleno adicionales después del nombre). Este campo es necesario para encontrar la siguiente entrada (en el caso de que el nombre del archivo se complete con un número desconocido de bytes). En la figura, este campo está indicado por una flecha. Luego hay un campo de tipo archivo, directorio, etc. El último campo de longitud fija contiene la longitud del nombre del archivo en bytes (8, 10 y 6 para este ejemplo). Finalmente, está el nombre del archivo en sí mismo, terminado en un byte nulo y rellenado hasta un límite de 32 bits. Puede ir seguido de bytes de relleno adicionales.

En la fig. 10.18b muestra el mismo directorio después de eliminar el elemento voluminoso. Todo lo que se hace en el directorio es aumentar el número en el campo de tamaño de registro. archivo anterior colosal, y los bytes de entrada de directorio para archivo remoto voluminosos se convierten en marcadores de posición para el primer registro. Posteriormente, estos bytes se pueden utilizar para escribir al crear un nuevo archivo.

Dado que los directorios se buscan de forma lineal, puede llevar mucho tiempo encontrar una entrada que se encuentre al final de un directorio grande. Por lo tanto, el sistema mantiene un caché de directorios accedidos recientemente. La memoria caché se busca por nombre de archivo y, si se encuentra, ya no es necesaria la costosa búsqueda lineal. Se ingresa un objeto de entrada en el caché de entrada del directorio para cada uno de los componentes de la ruta y (a través de su nodo-i) se busca en el directorio entradas de ruta subsiguientes (hasta que se encuentra el nodo-i real del archivo).

Por ejemplo, para encontrar un archivo especificado por una ruta absoluta (como /usr/ast/file), se deben seguir los siguientes pasos. En primer lugar, el sistema encuentra el directorio raíz que suele utilizar el i-nodo número 2 (especialmente cuando el i-nodo número 1 está reservado para bloques defectuosos). Coloca la entrada adecuada en la memoria caché de entrada del directorio (para futuras búsquedas en el directorio raíz). Luego busca en el directorio raíz la cadena "usr" para obtener el número de i-nodo para el directorio /usr (que también se ingresa en el caché de elementos del directorio). A continuación, se lee este i-node y se extraen bloques de disco de él, de modo que se pueda leer el directorio /usr y buscar la cadena "ast". Una vez que se ha encontrado una entrada coincidente, se puede determinar a partir de ella el número de i-nodo para el directorio /usr/ast. Dado este número de i-nodo, se puede leer y encontrar bloques de directorio. Finalmente, buscamos "archivo" y encontramos su número de i-nodo. Por lo tanto, usar una ruta relativa no solo es más conveniente para el usuario, sino que también reduce la cantidad de trabajo para el sistema.

Si el archivo está presente, el sistema recupera el número de i-nodo y lo utiliza como índice de la tabla de i-nodo (en el disco) para buscar el i-nodo correspondiente y leerlo en la memoria. Este i-nodo se coloca en la tabla de i-nodos, una estructura de datos del núcleo que contiene todos los i-nodos para abrir este momento archivos y directorios. El formato del elemento i-node debe contener (como mínimo) todos los campos devueltos por la llamada al sistema stat para que la llamada stat funcione (consulte la Tabla 10.10). En mesa. La figura 10-13 muestra algunos de los campos en la estructura de i-node compatible con el sistema de archivos de Linux. La estructura real del i-nodo contiene muchos más campos, ya que la misma estructura se usa para representar directorios, dispositivos y otros archivos especiales. La estructura i-node también contiene campos reservados para uso futuro. La historia ha demostrado que los bits no utilizados no permanecen inactivos por mucho tiempo.

Ahora veamos cómo el sistema lee el archivo. Recuerde que una llamada de procedimiento de biblioteca típica para ejecutar la llamada del sistema de lectura se ve así:

n = leer (fd, búfer, nbytes);


Cuando el kernel toma el control, todo lo que puede comenzar con estos tres parámetros y la información en sus tablas internas (perteneciente al usuario). Uno de los elementos de estas tablas internas es una matriz de descriptores de archivos. Está indexado por descriptores de archivo y contiene un elemento por archivo abierto (hasta un número máximo, generalmente 32 por defecto).

La idea es comenzar en este descriptor de archivo y terminar con el correspondiente bnode. Veamos un posible esquema: coloque un puntero en un nodo en una tabla de descriptores de archivos. A pesar de la sencillez este método(desafortunadamente) no funciona. El problema es este. Cada descriptor de archivo debe tener un puntero de archivo asociado que especifique el byte en el archivo donde comenzará la siguiente operación de lectura o escritura. ¿Dónde debe almacenarse este puntero? Una opción es colocarlo en la tabla de nodos. Sin embargo, este enfoque no funcionará si varios procesos no relacionados abren el mismo archivo al mismo tiempo, porque cada proceso debe tener su propio puntero.

La segunda solución es colocar un puntero en la tabla de descriptores de archivo. Cada proceso que abre un archivo tiene su propia posición en el archivo. Desafortunadamente, este esquema tampoco funciona, pero la razón de la falla es este caso no tan obvio y relacionado con la naturaleza intercambio archivos en un sistema Linux. Considere el script de shell 5, que consta de dos comandos (p1 y p2) que se ejecutarán a la vez. Si el script se llama desde la línea de comando

luego se espera que p1 escriba su salida en el archivo x, y luego p2 también escribirá su salida en el archivo x, comenzando donde lo dejó p1.

Cuando el shell inicia p1, el archivo x estará vacío al principio, por lo que p1 simplemente comenzará a escribir en el archivo en la posición 0. Sin embargo, cuando p1 finaliza, se necesita algún mecanismo para garantizar que p2 vea la posición de inicio no 0 (pero esto es exactamente lo que sucede si la posición en el archivo se almacena en la tabla de descriptores de archivo), pero el valor en el que pi se detuvo.

Cómo se hace esto se muestra en la Fig. 10.19. El truco consiste en introducir una nueva tabla: la tabla de descripción. abrir archivos(tabla de descripción de archivos abiertos) - entre la tabla de descriptores de archivos y la tabla de i-node y almacene el puntero del archivo (así como el bit de lectura/escritura) en ella. En la figura, el proceso padre es el shell, y el hijo es primero el proceso pi y luego el proceso p2. Cuando el shell crea el proceso pi, su estructura de usuario (incluida la tabla de descriptores de archivos) es una copia exacta de la misma estructura de shell, por lo que ambos contienen punteros a la misma tabla de descripción de archivos abiertos. Cuando el proceso pi finaliza, el descriptor de archivo del shell continúa apuntando a la tabla de descripción de archivo abierto, que contiene la posición del proceso p1 en el archivo. Cuando el shell ahora crea el proceso p2, el nuevo proceso secundario hereda automáticamente la posición en el archivo, sin nuevo proceso, ni se requiere que el shell conozca el valor actual de esa posición.


Si algún proceso extraño abre el archivo, obtendrá su propia entrada en la tabla de descripción del archivo abierto con su posición en el archivo, que es exactamente lo que se necesita. Por lo tanto, el propósito de la tabla de descripción de archivos abiertos es permitir que los procesos padre e hijo compartan un solo puntero en un archivo, pero que asignen punteros personales para procesos externos.

Entonces (volviendo al problema de realizar una lectura), hemos mostrado cómo se determinan la posición en el archivo y el i-nodo. El I-node contiene las direcciones de disco de los primeros 12 bloques del archivo. Si la posición en el archivo cae dentro de sus primeros 12 bloques, entonces se lee bloque deseado El archivo y los datos se copian al usuario. Para archivos de más de 12 bloques, el i-node contiene la dirección de disco de un solo bloque indirecto (Figura 10.19). Este bloque contiene las direcciones de disco de bloques de disco adicionales. Por ejemplo, si el tamaño del bloque es de 1 KB y la dirección del disco es de 4 bytes, un solo bloque indirecto puede almacenar hasta 256 direcciones de disco. Este esquema le permite admitir archivos de hasta 268 KB de tamaño.

ext2(también conocido como ext2fs) - Segundo sistema de archivos extendido(Second Extended File System) es un sistema de archivos basado en el kernel de Linux. El creador y desarrollador de ext2 es Remy Card. El sistema de archivos ext2 fue creado por él para reemplazar la versión anterior anterior: ext.

En términos de indicadores como la velocidad y el rendimiento, este sistema de archivos puede servir como punto de referencia. Esto se evidencia en los resultados de las pruebas de rendimiento del sistema de archivos. Por ejemplo, en las pruebas secuenciales de velocidad de lectura/escritura del Dell Tech Center, ext2 supera a ext3 y solo supera al más moderno ext4 en velocidad de lectura.

La principal desventaja de ext2 es que no es un sistema de archivos de diario. Sin embargo, esta deficiencia se eliminó en el siguiente sistema de archivos: ext3.

ext2 se usa en tarjetas flash y unidades de estado sólido (SSD) porque la falta de registro en diario es una ventaja cuando se trabaja con unidades con límites de ciclo de escritura.

Historia de ext2

En el momento del rápido desarrollo del sistema Linux, utilizaba el sistema de archivos Minix OS. Era bastante estable, pero era de 16 bits. Como resultado, tenía un límite estricto de 64 Mb por partición. Además, había un límite en la longitud máxima de un nombre de archivo, que era de 14 caracteres.

Estas limitaciones combinadas fueron la razón del desarrollo del "sistema de archivos extendido" (de ahí el término " Sistema de archivos extendido»). Se le asignó la tarea de resolver dos de los problemas clave de Minix. El nuevo sistema de archivos se hizo público en abril de 1992. Fue Ext, que amplió el límite de tamaño de archivo a 2 gigabytes y estableció el límite de nombre de archivo en 255 caracteres.

Sin embargo, a pesar del éxito del nuevo sistema de archivos, aún quedaban bastantes problemas sin resolver. Por ejemplo, no había soporte para el acceso por separado, no había marcas de tiempo para la modificación de datos. La necesidad de resolver estos problemas fue el motivo para crear la próxima versión del sistema de archivos extendido ext2 (“ Segundo sistema de archivos extendido). ext2 se desarrolló en enero de 1993 y también implementó ACL compatibles con POSIX y atributos de archivo extendidos.

Organización lógica de ext2

El gráfico de jerarquía de directorios ext2 se representa como una red. Esto se debe al hecho de que un archivo se puede incluir en varios directorios a la vez.

Todos los tipos de archivos tienen nombres simbólicos. En los sistemas de archivos organizados jerárquicamente, generalmente se usan tres tipos de nombres: simple, compuesto y relativo. Lo mismo con ext2. En el caso de un nombre simple, la limitación es que su longitud no debe exceder los 255 caracteres, además, el nombre no debe contener un carácter NULL y una barra inclinada.

En cuanto al carácter NULL, las limitaciones están relacionadas con la representación de cadenas en el lenguaje C, en el caso del carácter slash todo radica en que se utiliza como carácter separador entre directorios.

El nombre completo es una cadena de nombres simbólicos simples de todos los directorios a través de los cuales pasa la ruta desde la raíz hasta archivo dado. En ext2, un archivo puede estar en varios directorios, lo que significa que puede tener varios nombres completos (un archivo, varios nombres completos). Pero de todos modos, el nombre completo define el archivo.

atributos ext2:

  • tipo de archivo y permisos,
  • propietario, grupo de acceso,
  • información sobre transacciones autorizadas,
  • hora de creación, fecha del último acceso, fecha de la última modificación y hora de la última eliminación,
  • tamaño de archivo actual,
  • especificación de archivo:
    • archivo normal,
    • catalogar,
    • archivo de dispositivo orientado a bytes,
    • archivo de dispositivo de bloque,
    • tubería con nombre,
    • enlace simbólico,
  • número de bloques ocupados,
  • otros

Los atributos de los archivos se almacenan en tablas especiales, no en directorios, como es común en los sistemas de archivos simples. Como resultado, el catálogo tiene una muy estructura simple, que consta de dos partes: un número de inodo y un nombre.

Organización física de ext2

Estructura de partición de disco

Como parte de ext2, se puede distinguir lo siguiente:

  • bloques y grupos de bloques;
  • inodo;
  • supermanzana

Todo el espacio de partición del disco se divide en bloques de tamaño fijo, siendo los bloques un múltiplo del tamaño del sector (1024, 2048, 4096 u 8192 bytes). El tamaño del bloque se especifica al crear un sistema de archivos en una partición de disco. A todos los bloques se les asignan números de serie. Para reducir la fragmentación y la cantidad de movimientos del cabezal del disco duro al leer grandes cantidades de datos, los bloques se combinan en grupos.

El concepto básico de un sistema de archivos es un inodo (también llamado inodo - nodo de información). Esta es una estructura especial que contiene información sobre los atributos y la ubicación física del archivo. Los descifradores de índice se combinan en una tabla contenida al comienzo de cada grupo de bloques. El superbloque es el elemento principal del sistema de archivos ext2. Contiene información general sobre el sistema de archivos. La supermanzana se encuentra a 1024 bytes del inicio de la sección. La integridad del superbloque determina la salud del sistema de archivos. El sistema operativo crea varias copias de seguridad del superbloque, en caso de que la partición esté dañada. El siguiente bloque después del superbloque contiene una tabla de descriptores globales: una descripción de los grupos de bloques en forma de matriz con información general sobre todos los grupos de bloques.

grupo de bloques

Todos los bloques en una partición ext2 se dividen en grupos. Se crea una entrada separada para cada grupo en la tabla de descriptores globales. Esta entrada almacena los parámetros básicos, tales como: el número de bloque en mapas de bits y tablas, el número de bloques libres en el grupo, el número de inodos que contienen directorios.

Bloquear mapa de bits es un sistema en el que cada bit informa si el bloque que le corresponde está asignado a algún archivo. Si el bit es 1, entonces el bloque está ocupado. Un mapa de bits de inodos realiza una función similar: muestra qué inodos están ocupados y cuáles no. núcleo de linux intenta distribuir uniformemente los inodos de directorio entre los grupos y mueve los inodos de archivo al grupo con el directorio principal. Todo el espacio restante, que aparece en la tabla como datos, se asigna para almacenar archivos.

Sistema de direccionamiento de datos

El sistema de direccionamiento de datos es uno de los componentes más serios y clave del sistema de archivos. Gracias a él, el archivo deseado se ubica entre los muchos bloques vacíos u ocupados en el disco.

ext2 utiliza el siguiente esquema de direccionamiento de bloques de archivos. Para almacenar la dirección del archivo, se asignan 15 campos, cada uno de los cuales consta de 4 bytes. Si el archivo cabe en 12 bloques, los números de los grupos correspondientes se enumeran en los primeros doce campos de la dirección. Si el tamaño del archivo supera los 12 bloques, el siguiente campo contiene la dirección del clúster en el que se pueden ubicar los números de los siguientes bloques del archivo. Por lo tanto, el decimotercer campo se utiliza para el direccionamiento indirecto.

Con un tamaño de bloque máximo de 4096 bytes, el clúster correspondiente al campo 13 puede contener hasta 1024 números de bloque siguientes en el archivo. Si el tamaño del archivo supera los 12+1024 bloques, se utiliza el campo 14, que contiene la dirección de un clúster que contiene 1024 números de clúster, cada uno de los cuales hace referencia a 1024 bloques del archivo. Aquí se utiliza el direccionamiento indirecto doble. Y si el archivo incluye más de 12 + 1024 + 1048576 bloques, el último campo 15 se utiliza para el direccionamiento indirecto triple.

Tal sistema de direccionamiento permite, con un tamaño de bloque máximo de 4096 bytes, tener archivos de más de 2 TB.

sistema de archivos(Sistema de archivos en inglés): una orden que determina el método para organizar, almacenar y nombrar datos en soportes de información de equipos de TI (utilizando tarjetas de memoria flash portátiles en dispositivos portátiles dispositivos electrónicos: cámaras digitales, teléfonos móviles etc. e) y tecnología informática. Define el formato del contenido y almacenamiento físico de la información que suele agruparse en forma de archivos. Un sistema de archivos específico determina el tamaño del nombre de un archivo (carpeta), el tamaño máximo posible de archivo y partición, y un conjunto de atributos de archivo. Algunos sistemas de archivos proporcionan capacidades de servicio como el control de acceso o el cifrado de archivos.

Tareas del sistema de archivos

Las funciones principales de cualquier sistema de archivos están dirigidas a resolver las siguientes tareas:

nombres de archivos;

la interfaz del programa de trabajo con archivos para aplicaciones;

mapear el modelo lógico del sistema de archivos a la organización física del almacén de datos;
organizar la estabilidad del sistema de archivos ante cortes de energía, errores de hardware y software;

En los sistemas multiusuario, aparece otra tarea: proteger los archivos de un usuario del acceso no autorizado de otro usuario, así como garantizar trabajo conjunto con archivos, por ejemplo, cuando uno de los usuarios abre un archivo, para otros el mismo archivo estará disponible temporalmente en modo de solo lectura.

El sistema de archivos es la estructura principal utilizada por una computadora para organizar la información en un disco duro. Al instalar un disco duro nuevo, debe particionarse y formatearse para un sistema de archivos específico, después de lo cual puede almacenar datos y programas. Windows tiene tres posibles opciones sistema de archivos: NTFS, FAT32 y el sistema FAT heredado rara vez utilizado (también conocido como FAT16).

NTFS es el sistema de archivos preferido para esta versión de Windows. Tiene muchas ventajas sobre el anterior sistema FAT32; algunos de ellos se enumeran a continuación.

La capacidad de recuperarse automáticamente de algunos errores de disco (FAT32 no tiene esta capacidad).
Soporte mejorado para discos duros grandes.
Mayor grado de seguridad. Puede usar permisos y encriptación para evitar que los usuarios accedan a ciertos archivos.

El sistema de archivos FAT32 y el sistema FAT rara vez utilizado se han utilizado en versiones anteriores Versiones de Windows, incluidos Windows 95, Windows 98 y Windows Millennium Edition. El sistema de archivos FAT32 no brinda el nivel de seguridad que brinda NTFS, por lo que si una computadora tiene una partición o un volumen con formato FAT32, los archivos en esa partición son visibles para cualquier persona con acceso a la computadora. El sistema de archivos FAT32 también tiene límites de tamaño de archivo. En esta versión de Windows, no es posible crear una partición FAT32 de más de 32 GB. Además, una partición FAT32 no puede contener un archivo de más de 4 GB.

La razón principal para usar el sistema FAT32 sería que la computadora podrá ejecutar tanto Windows 95, Windows 98 o Windows Millennium Edition, como también esta versión de Windows (configuración multi-OS). Para crear dicha configuración, debe instalar una versión anterior del sistema operativo en una partición formateada con FAT32 o FAT, convirtiéndola en la principal (la partición principal puede contener el sistema operativo). Otras secciones a las que se accede desde Versión anterior Windows también debe estar formateado como FAT32. Más primeras versiones Windows solo puede acceder a particiones o volúmenes de red NTFS. Las particiones NTFS en la computadora local no estarán disponibles.

GRASA - ventajas:

Requiere poco para ser efectivo memoria de acceso aleatorio.
trabajo rapido con directorios pequeños y medianos.
El disco hace menos movimientos de cabeza en promedio (en comparación con NTFS).
Trabajo eficiente en discos lentos.

GRASA - contras:

Pérdida catastrófica de rendimiento con el aumento de la fragmentación, especialmente para unidades grandes (solo FAT32).
Dificultades con el acceso aleatorio a archivos grandes (digamos, 10% o más del tamaño del disco).
Muy trabajo lento con directorios que contienen un gran número de archivos

Ventajas de NTFS:

La fragmentación de archivos tiene poco o ningún efecto en el sistema de archivos en sí: el rendimiento de un sistema fragmentado se degrada solo en términos de acceso a los datos del archivo en sí.
La complejidad de la estructura del directorio y la cantidad de archivos en un directorio tampoco presenta ningún obstáculo particular para el rendimiento.
Acceso rápido a un fragmento arbitrario de un archivo (por ejemplo, edición de archivos .wav de gran tamaño).
Muy acceso rápido a archivos pequeños (unos pocos cientos de bytes): el archivo completo está en el mismo lugar que los datos del sistema (registro MFT).

Contras de NTFS:

Requisitos significativos de memoria del sistema (64 MB es el mínimo absoluto, más es mejor).
Los discos lentos y los controladores sin Bus Mastering ralentizan en gran medida el rendimiento de NTFS.
Trabajar con directorios de tamaño mediano es difícil porque casi siempre están fragmentados.
Un disco que ha estado funcionando durante mucho tiempo en un estado de 80 % - 90 % lleno mostrará un rendimiento extremadamente bajo.

Los siguientes sistemas de archivos se consideran "nativos" para Linux (es decir, aquellos en los que se puede instalar y desde los que se puede iniciar): ext2fs, ext3fs, ext4fs, ReiserFS, XFS, JFS. Son ellos a los que se les suele ofrecer la opción a la hora de instalar la gran mayoría de distribuciones. Por supuesto, hay maneras instalaciones de linux a los sistemas de archivos FAT/VFAT/FAT32, pero esto es solo para aquellos queridos y señores que entienden mucho sobre perversiones, y no hablaré de ellas.

Los principales criterios para elegir un sistema de archivos suelen ser la fiabilidad y la velocidad. En algunos casos, también debe tener en cuenta el factor de compatibilidad; en este caso, significa la capacidad de otros sistemas operativos para acceder a un sistema de archivos en particular.
Comenzaré con ReiserFS, porque la razón para escribir esta nota fue la pregunta: ¿qué se deben considerar archivos pequeños? Después de todo, es bien sabido que la eficiencia de trabajar con archivos pequeños es la fortaleza de este sistema de archivos.

Entonces, los archivos pequeños son archivos más pequeños que el bloque lógico del sistema de archivos, que en Linux en la mayoría de los casos es igual a cuatro kilobytes, aunque se puede configurar durante el formateo dentro de ciertos límites (dependiendo del FS específico). Hay innumerables archivos pequeños de este tipo en cualquier sistema operativo similar a Unix. Un ejemplo típico son los archivos que componen el árbol de puertos de FreeBSD, puertos de Gentoo y sistemas portados similares.
En la mayoría de los sistemas de archivos, estos mini archivos tienen su propio inodo (un nodo de información que contiene metainformación sobre el archivo) y un bloque de datos, lo que conduce tanto al consumo de espacio en disco como a operaciones de archivo más lentas. En particular, esta es la razón de la consideración catastrófica del sistema de archivos FreeBSD (tanto el antiguo, UFS, como el nuevo, UFS2) cuando trabaja con su propio sistema de puertos.

En el sistema de archivos ReiserFS, en tales casos, no se asignan bloques separados para datos; logra empujar los datos del archivo directamente al área de su propio inodo. Debido a esto y Espacio del disco se guarda y el rendimiento aumenta, literalmente varias veces en comparación con todos los demás FS.
Este manejo de pequeños archivos ReiserFS ha dado lugar a una leyenda sobre su falta de fiabilidad. De hecho, cuando el sistema de archivos falla (es decir, la destrucción de las áreas de servicio), los datos colocados junto con sus inodos desaparecen junto con ellos, y de forma irrecuperable. Mientras que en aquellos sistemas de archivos donde los inodos y los bloques de datos siempre están separados espacialmente, estos últimos teóricamente pueden restaurarse. Entonces, para ext2/ext3 incluso hay herramientas que le permiten hacer esto.

Sin embargo, como cualquier leyenda, esta solo da la impresión de autenticidad. Primero, la pérdida permanente de datos solo se aplica a archivos muy pequeños. Entre los usuarios, prácticamente no existen, y todos los demás se restauran fácilmente desde el kit de distribución.
En segundo lugar, hablando de la posibilidad de recuperar datos de bloques que han perdido su unión a sus inodos, no usé accidentalmente la palabra "teórico". Porque en la práctica esta ocupación requiere mucho tiempo y no da un resultado garantizado. Todos los que han tenido que hacer esto estarán de acuerdo en que uno puede entregarse a él solo por completa desesperanza. Y esto se aplica a todos los sistemas de archivos de Linux. Por lo tanto, este aspecto puede pasarse por alto al elegir un sistema de archivos.

En términos de rendimiento general, ReiserFS es definitivamente más rápido que todos los demás FS registrados y, en algunos aspectos, incluso supera a ext2. Los resultados de comparar la velocidad de algunas operaciones comunes de archivos de archivos se pueden encontrar aquí.
Pero con la compatibilidad de ReiserFS, la situación es algo peor. Acceso a él desde el sistema operativo familias de ventanas, que yo sepa, no es posible. Algunos sistemas operativos de la familia BSD (DragonFlyBSD, FreeBSD) admiten este sistema de archivos, pero en modo de solo lectura. Incluso la probabilidad de que un Linux LiveCD arbitrario de antaño no tenga soporte para ReiserFS no es cero.

Y aquí es el momento de recordar acerca de ext3fs. Su ventaja no radica en absoluto en una mayor confiabilidad: esta es la misma leyenda que la inestabilidad de ReiserFS. He oído hablar tanto de los bloqueos de ext3fs como de los bloqueos de ReiserFS. Yo mismo no podría destruir ni uno ni el otro. A menos que funcionara con ext2, pero incluso eso fue hace mucho tiempo, durante la época del kernel 2.2 (o incluso 2.0).

No, la principal ventaja de ext3fs es su compatibilidad: está garantizado para ser leído por cualquier sistema Linux. Por ejemplo, al restaurar desde un antiguo asistente de LiveCD, una situación que casi no es tan increíble, tuve que entrar en ella. Una vez más, la mayoría de los sistemas BSD entienden ext3fs fácilmente (aunque sin registro). Para Windows, también hay, que yo sepa, todo tipo de controladores y complementos para aplicaciones comunes administradores de archivos(tipo Comandante total) que proporcionan acceso a las particiones ext2fs/ext3fs.

En términos de rendimiento, ext3fs deja una impresión mixta. En primer lugar, su rendimiento depende en gran medida del modo de registro, de los cuales hay tres: con registro de datos completo, registro de datos parcial y registro de solo metadatos. En cada uno de los modos, muestra un rendimiento diferente en diferentes tipos de operaciones de archivos. Sin embargo, en cualquier caso, la actuación no es un récord.

Sin embargo, si el requisito de velocidad se pone en primer lugar, entonces ext2fs está fuera de competencia aquí; sin embargo, en este caso tendrá que soportar la falta de registro. Y, en consecuencia, con largas comprobaciones del sistema de archivos en caso de un apagado incorrecto, y con el volumen de los discos modernos, esto puede prolongarse durante mucho tiempo...

Respecto a XFS es posible decir lo siguiente. En términos de compatibilidad, todo lo que está escrito para ReiserFS se aplica a él; además, hasta hace un tiempo no era compatible con el kernel estándar de Linux. Desde el punto de vista del rendimiento, XFS tampoco brilla, hablando en total del mismo nivel que ext3fs. Y en la operación de borrar archivos, generalmente demuestra una lentitud deprimente.
En mi experiencia, el uso de XFS vale la pena cuando se trabaja no solo con archivos grandes, sino muy grandes, que en realidad son solo imágenes de DVD y archivos de video.

Vuelvo al tema de la fiabilidad. Un apagado banal durante el trabajo normal del usuario, por regla general, transfiere sin problemas todos los sistemas de archivos registrados (y ninguno de ellos garantiza la seguridad de las operaciones del usuario que no están escritas en el disco, salvando a las personas que se ahogan y aquí queda el trabajo de los que se ahogan). Es cierto que para cualquier sistema de archivos es posible simular una situación en la que desconectar la alimentación provocará un daño más o menos grave. Sin embargo, en la vida real, la ocurrencia de tales situaciones es poco probable. Y puedes eliminarlos por completo adquiriendo una fuente. fuente de poder ininterrumpible- Dará más confianza en la seguridad de los datos que el tipo de sistema de archivos. Bueno, en cualquier caso, solo su copia de seguridad regular puede ser una garantía de restaurar los datos destruidos ...

Creo que la información anterior es suficiente para una elección informada. Mi elección personal en los últimos años ha sido ReiserFS. Ocasionalmente, en sistemas donde está justificado mover todo lo posible fuera de la partición raíz, es recomendable usar ext3fs para el sistema de archivos raíz y ReiserFS para todo lo demás.

Si se proporciona una partición separada para el directorio /boot (y esto se recomienda cuando se usa Cargador de arranque GRUB sus desarrolladores) - para él, ningún otro sistema de archivos, excepto ext2fs, está justificado, cualquier tipo de registro en diario no tiene sentido aquí. Finalmente, si se crea una partición separada para todo tipo de materiales multimedia, entonces puede pensar en XFS.

Si abordamos la explicación más metódicamente

ext - activado etapa inicial El desarrollo de Linux estuvo dominado por el sistema ext2 (sistema de archivos extendido, versión 2). Desde 2002, ha sido reemplazado por el sistema ext3, que es en gran medida compatible con ext2, pero también admite funciones de diario y, cuando se trabaja con la versión 2.6 del kernel y superior, también ACL. El tamaño máximo de archivo es de 2 TB, el tamaño máximo del sistema de archivos es de 8 TB. A fines de 2008, se anunció oficialmente una versión de ext4, que es compatible con versiones anteriores de ext3, pero muchas características se implementan de manera más efectiva que antes. Además, el tamaño máximo del sistema de archivos es de 1 EB (1 048 576 TB) y puede contar con que será suficiente durante algún tiempo. Acerca de reiser: el sistema lleva el nombre de su fundador, Hans Reiser, y fue el primer sistema con funcionalidad de registro para acceder al kernel de Linux en busca de datos. La versión SUSE de Zp incluso se consideró estándar durante algún tiempo. Las principales ventajas de reiser sobre ext3 son una mayor velocidad y una mejor ubicación cuando se trabaja con archivos pequeños (y la mayoría de los archivos en un sistema de archivos tienden a ser pequeños). Con el tiempo, sin embargo, el desarrollo de reisefers se detuvo. La versión 4 se anunció hace mucho tiempo, la cual aún no está lista, y el soporte para la versión 3 ha finalizado. Acerca de xfs: el sistema de archivos xfs se desarrolló originalmente para estaciones de trabajo SGI que se ejecutan en el sistema operativo IRIX. Xfs es especialmente bueno para trabajar con archivos grandes, en particular es ideal para trabajar con transmisión de video. El sistema admite cuotas y atributos extendidos (ACL).
jfs

jfs - a66peBHaTypaJFS significa "Sistema de archivos con registro". Originalmente fue desarrollado para IBM y luego adaptado para Linux.Jfs nunca ha disfrutado de mucho reconocimiento en Linux y actualmente tiene una existencia miserable, inferior a otros sistemas de archivos.
brtfs

brtfs: si es la voluntad de los principales desarrolladores del kernel, el sistema de archivos brtfs en Linux tiene un futuro brillante. Este sistema fue desarrollado en Oracle desde cero. Incluye mapeador de dispositivos y soporte RAID. Brtfs es más similar a ZFS de Sun. Entre sus funciones más interesantes se encuentran la comprobación del sistema de archivos sobre la marcha, así como soporte para SSD (Solid State Drives son discos duros basados ​​en memoria flash). Desafortunadamente, el trabajo en brtfs no se completará en un futuro previsible. Desde la versión 11 de Fedora, es posible instalar brtfs, ¡pero recomiendo usarlo solo para desarrolladores de sistemas de archivos!
No existe un sistema de archivos "más rápido" o "mejor": la estimación depende de para qué pretende usar el sistema. Principiantes usuarios de linux trabajando con computadora local, se recomienda trabajar con ext3, y para administradores de servidores, con ext4. Por supuesto, ext4 es más rápido que ext3, pero ext4 tiene una confiabilidad de datos significativamente peor: puede perder información fácilmente si el sistema se apaga repentinamente.

Si instaló un segundo sistema operativo similar a UNIX en su computadora, los siguientes sistemas de archivos serán útiles al intercambiar datos (de un sistema operativo a otro).

sysv: utilizado por SCO, Xenix y Coherent OS.

ufs: utilizado por FreeBSD, NetBSD, NextStep y SunOS. Linux solo puede leer información de dichos sistemas de archivos, pero no puede realizar cambios en los datos. Para acceder a los segmentos BSD, también necesitará la extensión de etiqueta de disco BSD. Existe una extensión similar para las tablas de particiones de SunOS.

ZFS es relativo nuevo sistema, desarrollado por Sun para Solaris. Dado que el código ZFS no cumple con la licencia GPL, no se puede integrar con el kernel de Linux. Por esta razón, Linux solo admite este sistema de archivos indirectamente a través de FUSE.
Windows, Mac OS X

Los siguientes sistemas de archivos serán útiles al intercambiar información con MS DOS, Windows, OS/2 y Macintosh.

vfat: utilizado en Windows 9x/ME. Linux puede leer información de dichas particiones y realizar cambios en ella. Los controladores del sistema vfat le permiten trabajar con sistemas de archivos antiguos de MS DOS (8 + 3 caracteres).

ntfs: el sistema se usa en todas las versiones modernas de Windows: otNT y superior. Linux puede leer y modificar sus archivos.

hfs y hfsplus son los sistemas de archivos utilizados por las computadoras Apple. Linux puede leer y modificar sus archivos.

Los CD y DVD de datos suelen utilizar sus propios sistemas de archivos.

iso9660: el sistema de archivos para CD-ROM se describe en el estándar ISO-9660, que solo permite nombres de archivo cortos. Los nombres largos se admiten en diferentes sistemas operativos de diferentes maneras, con la ayuda de una variedad de extensiones que son incompatibles entre sí. sistema linux capaz de trabajar tanto con la extensión Rockridge, común en UNIX, como con la extensión Joliet, desarrollada por Microsoft.

udf: este formato (formato de disco universal) apareció y se desarrolló como heredero de ISO 9660.

Sistemas de archivos de red

Los sistemas de archivos no tienen que estar activados disco local- Ellos
puede conectarse a una computadora ya través de la red. El kernel de Linux admite varios sistemas de archivos de red, de los cuales los siguientes son los más utilizados.

smbfs/cifs - ayuda para conectar la red directorios de Windows o Samba a un árbol de directorios.

nfs es el sistema de archivos de red más importante en UNIX.

coda - este sistema es muy similar a NFS. Tiene muchos características adicionales pero no es muy común.

ncpfs: se ejecuta en el protocolo kernel de NetWare; oH utilizado por Novell Netware.

Sistemas de archivos virtuales

Hay varios sistemas de archivos en Linux que no están diseñados para almacenar datos en un disco duro (u otro medio), sino solo para intercambiar información entre el kernel y los programas del usuario.
devpts: este sistema de archivos proporciona acceso a pseudoterminales (PTY para abreviar) a través de /dev/pts/* de acuerdo con la especificación UNIX-98. (Los pseudo terminales emulan una interfaz en serie. En los sistemas UNIX/Linux, emuladores de terminal como xterm utilizan dichas interfaces. Normalmente se utilizan dispositivos como /dev/ttypn. Por el contrario, la especificación UNIX-98 define nuevos dispositivos. Más detalles la información se informa en el terminal de texto H0WT0.)
proc y sysfs: el sistema de archivos proc se usa para mostrar información de servicio relacionada con la administración del kernel y los procesos. Además de esto, el sistema de archivos sysfs construye relaciones entre el núcleo y el hardware. Ambos sistemas de archivos están montados en las posiciones /proc y /sys.
tmpfs: este sistema se basa en la memoria compartida según System V. Por lo general, se conecta en la posición /dev/shm y proporciona un intercambio de información eficiente entre dos programas. En algunas distribuciones (por ejemplo, Ubuntu), los directorios /var/run y /var/lock también se crean utilizando el sistema de archivos tmpfs. Algunos demonios de red utilizan los archivos de estos directorios para almacenar números de identificación de procesos e información de acceso a archivos. Gracias a tmpfs, estos datos ahora se reflejan en la RAM. El método garantiza una alta velocidad, así como el hecho de que después de apagar la computadora, no quedará ningún archivo en los directorios /var/run o /var/lock.

usbfs: el sistema de archivos usbfs, a partir de la versión del kernel 2.6 y superior, brinda información sobre los dispositivos USB conectados. Por lo general, está integrado en el sistema de archivos proc. Acerca de la compatibilidad con dispositivos USB en Linux.

Otros sistemas de archivos

auto - de hecho, no hay ningún sistema de archivos con ese nombre. Sin embargo, la palabra auto se puede usar en /etc/fstab o con el comando de montaje para especificar un sistema de archivos. En este caso, Linux intentará reconocer el sistema de archivos por sí mismo. Este método funciona con la mayoría de los principales sistemas de archivos.
autofs, autofs4

autofs, autofs4 tampoco son sistemas de archivos, sino extensiones del núcleo que ejecutan automáticamente el comando de montaje para los sistemas de archivos seleccionados. Si un sistema de archivos no se ha utilizado durante algún tiempo, el comando umount se ejecuta automáticamente para él. Este método es útil principalmente en casos en los que solo unos pocos de los muchos directorios NFS se usan activamente al mismo tiempo.

Para realizar estas operaciones, el script /etc/init.d/autofs ejecuta automáticamente el programa de montaje automático al iniciar el sistema. Se configura mediante el archivo /etc/auto.master. Los programas apropiados se instalan automáticamente en, por ejemplo, Red Hat y Fedora. En cualquier caso, autofs solo se habilita después de configurar /etc/auto.master o /etc/auto.misc.
cramfs y squashfs

cramfs y squashfs: los sistemas de archivos Cram y Squash son de solo lectura. Se utilizan para "empaquetar" tantos archivos comprimidos en la memoria flash o ROM (Memoria de sólo lectura) como sea posible.

fuse - FUSE significa "Sistema de archivos en espacio de usuario" y permite el desarrollo y uso de controladores de sistemas de archivos fuera del kernel. Por lo tanto, FUSE siempre se usa con un controlador de sistema de archivos externo. FUSE funciona con el controlador NTFS ntfs-3g en particular.

gfs y ocfs: el sistema de archivos global de Oracle y el sistema de archivos de clúster de Oracle le permiten crear sistemas de archivos de red gigantes a los que se puede acceder en paralelo por muchas computadoras al mismo tiempo.

jffs y yaffs - Journaling Flash File System y Yet Another Flash File System están especialmente optimizados para trabajar con discos de estado sólido y medios flash. Usando algoritmos especiales, intentan usar uniformemente todas las celdas de memoria (tecnología de nivelación de desgaste) para evitar una falla prematura del sistema.
bucle

bucle: se utiliza para trabajar con pseudodispositivos. Un dispositivo loopback es un adaptador capaz de acceder a un archivo regular como si fuera un dispositivo de bloque. Gracias a él, puede colocar cualquier sistema de archivos en cualquier archivo y luego conectarlo al árbol de directorios usando mount. La función del kernel responsable de esto, la compatibilidad con pseudodispositivos, se implementa en el módulo de bucle.

Hay varias formas de usar pseudo-dispositivos. En particular, se pueden usar al crear discos en RAM para la inicialización inicial (disco RAM inicial) para GRUB o LILO, al implementar sistemas de archivos encriptados o al probar imágenes ISO para CD.

Sistemas de archivos de medios de almacenamiento

Sistemas de archivos
ISO 9660
Extensión Joliet del sistema de archivos ISO 9660.
Rock Ridge (RRIP, IEEE P1282) es una extensión del sistema de archivos ISO 9660 diseñada para almacenar atributos de archivos utilizados en los sistemas operativos POSIX.
Extensiones Amiga Rock Ridge
el torito
Extensiones ISO9660 de Apple
HFS, HFS+
Formato de disco universal Una especificación para un formato de sistema de archivos independiente del sistema operativo para almacenar archivos en medios ópticos. UDF es una implementación del estándar ISO/IEC 13346
Monte Rainier

Si nota un error, seleccione un fragmento de texto y presione Ctrl + Enter
COMPARTIR: