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

4 4

s_blocks_count

8 4

s_r_blocks_count

12 4

s_free_blocks_count

16 4

s_free_inodes_count

20 4

s_first_data_block

24 4

s_log_block_size

28 4

s_log_frag_size

32 4

s_blocks_per_group

36 4

s_frags_per_group

40 4

s_inodes_per_group

44 4

s_mtime

48 4

s_wtime

52 2

s_mnt_count

54 2

s_max_mnt_count

56 2

s_magic

58 2

s_state

60 2

s_errors

62 2

s_minor_rev_level

64 4

s_lastcheck

68 4

s_checkinterval

72 4

s_creator_os

76 4

s_rev_level

80 2

s_def_resuid

82 2

s_def_resgid

-- EXT2_DYNAMIC_REV Specific --
84 4

s_first_ino

88 2

s_inode_size

90 2

s_block_group_nr

92 4

s_feature_compat

96 4

s_feature_incompat

100 4

s_feature_ro_compat

104 16

s_uuid

120 16

s_volume_name

136 64

s_last_mounted

200 4

s_algo_bitmap

-- Performance Hints --
204 1

s_prealloc_blocks

205 1

s_prealloc_dir_blocks

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

s_journal_uuid

224 4

s_journal_inum

228 4

s_journal_dev

232 4

s_last_orphan

-- Directory Indexing Support --
236 4 x 4

s_hash_seed

252 1

s_def_hash_version

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

s_default_mount_options

260 4

s_first_meta_bg

264 760 Unused - reserved for future revisions


Estudi d'un cas real

Primer generem una imatge virtual del sistema de fitxers:

$ dd if=/dev/zero of=disc.img bs=512 count=2048
$ mkfs.ext2 disc.img

Ara podem muntar la imatge i crear directoris o fitxers dins:

$ sudo mount -o loop disc.img ./mount
$ cd mount
$ mkdir prova1
$ dd if=/dev/urandom of=prova2 bs=512 count=5
...

Ara podem desmuntar-la i analitzar-la amb un lector hexadecimal:

$ xxd disc.img | less
$ xxd disc.img | grep 'prova2'
...

Anem a observar alguns extractes del fitxer:

0000400: 8000 0000 0004 0000 3300 0000 d603 0000  ........3.......
0000410: 7300 0000 0100 0000 0000 0000 0000 0000  s...............
0000420: 0020 0000 0020 0000 8000 0000 9b19 af51  . ... .........Q
0000430: c819 af51 0100 2000 53ef 0100 0100 0000  ...Q.. .S.......
0000440: 8419 af51 004e ed00 0000 0000 0100 0000  ...Q.N..........
0000450: 0000 0000 0b00 0000 8000 0000 3800 0000  ............8...
0000460: 0200 0000 0100 0000 6e65 7464 8e4e 45ab  ........netd.NE.
0000470: b5c1 5cab a451 8906 0000 0000 0000 0000  ..\..Q..........
0000480: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000490: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00004a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00004b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00004c0: 0000 0000 0000 0000 0000 0000 0000 0300  ................
00004d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00004e0: 0000 0000 0000 0000 0000 0000 b694 08c3  ................
00004f0: 6467 44e9 b223 66bf cf72 6f50 0100 0000  dgD..#f..roP....
0000500: 0000 0000 0000 0000 8419 af51 0000 0000  ...........Q....
0000510: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000520: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000530: 0000 0000 0000 0000 0000 0000 0000 0000  ................

El primer que vegem és que comença en el 0x400, és a dir, el 1024. Cal dir que els valors estan en Little Endian.

  • 8000 0000: s_inodes_count Valor de 32 bits que indica la quantitat de inodes del sistema de fitxers. Deuría ser igual o menor que s_inodes_per_group*número de grups.
  • 0004 0000: s_blocks_count Valor de 32 bits que indica la quantitat de blocs en el sistema de fitxers. Vol dir que hi ha 0x00000400 o 1024 blocs en el sistema. Com que és una imatge de 1MB, cada bloc ocupa 1KB.
  • 3300 0000: s_r_blocks_count Blocs reservats per al superusuari per a que ningú puga omplir totalment el sistema de fitxers. 0x33 = 51 blocs reservats.
  • d603 0000: s_free_blocks_count Blocs lliures. 0x03d6 = 982
  • 7300 0000: s_free_inodes_count Inodes lliures.
  • 0100 0000: s_first_data_block Indica el bloc que té el superbloc. Si la mida del bloc és 1KB sempre és 1 i si és més, sempre és 0.
  • 0000 0000: s_log_block_size La mida del bloc. Però la manera de calcular-la és diguen la quantitat de bits que has de moure cap a l'esquerra el número 1024. Per exemple: si la mida fora 4KB, i 1024 en bits és 10000000000, tenim que moure 2 bits cap a l'esquerra per tindre: 1000000000000 = 4KB.
  • 0000 0000: s_log_frag_size Mida del fragment. Es calcula igual. El fragment és una manera de subdividir el bloc. Però aquesta funció pareix que no està suportada pel kernel.
  • 0020 0000: s_blocks_per_group Quantitat de blocs que té cada grup. 0x00002000 = 8192
  • 0020 0000: s_frags_per_group Fragments per cada grup.
  • 8000 0000: s_inodes_per_group Quantitat de inodes per grup. S'utilitza per a saber la mida del mapa de bits de inodes. 0x80 = 128
  • 9b19 af51: s_mtime La última vegada que va ser muntat. 0x51af199b = 1370429851
