Está en la página 1de 18

ESTRUCTURA DEL SISTEMA DE ARCHIVOS

1 ESTRUCTURA DEL SISTEMA DE ARCHIVOS


Cada sistema operativo organiza los datos en disco de una manera distinta, mediante un sistema de archivos distinto. Por eso, cada sistema de archivos debe estar en una particin diferente. Vamos a ver en esta prctica cmo se almacenan los datos en el disco mediante el sistema de archivos de Linux EXT2.

BLOQUES

Los discos son dispositivos de bloque, esto es, la informacin se tiene que ir leyendo o escribiendo en porciones de un tamao fijo, no podemos leer un simple byte del disco, por ejemplo, sino transferir un bloque y luego acceder el byte que queremos dentro de ese bloque. En el sistema EXT2, los bloques tienen un tamao por defecto de 1024Bytes (1 KByte). As, si tenemos un archivo de 2.000 caracteres, este ocupar dos bloques, al igual que un archivo de 1025 caracteres. Vemos que se desperdicia espacio, ya que a veces los bloques no se aprovechan por completo. Mientras ms pequeos sean los bloques menos espacio se desperdicia, pero ms accesos a disco hay que realizar, con lo cual se tarda ms tiempo en acceder a la informacin. No se puede hacer nada para evitar esto. De todas formas vemos la ventaja de tener un tamao de bloque de 1024bytes en lugar de los hasta 32Kbytes que usa el sistema FAT16 de Windows 3.1x o de Windows 95. El sistema de Windows 98 (FAT 32) utiliza bloques de 4096 bytes. En Linux, el tamao de bloque se fija antes de crear el sistema de archivos raz (formatear la particin), pudiendo el usuario cambiarlo fijando otro distinto en algunas distribuciones de Linux. As, todo el disco est dividido en bloques. Si tenemos una particin de 1 Gigabyte de disco, podemos calcular fcilmente el nmero de bloques de sta.

1 bloque=1 Kbyte 1 Gigabyte = 1024 * 1024 Kbytes = 1.048.576 Kbytes

Por tanto en esa particin existirn 1.048.576 bloques.

Sist. Archivos: i-Nodos

Pgina 2 de 18

Como ejemplo, se puede calcular el nmero de bloques de la particin Linux de laboratorio. Para ello se necesita conocer el tamao de la particin. Como no vamos a utilizar nunca el programa fdisk, directamente preguntamos al administrador el tamao de la particin.

El comando df (sin argumentos) muestra el total de bloques, as como los bloques libres y los ocupados.

As vemos que la informacin que contienen los archivos se almacena fsicamente en bloques de disco, pero los bloques tambin almacenan informacin acerca de la estructura del sistema de archivos, como veremos a continuacin.

2.1 MUY IMPORTANTE !


Los bloques se numeran a partir del 1. El bloque 0 es el sector de arranque del disco, y est fuera de la estructura del sistema de archivos.

GRUPOS

Dentro de una particin o de un disco, los bloques estn agrupados. Es decir, el dispositivo est dividido en grupos, que contienen los bloques. Esto se entender mejor con un sencillo ejemplo: Mi anterior disco (particin) de un Giga est dividido en 8 grupos, y como recordamos de antes, tiene 1.048.576 bloques. Cuantos bloques tiene cada grupo? Nada ms sencillo que realizar la sencilla divisin Nbloques/N de grupos. Ya tengo todos los datos. Mi disco est dividido en 8 grupos, cada uno de los cuales con 131.172 bloques. Normalmente, en Linux (aunque esto tambin se puede cambiar) los grupos tienen 8.192 bloques, aunque esto tambin se puede variar a la hora de crear el sistema de archivos. En dispositivos pequeos, por ejemplo un disquete, se ve claramente que slo va a haber un grupo. Como un disquete tiene 1440 Kbytes tiene 1440 bloques, que no llegan a los 8192 que forman un grupo, un disquete est estructurado en un grupo de 1440 bloques.

Sist. Archivos: i-Nodos

Pgina 3 de 18

