Anàlisi d'ext2

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

Ext2 és un dels sistemes d'arxius més utilitzats en Linux. Ha sigut extés per Ext3 i Ext4, però són ampliacions que milloren algunes coses sobre la base de Etx2. Per tant, resulta interesant parlar d'aquest sistema per a entendre millor cóm funciona el sistema de fitxers en Linux.

I-nodes

L'i-node (node índex) és un concepte fonamental en el sistema d'arxius de Linux i UNIX. Cada objecte en el sistema de fitxers està representat per un node-i.

Totes i tots els arxius sota Linux (i UNIX) té els següents atributs:

  • Tipus de fitxers (executables, especial, de blocs...)
  • Permisos (llegir, escriure...)
  • Propietari
  • Grup
  • Mida del fitxer
  • Temps d'accés de l'arxiu, el canvi i la modificació (UNIX o Linux mai emmagatzema el temps de creació de l'arxiu, això és pregunta favorita preguntar en UNIX/Linux en una entrevista de treball)
  • Temps d'eliminació del Arxiu
  • Nombre d'enllaços (soft / hard)
  • Atribut estès com només-afegir o no es pot eliminar el fitxer com a usuari root (irrevocabilitat)
  • Llista de control d'Accés (ACL)

Cal recordar que un i-node:

  • No conté el nom del fitxer. El nom el guarda el directori que el conté.
  • Els directoris són uns fitxers especials que contenen una llista de noms de fitxers i els seus inodes.

Podem fer les següents comande per vorer el i-node de l'arxiu:

$ ls -i /etc/passwd
$ stat /etc/passwd

Amb aquestes premises, es pot aconseguir:

  • Un fitxer pot tindre molts enllaços. Sols cal apuntar al mateix inode. (Hard Links)
  • Un nom de fitxer pot tindre enllaços que l'apunten. (Soft Links)
  • Un inode pot no tindre enllaços. Al esborrar un arxiu s'intenten alliberar els recursos. Però el sistema espera a que tots els processos lliberen l'inode.
  • Un inode permaneix encara que moguem el fitxer a un altre directori o es defragmente el disc.

Estructura d'un inode

Ext2-inode.gif

Els inodes tenen 15 punters:

  • Dotze punters que assenyalen directament als blocs de dades de l'arxiu (punters directes)
  • Un indicador indirecte per separat (un punter que apunta a un bloc de punters que apunten a continuació als blocs de dades de l'arxiu)
  • Un punter doblement indirectes (un punter que apunta a un bloc de punters que apunten a altres blocs de punters que apunten a continuació als blocs de dades de l'arxiu)
  • Un punter triplement indirecte (un punter que apunta a un bloc de punters que apunten a altres blocs de punters que apunten a altres blocs de punters que apunten a continuació als blocs de dades de l'arxiu)

Aquesta organització permet:

  • Una mida fixa de cada bloc. Pot ser es necessita sols un inode o més, però tots ocupen en mateix.
  • Facilitat per trobar les dades. No cal recorrer tot el fitxer, es pto trobar el bloc concret mirant el inode.
  • Els blocs indirectes poden estar en qualsevol part del sistema.

Etx2

El sistema de fitxers EXT2 es construeix amb la premissa que les dades contingudes en els fitxers es guardin en Blocs de Dades. Aquests blocs de dades són tots de la mateixa longitud i, si bé aquesta longitud pot variar entre diferents sistemes de fitxers EXT2 la mida dels blocs d'un sistema de fitxers EXT2 en particular es decideix quan es crea (usant mke2fs). La mida de cada fitxer s'arrodoneix fins a un nombre sencer de blocs. Si la mida de bloc és 1024 bytes, llavors un fitxer de 1025 bytes ocuparà dos blocs de 1024 bytes.

No tots els blocs del sistema de fitxers contenen dades, alguns s'han d'utilitzar per mantenir la informació que descriu l'estructura del sistema de fitxers. EXT2 defineix la topologia del sistema de fitxers descrivint cadascun d'ells amb una estructura de dades inode. Els inodes del sistema de fitxers s'emmagatzemen junts en Taules de inodes.

Els directoris EXT2 són simplement fitxers especials (ells mateixos descrits per inodes) que contenen punters als inodes de les seves entrades de directori.

Sist arch ext2.jpg

A la figura anterior es mostra la disposició del sistema de fitxers EXT2 ocupant una sèrie de blocs en un dispositiu estructurat bloc. Per la part que li toca a cada sistema de fitxers, els dispositius de bloc són només una sèrie de blocs que es poden llegir i escriure. Un sistema de fitxers no s'ha de preocupar on s'ha de posar un bloc en el medi físic, això és feina del controlador del dispositiu. Sempre que un sistema de fitxers necessita llegir informació o dades del dispositiu de bloc que els conté, demana que el controlador de dispositiu llegeixi un nombre sencer de blocs.

El sistema de fitxers EXT2 divideix les particions lògiques que ocupa en Grups de Bloc (Block Groups), en els quals cada grup duplica informació crítica per a la integritat del sistema de fitxers ja sigui valent-se de fitxers i directoris de blocs d'informació i dades. Aquesta duplicació és necessària per si ocorregués un desastre i el sistema de fitxers necessités recuperar-se.

Estructura en el disc

Ext2grups.png

Els primers 1024 bytes mai són manejat pel sistema de fitxers Ext2, ja que está reservat per al sector d'arrencada. La resta de la partició Ext2 es divideix en grups de blocs, redueixen la fragmentació, perquè el nucli intenta mantenir els blocs de dades d'un arxiu en el mateix grup de blocs, si és possible.

Cada bloc en el grup conté algunes de les peces d'informació:

  • Una còpia del superbloc del sistema de fitxers.
  • Una còpia del grup de descriptors de grups de blocs.
  • Un mapa de bits de bloc.
  • Un grup d'inodes.
  • Un mapa de bits d'inodes.
  • Un tros de dades pertanyents a arxiu, és a dir, blocs de dades (si un bloc no conté cap informació útil, es diu que aquesta lliure).

Tant el superbloc com els descriptors de grup estan duplicats en cada grup de blocs. Només el superbloc i els descriptors de grups inclosos en el grup de blocs 0 són utilitzats pel nucli, mentre que les altres còpies es deixen sense modificar, de fet, mai les mira.

Quan el programa /sbin/e2fsck realitza una comprovació de consistència, referència el superbloc i els descriptors de grups de blocs de grup 0 copiant a la resta de grups de blocs. Si es produeix una corrupció de dades, i el superbloc i els descriptors de grups del grup 0 es fan invàlids, l'administrador pot indicar a /sbin/e2fsck que faci referències a les velles còpies d'altres grups diferents de 0.

Usualment, les còpies redundants tenen prou informació per permetre al programa retornar la partició a un estat consistent.

El nombre de grups de blocs depèn tant de la mida de la partició com de la grandària de bloc. La principal restricció es deu al fet que el mapa de bits de bloc, que s'utilitza per identificar els blocs dins d'un grup que estan en ús o lliures, s'ha d'emmagatzemar en un únic bloc. Per tant, cada grup de blocs ha de tenir com a màxim 8 * b blocs, on b és la mida de bloc en bytes. Així, el nombre total de grups de blocs és aproximadament s / (8 * b), on s és la mida de la partició en blocs.

Com a exemple, considerem una partició Ext2 de 8 GB amb blocs de 4 KB de mida. En aquest cas, cada mapa de bits de blocs de 4KB descriu 32 KB de blocs de dades, és a dir, 128 MB. Per tant, com a màxim es necessiten 64 grups de blocs.

Clarament, a menor mida de bloc, major nombre de grups de blocs.

Si s'utlitzen blocs de 1KB el superbloc és el 1 i si són més grans és considera el 0. Cal recordar que el superbloc sempre utilitza 1kb independenment de la mida dels blocs.

En revisions posteriors, el superbloc no es guarda en tots els grups de blocs per no perdre espai.

El bloc de bitmap i de inodes está llimitat a 1 bloc, per tant, cada grup de blocs té un nombre llimitat de blocs.


Sample Floppy Disk Layout, 1KiB blocks

Block Offset Length Description
byte 0 512 bytes boot record (if present)
byte 512 512 bytes additional boot record data (if present)
-- block group 0, blocks 1 to 1439 --
byte 1024 1024 bytes superblock
block 2 1 block block group descriptor table
block 3 1 block block bitmap
block 4 1 block inode bitmap
block 5 23 blocks inode table
block 28 1412 blocks data blocks

Sample 20mb Partition Layout

Block Offset Length Description
byte 0 512 bytes boot record (if present)
byte 512 512 bytes additional boot record data (if present)
-- block group 0, blocks 1 to 8192 --
byte 1024 1024 bytes

superblock

block 2 1 block

block group descriptor table

block 3 1 block

block bitmap

block 4 1 block

inode bitmap

block 5 214 blocks

inode table

block 219 7974 blocks data blocks
-- block group 1, blocks 8193 to 16384 --
block 8193 1 block

superblock backup

block 8194 1 block

block group descriptor table backup

block 8195 1 block

block bitmap

block 8196 1 block

inode bitmap

block 8197 214 blocks

inode table

block 8408 7974 blocks data blocks
-- block group 2, blocks 16385 to 24576 --
block 16385 1 block

block bitmap

block 16386 1 block

inode bitmap

block 16387 214 blocks

inode table

block 16601 3879 blocks data blocks

Superbloc

Comença en el byte 1024 i pot tindre copies de seguretat en altre grups de blocs.

Superblock Structure

Offset (bytes) Size (bytes) Description 0 4

[#S-INODES-COUNT s_inodes_count]

4 4

[#S-BLOCKS-COUNT s_blocks_count]

8 4

[#S-R-BLOCKS-COUNT s_r_blocks_count]

12 4

[#S-FREE-BLOCKS-COUNT s_free_blocks_count]

16 4

[#S-FREE-INODES-COUNT s_free_inodes_count]

20 4

[#S-FIRST-DATA-BLOCK s_first_data_block]

24 4

[#S-LOG-BLOCK-SIZE s_log_block_size]

28 4

[#S-LOG-FRAG-SIZE s_log_frag_size]

32 4

[#S-BLOCKS-PER-GROUP s_blocks_per_group]

36 4

[#S-FRAGS-PER-GROUP s_frags_per_group]

40 4

[#S-INODES-PER-GROUP s_inodes_per_group]

44 4

[#S-MTIME s_mtime]

48 4

[#S-WTIME s_wtime]

52 2

[#S-MNT-COUNT s_mnt_count]

54 2

[#S-MAX-MNT-COUNT s_max_mnt_count]

56 2

[#S-MAGIC s_magic]

58 2

[#S-STATE s_state]

60 2

[#S-ERRORS s_errors]

62 2

[#S-MINOR-REV-LEVEL s_minor_rev_level]

64 4

[#S-LASTCHECK s_lastcheck]

68 4

[#S-CHECKINTERVAL s_checkinterval]

72 4

[#S-CREATOR-OS s_creator_os]

76 4

[#S-REV-LEVEL s_rev_level]

80 2

[#S-DEF-RESUID s_def_resuid]

82 2

[#S-DEF-RESGID s_def_resgid]

-- EXT2_DYNAMIC_REV Specific --
84 4

[#S-FIRST-INO s_first_ino]

88 2

[#S-INODE-SIZE s_inode_size]

90 2

[#S-BLOCK-GROUP-NR s_block_group_nr]

92 4

[#S-FEATURE-COMPAT s_feature_compat]

96 4

[#S-FEATURE-INCOMPAT s_feature_incompat]

100 4

[#S-FEATURE-RO-COMPAT s_feature_ro_compat]

104 16

[#S-UUID s_uuid]

120 16

[#S-VOLUME-NAME s_volume_name]

136 64

[#S-LAST-MOUNTED s_last_mounted]

200 4

[#S-ALGO-BITMAP s_algo_bitmap]

-- Performance Hints --
204 1

[#S-PREALLOC-BLOCKS s_prealloc_blocks]

205 1

[#S-PREALLOC-DIR-BLOCKS s_prealloc_dir_blocks]

206 2 (alignment)
-- Journaling Support --
208 16

[#S-JOURNAL-UUID s_journal_uuid]

224 4

[#S-JOURNAL-INUM s_journal_inum]

228 4

[#S-JOURNAL-DEV s_journal_dev]

232 4

[#S-LAST-ORPHAN s_last_orphan]

-- Directory Indexing Support --
236 4 x 4

[#S-HASH-SEED s_hash_seed]

252 1

[#S-DEF-HASH-VERSION s_def_hash_version]

253 3 padding - reserved for future expansion
-- Other options --
256 4

[#S-DEFAULT-MOUNT-OPTIONS s_default_mount_options]

260 4

[#S-FIRST-META-BG s_first_meta_bg]

264 760 Unused - reserved for future revisions

http://www.barnech.com/uai-sistemas/arq_so/Linux/sistema_de_archivos_ext2.htm

Enllaços

http://en.wikipedia.org/wiki/Inode

http://acacha.org/mediawiki/index.php/Sistemes_de_fitxers#Sistemes_de_fitxers_Unix

http://www.nongnu.org/ext2-doc/ext2.html