$ date -d '@1370429851'
mié jun  5 12:57:31 CEST 2013
  • c819 af51: s_wtime L'últim accés d'escriptura.
  • 0100: s_mnt_count Les vegades que ha sigut muntat deprés de l'última verificació.
  • 2000: s_max_mnt_count Les máximes vegades que pot ser muntat sense verificació.
  • 53ef: s_magic Indica que és un ext2. Sempre és 0xef53
  • 0100: s_state Indica l'estat del sistema de fitxers. Si el sistema està muntat, l'estat és 2 (EXT2_ERROR_FS). Si está ben desmuntat és 1 (EXT2_VALID_FS). Si al muntar el sistema es veu que no estava ben desmuntat és típic que s'execute el fsck.
  • 0100: s_errors Valor de 16 bits que diu el que deu fer el driver quant trobe un error. Si 1 Ha de continuar com si no passara res. Si 2 Té que muntar sols com a lectura i si 3 Ha de forçar un Kernel Panic.
  • 0000: s_minor_rev_level Indentifica el nivell de revisió menor.
  • 8419 af51: s_lastcheck Temps POSIX de l'ultima revisió del sistema de arxius.
  • 004e ed00: s_checkinterval Temps POSIX permés entre revisions del sistema de arxius.
  • 0000 0000: s_creator_os. Identifica el sistema operatiu que ha creat el sistema de fitxers. 0 Linux, 1 GNU HURD, 2 MASIX, 3 FreeBSD, 4 Lites.
  • 0100 0000: s_rev_level Valor del nivell de revisió.
  • 0000: s_def_resuid Valor per defecte del id d'usuari per als blocs reservats. En Linux és per defecte 0.
  • 0000: s_def_resgid Valor per defecte per als id del grup per als blocs reservats.
  • 0b00 0000: s_first_ino Index del primer inode usable per fitxers normals. El valor típic és 11.
  • 8000: s_inode_size Mida de l'estructura de cada inode. Per defecte és 128. Però pot ser una potència de 2 sempre que siga menor o igual que la mida del bloc.
  • 0000: s_block_group_nr El número del grup de blocs que té aquest superbloc.
  • 3800 0000: s_feature_compat Máscara de bits de característiques compatibles. 0x01 Permet reservar blocs per a nous directoris. 0x02 Magic inodes, 0x04 permet journaling [1] per a restablir les dades en cas de no poder fer una transacció. 0x08 Atributs extesos. 0x10 Inodes no estandar. 0x20 HTree. En aquest cas si passem a bits 0x38 = 111000 . És a dir. 0x20, 0x10 i 0x8
  • 0200 0000: s_feature_incompat Característiques no compatibles.
  • 0100 0000: s_feature_ro_compat Característiques per les quals el sistema deuria ser muntat en mode read-only.
  • 6e65: s_uuid128 bits per al identificador del volumen.
  • 7464 s_volume_name Nom del volumen. No s'utlitza generalment.
  • 8e4e 45ab b5c1 5cab: s_last_mounted Directori on va ser muntada per última vegada.
  • a451 8906: s_algo_bitmap Valor de 32 bits utilitzat per algoritmes de compressió.
  • 00: s_prealloc_blocks Representa el número de bloc que s'han de reservar per defecte quant es crea un fitxer
  • 00: s_prealloc_dir_blocks Representa el número de bloc que s'han de reservar per defecte quant es crea un directori
  • 0000 0000 0000 0000 0000 0000 0000: Reservats per al journaling de ETX3.
  • 0000 0000 0000 0000 0000 0000 0000 0000 s_hash_seed Llavors per al algoritme de hash per a l'indexació de directoris.
  • 00: s_def_hash_version Versió del hash
  • 0000 0000: s_default_mount_options Opcions de muntatge per al sistema de fitxers.



0000800: 0600 0000 0700 0000 0800 0000 d603 7300  ..............s.
0000810: 0300 0400 0000 0000 0000 0000 0000 0000  ................
0000820: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000830: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000840: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Enllaços

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

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