Como ejercicio, se pide calcular el nmero de grupos que tiene la particin de Linux utilizada en el laboratorio, sabiendo que cada grupo tiene 8192 bloques, y aprovechando el clculo del nmero total de bloques realizado en el ejemplo anterior.

3.1 Que contienen los grupos?


Acabamos de ver que los grupos contienen bloques. Los bloques almacenan la informacin contenida en los archivos. Vimos en otras prcticas que en UNIX los archivos son secuencias de bytes, de forma que en los bloques se contienen esos bytes. Pero adems, necesitamos almacenar informacin relativa al sistema de ficheros, como el tamao de un archivo, sus permisos, su fecha de creacin, los bloques en los que se encuentra la informacin del archivo (para que el sistema operativo lo pueda encontrar), etc. Esta informacin "administrativa" (por llamarla de alguna manera) tambin se encuentra guardada en bloques.

As pues tenemos dos tipos de bloques dentro de un grupo: -Los que contienen la informacin almacenada en archivos. -Los que contienen informacin administrativa sobre el sistema de archivos. En un grupo, primero van los bloques de informacin "administrativa" y luego los bloques de datos de archivos.

Los primeros bloques de informacin "administrativa" contienen: -El superbloque -Los descriptores de grupo -Mapa de bits de bloque -Mapa de bits de inode -Inodes

A continuacin iran los bloques de datos de archivos.

Sist. Archivos: i-Nodos

Pgina 4 de 18

3.2 EL SUPERBLOQUE
Contiene la descripcin de las caractersticas del sistema de archivos. Nos da los datos de su estructura. Antes de seguir debe quedar clara una cosa. El superbloque es nico, pero se guarda en todos los grupos. Todos los grupos tienen superbloque, que es el mismo. Slo se va a utilizar el superbloque del grupo 0, los dems sirven para copias de seguridad por si el superbloque del grupo 0 se perdiese.

El superbloque es un bloque como los dems (el primero de cada grupo) y ocupa tambin 1024 bytes. La informacin de sus primeros campos es la siguiente: -Numero de inodes del dispositivo (32 bits)

-Nmero de bloques del dispositivo (32 bits) -Nmero de bloques reservados (32 bits)

-Free blocks (32 bits) : nmero de bloques libres -Free inodes (32 bits) : nmero de inodes libres -64 bits reservados -Bloques por grupo (32 bits) : Nmero de bloques en un grupo

A estos les siguen bastantes ms campos, que no se estudiarn aqu. Como ejemplo, vamos a practicar con los superbloques. Para ello se introducir un disquete formateado bajo Linux en la disquetera, pero no se montar ya que nos interesa el contenido fsico del disquete, esto es, su secuencia de bytes. A continuacin se utilizar un programa de volcado llamado od, existente en todos los UNIX. od -t tipo -A tipo archivo Tiene muchas ms opciones, pero las que ms nos interesan son las siguientes: -t tipo: donde tipo es: x para hexadecimal o para octal Sist. Archivos: i-Nodos Pgina 5 de 18

d para decimal a para ascii

Esto especifica la representacin de los datos de salida. Estn agrupados en bloques de 32 bits.

-A tipo: donde tipo es: x para hexadecimal o para octal d para decimal

Esto especifica la representacin de las direcciones de disco.

Para poner en prctica el comando, tecleamos: od -t x -A d /dev/fd0 | more El superbloque es el bloque nmero 1, y estar en el byte 1024 del disco (1024 x 1, recordemos que el bloque 0 es el sector de arranque.

Debemos ser capaces de averiguar el valor de los campos descritos anteriormente.

3.3 DESCRIPTORES DE GRUPO


Describen informacin sobre cada grupo en particular. La diferencia con el superbloque es que ste describa al sistema de archivos en general. Cada grupo almacena su descriptor y tambin los descriptores de los dems grupos, otra vez por motivos de seguridad. Por ejemplo, si tenemos 24 bloques, cada bloque almacena su descriptor y los 23 restantes de los dems grupos. Como ejercicio, se pide averiguar el nmero total de descriptores de grupo almacenados en la particin Linux.

Sist. Archivos: i-Nodos

Pgina 6 de 18

La informacin que almacena el descriptor es la siguiente:

-Bitmap de bloque (32 bits): numero de bloque que almacena el mapa de bits de bloque. Sirve para saber que bloques estan libres y cuales ocupados. -Bitmap de inode (32 bits): nmero de bloque que almacena el mapa de bits de inodes. Sirve para saber que inodes estn libres y cuales ocupados -Inode table (32 bits): indica cual es el nmero de bloque a partir del cual estn colocados los inodes -Free blocks count (16 bits) : nmero de bloques libres en este grupo. -Free inodes count (16 bits) : nmero de inodes libres en este grupo

Ejercicio: Acceder al descriptor de grupo del disquete con od para obtener la informacin anterior.

Recordemos que el descriptor de grupo se encuentra en el bloque siguiente al superbloque, es decir el bloque 2.

4 INODES
Ya hemos visto que son los bloques y los grupos, y hemos comprendido que el superbloque y los descriptores de grupo contienen informacin administrativa acerca del sistema de archivos en general y cada grupo respectivamente. An as, nos falta informacin administrativa acerca de los archivos: su tamao, permisos, fechas, dueo, grupo, bloque de datos en el que comienza, etc. Todo esto se almacena en una estructura llamada inode. Existe un inode por cada archivo y directorio, as, no podr haber ms archivos que inodes. Estos tienen un tamao cada uno de 128 bytes y contienen la siguiente informacin:

-modo (16 bits) : tipo de archivo y permisos -informacin de dueo(16 bits): UID del dueo del archivo -tamao (32 bits): tamao del archivo en bytes -fechas (128 bits): tiempo en segundos desde la 00:00 de Enero de 1970 desde el ltimo acceso, creacin, modificacin y borrado del archivo. En total hay 4 fechas. Pgina 7 de 18

Sist. Archivos: i-Nodos

-Grupo (16 bits) : GID del grupo al que pertenece el archivo -Enlaces (16 bits) : Nmero de los enlaces del archivo -Bloques ocupados : (32 bits) Nmero de bloques ocupados por este archivo -64 bits reservados -punteros a bloques de datos (32 bits cada uno): indican en que bloques de datos estn los datos del archivo. Los primeros doce bloques son directos y los tres ltimos punteros a bloques de punteros.

4.1 MUY IMPORTANTE


Los datos que visualiza od lo hace en grupos de 32 bits. Si dentro de un grupo de 32 bits queremos acceder a datos de 16 bits, hay que tener en cuenta que 16 bits de mayor peso estn a la derecha de los de menor peso, es decir, al revs, debido a la representacin de los datos en memoria por parte de los microprocesadores Intel y compatibles. As, cuando tenemos dos campos de 16 bits dentro de uno de 32 debemos intercambiarlos para leerlos correctamente.

Por ejemplo, si el primer grupo que visualizado por od fuese 00003f45 sabemos que son el modo y el UID, que son datos de 16 bits. Por lo tanto, para interpretarlo correctamente debemos darle la vuelta de la siguiente forma: 3f450000 Donde 3f45 es el modo (tipo y permisos) del archivo y 0000 el UID del archivo. Esto no es necesario cuando accedemos a datos de 32 bits. El primero inode (1) est reservado para el archivo que contiene la lista de bloques defectuosos, y el segundo inode (2) est reservado al directorio raz. Para finalizar veamos un ejemplo que aclarar todo esto: Tengo un disquete Linux, con el directorio raz y un solo archivo. El disquete contiene 1440 Kbytes, por tanto 1440 bloques. As, slo habr un grupo.

El grupo contiene:

Sist. Archivos: i-Nodos

Pgina 8 de 18

Informacin administrativa:

Superbloque:1024bytes

1bloque

Descriptordegrupo:1*128bytes

1bloque

Bitmapsdebloque:1024bytes

1bloque

Bitmapsdeinode:1024bytes

1bloque

Inodes:3*128bytes

1bloque

Hay 3 inodes en total: el primero para el archivo con la lista de bloques defectusos, el segundo para el directorio raz y el tercero para el nico archivo existente en disco. Si echamos cuantas nos salen 5 bloques con informacin administrativa, y el resto de bloques del grupo (1024 -5) sern bloques de datos de archivos y directorios.

5 DIRECTORIOS

Un directorio es un archivo, lo hemos dicho varias veces. As, cada directorio tiene asociado un inode que contiene su dueo, fechas, etc. Todo igual que en el caso anterior, incluyendo los punteros a los bloques de datos. Pero qu contienen esos bloques, es decir, qu contienen fsicamente los directorios?

Un directorio contiene entradas, una por cada archivo que el directorio contiene. Cada entrada almacena lo siguiente:

Sist. Archivos: i-Nodos

Pgina 9 de 18

-Inode: el inode del archivo. -Longitud: la longitud del nombre del archivo (hasta 256 caracteres) -Nombre: el nombre del archivo.

Las dos primeras entradas estn reservadas para el directorio "." y ".." respectvamente. Se puede averiguar el inode de cada archivo con el comando ls -i.

6 Visualizacin de la estructura del sistema de archivos

Como ejercicio final se propone lo siguiente:

1. -Formatear un disquete bajo Linux. 2. -Copiar en l un archivo pequeo de texto (no ms de 2 o 3 Kbytes). 3. -Averiguar el inode del archivo 4. -Averiguar en qu bloques est guardado el archivo y el tamao del archivo 5. -Acceder a dichos bloques para ver si es encuentra en ellos el contenido del archivo

DOS POTENTES UTILIDADES

Existen en Linux dos potentes utilidades para acceder al contenido del superbloque, los descriptores y los inodes sin tener que acceder de la forma anterior al disco. - dumpe2fs dispositivo

Sist. Archivos: i-Nodos

Pgina 10 de 18

Muestra la informacin del superbloque y los descriptores de grupo de un dispositivo - debugfs dispositivo Carga el programa interactivo debugfs. Una vez dentro de l tecleamos: stat fichero para acceder al contenido del inode de ese fichero, con toda su informacin. Mediante estas utilidades podemos comprobar si los datos anteriormente averiguados leyendo fsicamente el disco son correctos.

Sist. Archivos: i-Nodos

Pgina 11 de 18

8 APENDICE

8.1 Inside Ext2/3 File System


In the MBR/EBR the value for the Ext2/Ext3 partition is ?0x83?. The Ext2/Ext3 file system contains several data structures for keeping the file system information. These data structures are also known as metadata structures. The important data structures contained in the Ext2/Ext3FileSystemarebootblock,superblock,descriptortableandinodetable. TheBootBlock ThebootblockoftheExt2/Ext3filesystemis1024byteslonganddoesnotcontainany usefulinformation(asfarasIknow.Iwouldliketoknowifitcontainsany.). TheSuperBlock TheSuperBlockcontainstheinformationofthewholefilesystem.Itcontainsandthe metadatalikesize,totalinodese.t.c.TheExt2/Ext3superblockhasthefollowingcomponents. struct EXT2_SUPER_BLOCK { DWORD s_inodes_count; DWORD s_blocks_count; DWORD s_r_blocks_count; DWORD s_free_blocks_count; DWORD s_free_inodes_count; DWORD s_first_data_block; DWORD s_log_block_size; DWORD s_log_frag_size; DWORD s_blocks_per_group; DWORD s_frags_per_group; DWORD s_inodes_per_group; DWORD s_mtime; WORD s_wtime; WORD s_mnt_count; WORD s_max_mnt_count; WORD s_magic; WORD s_state; WORD s_pad; WORD s_minor_rev_level; DWORD s_lastcheck; DWORD s_checkinterval; DWORD s_creator_os; Sist. Archivos: i-Nodos Pgina 12 de 18

DWORD s_rev_level; WORD s_def_resuid; WORD s_def_regid; /* for EXT2_DYNAMIC_REV superblocks only */ DWORD s_first_ino; WORD s_inode_size; WORD s_block_group_nr; DWORD s_feature_compat; DWORD s_feature_incompat; DWORD s_feature_ro_compat; BYTE s_uuid[16]; char s_volume_name[16]; char s_last_mounted[64]; DWORD s_algorithm_usage_bitmap; BYTE s_prealloc_blocks; BYTE s_prealloc_dir_blocks; WORD s_padding1; DWORD s_reserved[204]; }; s_inodes_count :Stores the total no of inodes. s_blocks_count :Stores the total no of blocks. s_r_blocks_count :Stores the total no of blocks reserved for exclusive use of superuser. s_free_blocks_count :Stores the total no of free blocks. s_free_inodes_count :Stores the total no of free inodes in the file System. s_first_data_block :Position of the first data block. s_log_block_size :used to compute logical block size in bytes. E.g if it is 1, block size is 1024. if it is 2, block size is 2048. s_log_frag_size :used to compute logical fragment size. s_blocks_per_group :Total number of blocks contained in the group.(see groups later.). s_frags_per_group :Total number of fragments in a group. s_inodes_per_group :Total number of inodes in a group. s_mtime :Time at which the last mount was performed. The time is stored in UNIX format as defined by posix. s_wtime :Time at which the last write was performed. The time is stored in UNIX format as defined by posix. s_mnt_count :The total number of time the fs system has been mounted in r/w mode without having checked. The Linux OS uses this value to automatically check the file system when the specified time reaches. The Specified time is s_max_mnt_count. s_max_mnt_count :The max no of times the fs can be mounted in r/w mode before a check must be done. Sist. Archivos: i-Nodos Pgina 13 de 18

s_magic :A number that identifies the file System. (eg. 0xef53 for ext2). s_state; Gives the state of fs (eg. 0x001 is Unmounted cleanly). The Linux OS uses this value to determine. s_pad :Unused. s_minor_rev_level :Contains the minor number for the revision level. s_lastcheck; The time of last File System check performed. s_checkinterval; The max possible time between checks on the file system. s_creator_os :Owner Operating System of the file system. (linux=0, hurd=1, masix=2, FreeBSD=3, Lites=4 etc.). s_rev_level :Revision level of the file system. (0 -> original format, 1 -> v2 format with dynamic inode sizes.). s_def_resuid :Default uid for reserved blocks. s_def_regid :Default gid for reserved blocks. s_first_ino :First non-reserved inode. s_inode_size :Size of inode structure. s_block_group_nr :Block group no of this super block. There is another Super Block in File System for the rescue of damaged file system. s_feature_compat :Compatible feature set. s_feature_incompat :Incompatible feature set. s_feature_ro_compat :Read only compatible feature set. s_uuid :128-bit uuid for volume. s_volume_name :volume name (e.g. /, /boot etc.). s_last_mounted :Directory where last mounted. Reading the super block is pretty easy. Just read the starting sector +2 of the filesystem. Group Descriptor The ext2/ext3 file system is divided into groups called block group. The number of groups can be derived from the formula, block_group = s_blocks_count/s_blocks_per_group. The attributes of the group is identified by group descriptor. There is an array of group descriptors describing each group. The group descriptor table can be found at the first block (block-1) following the superblock structure of the file system (block no starts from 0.). The structure of the group descriptor is as follows. struct EXT2_GROUP_DESC { DWORD bg_block_bitmap; DWORD bg_inode_bitmap; DWORD bg_inode_table; WORD bg_free_blocks_count; Sist. Archivos: i-Nodos Pgina 14 de 18

WORD WORD WORD DWORD };

bg_free_inodes_count; bg_used_dirs_count; bg_pad; bg_reserved[3];

bg_block_bitmap:The block which contains the block bitmap for the group. bg_inode_bitmap:The block contains the inode bitmap for the group. bg_inode_table:The block contains the inode table first block (the starting block of the inode table.). bg_free_blocks_count:- Number of free blocks in the group. bg_free_inodes_count:- Number of free inodes in the group. bg_used_dirs_count:Number of inodes allocated to the directories. bg_pad:Padding (reserved). bg_reserved:Reserved. Block Bitmap The block bitmap represents the status of each block. It shows that the block is used (1) or free (0). E.g. 1001? show block 1 is used, block 2 is free, block 3 is free etc. Its correct location can be found by looking at bg_block_bitmap. It is used to determine which block is free and which is used. It is used when making or copying files (Ext2read does not currently support writing to file system.). Inode Bitmap The Inode Bitmap works in the similar way as the block bitmap. The inode bitmap represents the status of each inode. It determines whether the inode is used (1) or free (0). E.g. 1001? show inode 0 is used, inode 1 is free, inode 2 is free etc. Its correct location can be found by looking at bg_inode_bitmap. Inode Table In Ext2/Ext3 file system, each file is identified by an inode. Each file has its own inode entry. The File Systems a table of all the inodes in the file system called the inode table. Furthermore, each block group has its own inode table. The starting location for the inode table can be identified by looking at bg_inode_table. The inode gives the attributes like mode, size, uid, creation time etc. of the file. The structure of the inode is as follows. struct EXT2_INODE Sist. Archivos: i-Nodos Pgina 15 de 18

{ WORD WORD of Owner Uid */ DWORD */ DWORD */ DWORD */ DWORD time */ DWORD */ WORD of Group Id */ WORD */ DWORD */ DWORD DWORD 1 */ DWORD blocks */ DWORD (for NFS) */ DWORD DWORD ACL */ DWORD address */ BYTE number */ BYTE size */ WORD WORD fields */ l_i_gid_high; l_i_reserved2; /* were WORD reserved2[0] */ DWORD }; i_pad1; l_i_uid_high; /* these 2 l_i_fsize; /* Fragment i_mode; i_uid; i_size; i_atime; i_ctime; i_mtime; i_dtime; i_gid; i_links_count; i_blocks; i_flags; osd1; /* File mode */ /* Low 16 bits /* Size in bytes /* Access time /* Creation time /* Modification /* Deletion Time /* Low 16 bits /* Links count /* Blocks count /* File flags */ /* OS dependent

i_block[EXT2_N_BLOCKS];/* Pointers to i_generation; i_file_acl; i_dir_acl; i_faddr; /* File version /* File ACL */ /* Directory /* Fragment

l_i_frag;

/* Fragment

i_mode:It describes the format and the access rights of the file. The result obtained by masking the value with EXT2_S_IFMT(0xF000) gives the file type. When it is masked with Sist. Archivos: i-Nodos Pgina 16 de 18

EXT2_IRWXU(0x01c0) gives the user access, when it is masked with EXT2_IRWX(0x0038) gives group access and when masked with EXT2_IRWXO(0x0007) gives others rights. i_uid:i_size:The id of the owner. The size of the file in bytes.

i_atime:The last access time of the file. The time is number of seconds since 1st january 1970. i_ctime:The creation time of the file. The time is number of seconds since 1st january 1970. i_mtime:The last modification time of the file. The time is number of seconds since 1st january 1970. i_dtime:deletion time of the file. The time is number of seconds since 1st january 1970. i_gid:i_links_count:The group associated with this file. The number of times the inode is refered to.

i_blocks:The number of blocks reserved for the file. The block is not the size of the block but the sector size ie. 512 bytes. i_flags:osd1:The behaviour flags of the file system. The OS dependent value.

i_block:This array is used to locate the data of the file. The first twelve entries are the direct data blocks ie, they point directly to the data. The 13th field is the indirect block. It points to the block which has the address of data blocks. The block holds 1 block of entries. The 14th field is the bi- indirect block. It points to the block holding indirect entries. The 15th field is the triple indirect block. It points to the block holding bi- indirect entries. i_generation:- defines the file version. It is used by NFS. i_file_acl:file. i_dir_acl:Sist. Archivos: i-Nodos The access control flags associated with the

The access control flags associated with the Pgina 17 de 18

directory.

The directory structure The data blocks of the directory points to the directory structure. The directory structure of Ext2 is: struct EXT2_DIR_ENTRY { DWORD inode; WORD rec_len; WORD name_len; char name[EXT2_NAME_LEN]; }; The directory entries are the array of struct EXT2_DIR_ENTRY. The size of the each structure is given by the rec_len. inode:The inode number of the entry. rec_len:The length of the record. name_len:The length of the name of the file. name:The name of the file. The string is not NULL terminated.

/* /* /* /*

Inode number */ Directory entry length */ Name length */ File name */

Sist. Archivos: i-Nodos

Pgina 18 de 18

También podría gustarte