Contacts

Le système de fichiers ext2. Comment accéder aux systèmes de fichiers Ext2, Ext3, Ext4 dans un environnement Windows. Organisation logique Ext2

Si vous avez installé deux systèmes d'exploitation, Windows et Linux, vous aimeriez certainement être contenu sur les partitions d'un système d'exploitation gratuit directement à partir de Windows sans redémarrer votre ordinateur.

Malheureusement, il n'y a pas de support pour les partitions du système d'exploitation Linux sous Windows. Mais en vain. Il me semble que cela pourrait être un beau geste de Microsoft.

Le nœud du problème est que Windows utilise le système de fichiers NTFS, tandis que Linux a sa propre façon d'organiser les fichiers, le système de fichiers étendu. dernière version qui a le numéro de série 4.

Linux est plus convivial que sa sœur commerciale : Linux prend en charge le système de fichiers Windows NTFS par défaut. Bien sûr, vous ne pourrez pas installer Linux sur une partition NTFS, mais vous pouvez lire et écrire des données à partir d'une partition.

Ext2 IFS

Ext2 IFS prend en charge Windows NT4.0 / 2000 / XP / 2003 / Vista / 2008 versions x86 et x64 et vous permet de visualiser le contenu des partitions Linux ext2, et peut également y écrire. L'utilitaire installe le pilote système ext2fs.sys, qui étend Capacités de Windows et inclut un support complet pour ext2 : les partitions ext2 se voient attribuer des lettres de lecteur, et les fichiers et dossiers qu'elles contiennent sont affichés dans les boîtes de dialogue de toutes les applications, par exemple, dans l'explorateur.

FSD poste 2

Ext2 FSD est un pilote gratuit pour Systèmes Windows(2K / XP / VISTA / 7 versions x86 et x64). Comme l'utilitaire précédent, qui dans son essence est également un pilote, il inclut une prise en charge complète du système de fichiers ext2 dans Windows.

LTOOLS - un ensemble d'utilitaires ligne de commande qui vous permet de lire et d'écrire des données vers/depuis les partitions Linux ext2, ext3 et ReiserFS (systèmes de fichiers Linux standard) à partir d'une machine DOS ou Windows.

Il existe une version du programme avec un shell graphique (écrit en Java) - LTOOLSgui, ainsi qu'une version avec un shell graphique écrit.

Ext2Lire

Pour le dessert, comme toujours, le plus délicieux.

Ext2Read est un utilitaire de gestion de fichiers qui permet à la fois la visualisation et l'écriture sur les partitions ext2 / ext3 / ext4. Prend en charge LVM2 et, contrairement aux autres programmes de cette revue, le système de fichiers ext4. Prise en charge intégrée de la copie récursive de répertoires.

Et voici le deuxième dessert. Au début, il a été dit que ce serait un bon geste de la part de Microsoft d'activer la prise en charge des partitions Linux sous Windows par défaut.

Le geste a été fait pour le 20e anniversaire de Linux. Voir par vous-même.

C'est tout. Merci pour votre attention. Je vais combattre les scarabées de mai. Ils sont tellement nombreux ce printemps. 🙂

14 juin

Systèmes de fichiers ext2, ext3, XFS, ReiserFS, NTFS

Système de fichiers - C'est l'ordre qui détermine la manière d'organiser, de stocker et de nommer les données sur tout support de stockage électronique dans les ordinateurs.

La variété des systèmes de fichiers s'explique par le fait que chacun a été inventé pour son propre ensemble de tâches. Certains écrivent de petits fichiers très rapidement (disons jusqu'à 1 Go), mais en même temps, ils n'interagissent pas bien avec les gros fichiers ou ne fonctionnent pas du tout avec eux. Certains sont bons en termes de sécurité, d'autres en termes de vitesse de lecture/écriture. Chaque système de fichiers a ses propres avantages, inconvénients, vulnérabilités et caractéristiques distinctives.

DANS Linux les types de systèmes de fichiers suivants sont les plus couramment utilisés :

  1. poste2- signifie Deuxième étendu Système de fichiers (deuxième système de fichiers étendu). Développé par Remy Card en 1993 en tant que système de fichiers du noyau Linux, utilisé comme système de fichiers principal de 1993 à 2001 Linux.
    L'avantage est la vitesse de lecture/écriture élevée.
    Le principal inconvénient du système poste2 c'est qu'il ne s'agit pas de journalisation, mais c'est pour cette raison qu'il a de grandes performances ( enregistrement Est-ce que le processus de journalisation, de stockage d'une liste de modifications qui aide à préserver l'intégrité du système de fichiers lors de diverses défaillances du système );
  2. poste3- signifie Troisième système de fichiers étendu(la troisième version du système de fichiers étendu). Développé par Stephen Tweedy en 2001, toujours utilisé dans les distributions aujourd'hui Linux... Né dans le monde en tant qu'amélioré poste2.
    L'avantage de ce système est qu'il est journalisé, c'est-à-dire que sa fiabilité augmente considérablement par rapport à poste2.
    L'inconvénient est des performances légèrement inférieures et une vitesse de lecture / écriture.
  3. XFS- Développé par l'entreprise Graphiques en silicone en 1993, a été ajouté au noyau Linux en tant que système de fichiers en 2002 à toute la famille des distributions Linux, sur le ce moment utilisé comme "natif" dans la distribution chapeau rouge.
    L'avantage est la présence de la journalisation des métadonnées, une grande stabilité de travail, la distribution des flux d'E/S en groupes est prise en charge, une vitesse de lecture/écriture élevée, il y a la possibilité de défragmentation même avec une partition montée, et vous pouvez augmenter le taille du système de fichiers. Fonctionne plus efficacement avec des fichiers volumineux.
    L'inconvénient est que la taille de la partition ne peut pas être réduite, le traitement des métadonnées n'est pas si rapide, il fonctionne nettement plus lentement avec les petits fichiers que les autres types de systèmes de fichiers.
  4. ReiserFS- développé par l'entreprise Namesys sous la direction de Hans Reiser en 2001. Utilisé uniquement sur les systèmes d'exploitation Linux... C'était le premier système de fichiers de journalisation à être adopté dans le noyau.
    L'avantage de ce système de fichiers est qu'il fonctionne très rapidement avec de petits fichiers (la vitesse de lecture/écriture est supérieure à celle de la famille poste4), prend en charge la journalisation.
    L'inconvénient est que son développement s'est sensiblement ralenti en raison de l'arrêt de la tête Hans Reiser et qu'il n'y a pas de cryptage en arrière-plan.
  5. NTFS- signifie Système de fichiers de nouvelle technologie(Système de fichiers de nouvelle technologie). Développé en juillet 1993 par la société Microsoft... Il est largement utilisé dans divers systèmes d'exploitation, ainsi que dans divers supports de stockage.
    L'avantage est la capacité intégrée de différencier l'accès aux données pour différents utilisateurs, ainsi que d'attribuer des restrictions sur volume maximal espace disque, utilisation du système de journalisation, vitesse élevée de lecture/écriture de petits fichiers.
    L'inconvénient est que pour travail stable pas un peu nécessaire RAM Le PC avec des fichiers volumineux est lent, la longueur du chemin d'accès aux fichiers est limitée (32 767 caractères Unicode).

D'une manière si simple, nous avons découvert les "systèmes de fichiers poste2, poste3, XFS, ReiserFS, NTFS«!

Comment dans Environnement Windows permettent d'accéder à une partition de disque ou à un support amovible avec des systèmes de fichiers Poste2 / 3/4 ? Si, par exemple, il y a aussi un deuxième système sur l'ordinateur Linux... Et vous devez travailler avec ses données de l'environnement les fenêtres... Ou un autre exemple - lorsqu'à l'intérieur de Windows sont montés disques virtuels avec installé sur machines virtuelles systèmes Linux ou alors Android... Avec Ext2 / 3 / 4 Windows ne sait pas fonctionner nativement, il a besoin d'outils tiers pour cela. Quels sont ces moyens ? Considérez ceux ci-dessous.

***
Les trois premiers moyens permettront de ne lire que les dispositifs d'information de Poste2 / 3/4... Cette dernière solution permettra à la fois de lire et d'écrire des données. Tous les outils décrits ci-dessous sont gratuits.

1. Lecteur Linux DiskInternals

Un programme simple est un gestionnaire de fichiers primitif, fait comme un Windows Explorer, avec prise en charge des systèmes de fichiers Poste 2/3/4 , Reiser4 , HFS , UFS2... Dans la fenêtre du programme, nous verrons les partitions et les périphériques avec Linux ou alors Android.

Pour copier, sélectionnez un dossier ou un fichier, appuyez sur le bouton "Sauver".

Spécifiez ensuite le chemin de copie.

2. Plugin pour Total Commander DiskInternals Reader

Les amoureux du populaire peuvent extraire des données Linux ou alors Androidà l'intérieur des fenêtres avec ce gestionnaire de fichiers... Mais ayant préalablement installé un plugin spécial dedans. L'un de ces plugins est qu'il peut connecter et lire des dispositifs d'information formatés en Poste2 / 3/4 , Matières grasses / exGRAS , HFS / HFS + , ReiserFS... Téléchargez le plugin, décompressez son archive à l'intérieur , nous confirmons l'installation.

Lancer (important) en tant qu'administrateur. Nous allons à la section. Cliquez sur.

Ici, avec d'autres sections du disque et du support, celle avec Poste2 / 3/4 .

Les données sont copiées de manière traditionnelle manière - avec la touche F5 sur le deuxième panneau.

3. Plugin pour Total Commander ext4tc

Une alternative simplifiée à la solution précédente - poste4tc, un autre plugin pour ... Il peut se connecter pour lire des appareils d'information formatés uniquement en Poste2 / 3/4... Téléchargez le plugin, décompressez son archive dans le gestionnaire de fichiers, lancez l'installation.

Lancer (important) en tant qu'administrateur. Nous cliquons. Nous allons à.

Si vous devez copier des données, nous utilisons la manière habituelle avec la touche F5.

4. Pilote de support Ext2Fsd

Programme Ext2Fsd Le conducteur est-il Poste2 / 3/4, il implémente la prise en charge de ces systèmes de fichiers au niveau du système d'exploitation. Avec des partitions de disque et des lecteurs formatés dans ces systèmes de fichiers, vous pouvez travailler comme d'habitude, pris en charge Périphériques Windows informations dans la fenêtre de l'explorateur ou programmes tiers... Le pilote permet à la fois de lire et d'écrire des données.

Téléchargez la dernière version actuelle Ext2Fsd.

Lors de l'installation, nous activons (si pour un travail à long terme) trois cases à cocher suggérées :

1 - Autorun du pilote avec Windows ;
2 - Prise en charge de l'enregistrement pour Poste2;
3 - Prise en charge du formatage pour Poste3.

Au stade de la pré-finition, nous activons l'option de lancement de la fenêtre du gestionnaire de pilotes - - avec l'attribution d'informations aux appareils Poste2 / 3/4 lettres de lecteur.

Dans la fenêtre qui s'est ouverte nous verrons le support avec la lettre déjà attribuée. Par exemple, dans notre cas, le transporteur avec Poste4 la première lettre libre est spécifiée F.

Maintenant, nous pouvons travailler avec le disque F dans la fenêtre de l'explorateur.

Attribuez une lettre aux nouveaux appareils connectés avec Poste2 / 3/4 vous pouvez utiliser le menu contextuel appelé sur chacun des affichés dans la fenêtre dispositifs. Mais simplement lors de l'attribution d'une lettre de lecteur, un tel périphérique ne sera pas affiché après redémarrer windows, cette solution est pour une seule session informatique. Pour créer un nouvel appareil avec Poste2 / 3/4 visible en permanence dans l'environnement Windows, vous devez double-cliquer dessus pour ouvrir la fenêtre de paramétrage et définir les paramètres de connexion permanents. Dans la deuxième colonne, vous avez besoin de :

Pour les supports amovibles, cochez la case indiquée par le chiffre 1 dans la capture d'écran et spécifiez la lettre du lecteur ;
Pour les disques internes et les partitions, activez la case à cocher, indiquée dans la capture d'écran ci-dessous par le numéro 2, et spécifiez également la lettre du lecteur.

(Deuxième système de fichiers étendu).

L'histoire du développement des systèmes de fichiers Linux

Structure de partition de disque Ext2fs

·

· Catalogues

· Fichiers de l'appareil

·

·

bibliothèque EXT2fs

· Installations du système EXT2fs

· Calcul des performances

Matfak

Programme.

2e année 5e gr.

Chichirov Andreï

Système de tête EXT2fs (Deuxième système de fichiers étendu).

L'histoire du développement des systèmes de fichiers Linux

Les premières versions de Linux ont été développées sur la base du système d'exploitation Minix. Il aurait été plus facile de diviser les disques entre les deux systèmes que de développer un nouveau système de fichiers, alors Linus Torvalds a décidé d'introduire le support Linux pour le système de fichiers Minix. À l'époque, ce système de fichiers était un produit logiciel assez efficace avec relativement une petite quantité erreurs.

Cependant, les limitations associées à la structure du système de fichiers Minix étaient assez élevées, ils ont donc commencé à penser au développement d'un nouveau système de fichiers pour Linux.

Pour simplifier la mise en œuvre du nouveau système de fichiers dans le noyau Linux, un système de fichiers virtuel (VFS) a été développé. VFS a été écrit à l'origine par Chris Provenzano puis réécrit par Linus Torvalds avant de l'intégrer dans le noyau.

Après avoir été installé dans le noyau VFS, en avril 1992, un nouveau système de fichiers EXTfs (Extended File System) a été développé et ajouté à Linux 0.96c. Dans le nouveau système de fichiers, deux limitations importantes du système Minix ont été supprimées : sa taille maximale pouvait atteindre 2 gigaoctets et la longueur maximale du nom de fichier était de 255 caractères. C'était une réussite par rapport au système de fichiers Minix, même si certains problèmes étaient toujours présents. Il n'y avait pas de prise en charge de l'accès fractionné, de la modification des inodes et de la modification des cellules de temps de modification de fichier. Ce système de fichiers utilisait des listes chaînées pour fonctionner sur des blocs et des inodes libres, ce qui affectait considérablement les performances du système : au fil du temps, les listes devenaient désordonnées et désordonnées, ce qui entraînait une fragmentation du système de fichiers.

La solution à ces problèmes a été la sortie en janvier 1993 des versions alpha de deux nouveaux systèmes de fichiers : Xia et EXT2fs (Second Extended File System). Pour la plupart, le système de fichiers Xia était basé sur Minix, avec plusieurs nouvelles fonctionnalités ajoutées. Fondamentalement, c'était la possibilité de travailler avec des noms de fichiers longs, la prise en charge de partitions de disque plus grandes et la prise en charge de trois cellules de l'heure de modification du fichier. D'autre part, EXT2fs était basé sur EXTfs avec de nombreuses améliorations et ajouts. Elle a également eu des opportunités de développement futur.

Lorsque les deux systèmes de fichiers ont été publiés, ils étaient à peu près les mêmes fonctionnellement. Le système Xia était plus fiable que EXT2fs au prix de sa minimisation. En raison de leur application plus large, des erreurs ont été trouvées dans le système EXT2fs, et un grand nombre de nouvelles fonctionnalités et améliorations. Le système de fichiers EXT2fs est maintenant très fiable et est devenu le standard de facto pour le système de fichiers Linux.

Le tableau suivant contient des informations générales sur les fonctionnalités fournies par les différents systèmes de fichiers.

Minix FS

Poste FS

Poste 2 FS

Xia FS

Taille maximale du système de fichiers

Longueur maximale du fichier

Longueur maximale du nom de fichier

Prise en charge de trois cellules de l'heure de modification du fichier

Extensibilité

Bloc redimensionnable

Protection des informations

Si nécessaire, la longueur du nom de fichier dans Poste 2 peut être augmenté à 1012.

EXT2fs réserve un certain nombre de blocs à l'utilisateur root. Généralement c'est 5% du total, ce qui permet à l'administrateur système d'éviter le manque d'espace disque dur tout en le remplissant du travail des processus d'autres utilisateurs.

Structure de partition de disque Ext2fs

Les fabricants de disques durs livrent généralement leurs produits en format faible. Pour autant que je sache, cela signifie que tout l'espace disque est divisé en "secteurs" à l'aide d'étiquettes spéciales, d'une taille de 512 octets. Un tel disque (ou partition de disque) doit être préparé pour être utilisé sur un système d'exploitation spécifique. Sous MS-DOS ou Windows, la procédure de préparation est appelée formatage et sous Linux, elle est appelée création d'un système de fichiers. Création de système de fichiers ext2fs est de créer une certaine structure logique dans une partition de disque. Cette structure est construite comme suit. Tout d'abord, une zone de démarrage est allouée sur le disque. La zone de démarrage est créée sur n'importe quel système de fichiers. Sur la partition principale, il contient un enregistrement de démarrage, un morceau de code qui lance le processus de démarrage du système d'exploitation au démarrage. Cette zone n'est pas utilisée dans les autres sections. Le reste de l'espace disque est divisé en blocs. Un bloc peut avoir une taille de 1, 2 ou 4 kilo-octets. Un bloc est une unité adressable d'espace disque. Les fichiers sont alloués par blocs entiers, il y a donc un compromis à faire lors du choix d'une taille de bloc. Une grande taille de bloc réduit généralement le nombre d'accès au disque lors de la lecture ou de l'écriture d'un fichier, mais elle augmente la proportion d'espace perdu, en particulier lorsqu'il y a beaucoup de petits fichiers.

Les blocs dans leur zone sont combinés en groupes de blocs. Les groupes de blocs dans le système de fichiers et les blocs au sein d'un groupe sont numérotés de manière séquentielle, en commençant à 1. Le premier bloc sur le disque est numéroté 1 et appartient au groupe numéroté 1. Le nombre total de blocs sur un disque (dans une partition de disque) est un diviseur de la taille du disque exprimé en secteurs. Et le nombre de groupes de blocs n'est pas nécessaire pour diviser le nombre de blocs, car le dernier groupe de blocs peut ne pas être complet. Le début de chaque groupe de blocs a une adresse, qui peut être obtenue sous la forme ((numéro de groupe - 1) * (nombre de blocs dans le groupe)).

Chaque groupe de blocs a la même structure. Sa structure est présentée dans le tableau suivant.

La structure d'un groupe de blocs d'une partition de disque dans ext2fs

Le premier élément de cette structure (superbloc) est le même pour tous les groupes, et tous les autres sont individuels pour chaque groupe. Le superbloc est stocké dans le premier bloc de chaque groupe de blocs (sauf pour le groupe 1, dans lequel le premier bloc contient enregistrement de démarrage). Superbloc est le point de départ du système de fichiers. Il a une taille de 1024 octets et toujours situé à un décalage de 1024 octets depuis le début du système de fichiers... La présence de plusieurs copies du superbloc est due à l'extrême importance de cet élément du système de fichiers. Les superblocs en double sont utilisés pour la récupération après incident du système de fichiers.

Les informations stockées dans le superbloc sont utilisées pour organiser l'accès au reste des données sur le disque. Le superbloc détermine la taille du système de fichiers, le nombre maximum de fichiers dans la partition, la quantité d'espace libre et contient des informations sur l'endroit où rechercher les zones non allouées. Lorsque le système d'exploitation démarre, le superbloc est lu en mémoire et toutes les modifications apportées au système de fichiers sont d'abord reflétées dans la copie du superbloc dans le système d'exploitation et écrites sur le disque uniquement périodiquement. Cela améliore les performances du système car de nombreux utilisateurs et processus mettent constamment à jour les fichiers. D'autre part, lorsque vous éteignez le système, le superbloc doit être écrit sur le disque, ce qui ne vous permet pas d'éteindre l'ordinateur en coupant simplement l'alimentation. Sinon, au prochain démarrage, les informations écrites dans le superbloc ne correspondront pas à l'état réel du système de fichiers.

Le superbloc a la structure suivante

Nom de domaine

Un type

Un commentaire

s_inodes_count

ULONG

Nombre d'inodes dans le système de fichiers

s_blocks_count

ULONG

Le nombre de blocs dans le système de fichiers

s_r_blocks_count

ULONG

Nombre de blocs réservés au superutilisateur

s_free_blocks_count

ULONG

Compteur de blocs gratuit

s_free_inodes_count

ULONG

Compteur d'inode gratuit

s_first_data_block

ULONG

Le premier bloc qui contient des données. Selon la taille du bloc, ce champ peut être 0 ou 1.

s_log_block_size

ULONG

Indicateur de taille de bloc logique : 0 = 1 Ko ; 1 = 2 Ko ; 2 = 4 Ko.

s_log_frag_size

LONGUE

Indicateur de taille de fragment (il semble que la notion de fragment ne soit pas utilisée actuellement)

s_blocks_per_group

ULONG

Nombre de blocs dans chaque groupe de blocs

s_frags_per_group

ULONG

Le nombre de fragments dans chaque groupe de blocs

s_inodes_per_group

ULONG

Le nombre d'inodes dans chaque groupe de blocs

s_mtime

ULONG

L'heure à laquelle le système de fichiers a été monté pour la dernière fois.

s_wtime

ULONG

Heure à laquelle le système de fichiers a été écrit pour la dernière fois

s_mnt_count

USHORT

Compte du nombre de montages du système de fichiers. Si ce compteur atteint la valeur spécifiée dans le champ suivant (s_max_mnt_count), le système de fichiers doit être vérifié (ceci est fait au redémarrage) et le compteur est remis à zéro.

s_max_mnt_count

COURT

Un nombre indiquant combien de fois le système de fichiers peut être monté

s_magie

USHORT

Numéro magique (0xEF53) indiquant que le système de fichiers est de type ex2fs

s_état

USHORT

Drapeaux indiquant l'état actuel du système de fichiers (s'il est propre, etc.)

s_erreurs

USHORT

Indicateurs qui spécifient les procédures de gestion des messages d'erreur (que faire si des erreurs sont détectées).

s_pad

USHORT

Remplissage

s_lastcheck

ULONG

L'heure de la dernière vérification du système de fichiers

s_checkinterval

ULONG

Délai maximal entre les vérifications du système de fichiers

s_creator_os

ULONG

Une indication du type de système d'exploitation dans lequel le système de fichiers a été créé

s_rev_level

ULONG

Le niveau de révision du système de fichiers.

s_réservé

ULONG

Remplissage jusqu'à 1024 octets

Après le superbloc se trouvent les descripteurs de groupe. Cette description est un tableau avec la structure suivante.

Nom de domaine

Un type

Rendez-vous

bg_block_bitmap

ULONG

L'adresse du bloc contenant le bitmap de bloc du groupe donné

bg_inode_bitmap

ULONG

L'adresse du bloc contenant le bitmap d'inode pour ce groupe

bg_inode_table

ULONG

Adresse du bloc contenant la table des inodes de ce groupe

bg_free_blocks_count

USHORT

Compteur du nombre de blocs libres dans ce groupe

bg_free_inodes_count

USHORT

Le nombre d'inodes libres dans ce groupe

bg_used_dirs_count

USHORT

Le nombre d'inodes dans ce groupe qui sont des répertoires

bg_pad

USHORT

Remplissage

bg_réservé

ULONG

Remplissage

La taille de la description d'un groupe de blocs peut être calculée comme (block_group_size_in_ext2 * number_groups) / block_size(arrondir si nécessaire).

Les informations stockées dans la description de groupe sont utilisées pour localiser les bitmaps de bloc et d'inode et la table d'inode. N'oubliez pas que les blocs et groupes de blocs sont numérotés à partir de 1.

Un bloc bitmap est une structure dont chaque bit indique si le bloc correspondant est affecté à un fichier. Si le bit est à 1, alors le bloc est occupé. Cette carte est utilisée pour rechercher des blocs libres dans les cas où il est nécessaire d'allouer de l'espace pour un fichier. Le bitmap de blocs occupe un nombre de blocs égal à (number_blocks_in_group / 8) / block_size(arrondir si nécessaire).

Le bitmap d'inode remplit une fonction similaire à la table d'inode : il montre quels descripteurs sont utilisés.

La zone suivante dans la structure du groupe de blocs est utilisée pour stocker la table des inodes du fichier. La structure de l'inode lui-même est discutée plus en détail dans la sous-section suivante.

Enfin, tout l'espace restant dans le groupe de blocs est alloué au stockage des fichiers réels.

Système de fichiers Poste 2 se caractérise par :

  • structure hiérarchique,
  • traitement cohérent des tableaux de données,
  • extension de fichier dynamique,
  • protection des informations dans les fichiers,
  • traiter les périphériques (tels que les terminaux et les lecteurs de bande) comme des fichiers.

Représentation interne des fichiers

Chaque fichier du système Ext 2 a un index unique. L'index contient les informations dont tout processus a besoin pour accéder au fichier. Les processus accèdent aux fichiers à l'aide d'un ensemble bien défini d'appels système et en identifiant le fichier avec une chaîne de caractères faisant office de nom de fichier. Chaque nom distinctif identifie de manière unique un fichier, de sorte que le noyau traduit ce nom en un index pour le fichier. L'index comprend une table d'adresses pour l'emplacement des informations du fichier sur le disque. Étant donné que chaque bloc du disque est adressé par son propre numéro, cette table stocke une collection de numéros de bloc de disque. Pour plus de flexibilité, le noyau concatène un fichier bloc par bloc, permettant aux informations du fichier d'être dispersées dans tout le système de fichiers. Mais cette disposition complique la tâche de trouver des données. La table d'adresses contient une liste de numéros de blocs contenant des informations appartenant au fichier, mais des calculs simples montrent que la liste linéaire des blocs de fichiers dans l'index est difficile à gérer. Pour que la petite structure d'index permette de travailler avec des fichiers volumineux, la table d'adresses de bloc de disque est alignée sur la structure illustrée à la figure 1.

La plupart des fichiers de l'Ext 2 ne dépassent pas 10 Ko ou même 1 Ko ! Étant donné que 10 Ko d'un fichier se trouvent dans des blocs d'adresses directes, la plupart des données stockées dans les fichiers sont accessibles en un seul accès disque. Par conséquent, contrairement à la référence à gros fichiers, travailler avec des fichiers de taille standard est rapide.

Inodes de fichier

Chaque fichier sur le disque correspond à un et un seul inode de fichier, qui est identifié par son numéro de séquence - l'index de fichier. Cela signifie que le nombre de fichiers pouvant être créés sur un système de fichiers est limité par le nombre d'inodes, qui est soit explicitement spécifié lors de la création du système de fichiers, soit calculé en fonction de la taille physique de la partition de disque. Les inodes existent sur le disque sous forme statique et le noyau les lit en mémoire avant de commencer à travailler avec eux.

Le fichier inode a la structure suivante :

Nom de domaine

Un type

La description

I_mode

USHORT

Le type et les droits d'accès à ce fichier.

I_uid

USHORT

Identifiant du propriétaire.

I_taille

ULONG

Taille du fichier en octets.

I_atime

ULONG

L'heure du dernier accès au fichier (Heure d'accès).

I_ctime

ULONG

L'heure à laquelle le fichier a été créé.

I_mtime

ULONG

L'heure à laquelle le fichier a été modifié pour la dernière fois.

I_dtime

ULONG

Heure de suppression du fichier.

I_gid

USHORT

Identifiant de groupe (GID).

I_links_count

USHORT

Les liens comptent.

I_blocs

ULONG

Le nombre de blocs occupés par le fichier.

I_flags

ULONG

Indicateurs de fichier (Drapeaux de fichier)

I_réservé1

ULONG

Réservé au système d'exploitation

I_block

ULONG

Pointeurs vers les blocs dans lesquels les données du fichier sont écrites (un exemple d'adressage direct et indirect dans la Fig. 1)

I_version

ULONG

Version du fichier (pour NFS)

I_file_acl

ULONG

fichier ACL

I_dir_acl

ULONG

Répertoire ACL

I_faddr

ULONG

Adresse du fragment

je_frag

UCHAR

Numéro de fragment

I_fsize

UCHAR

Taille des fragments

I_pad1

USHORT

Remplissage

I_reserved2

ULONG

Réservé

Le champ de type de fichier et d'autorisations est un mot de deux octets, dont chaque bit sert d'indicateur indiquant la relation du fichier avec un type spécifique ou définissant des autorisations de fichier spécifiques.

Identifiant

Sens

But du drapeau (terrain)

S_IFMT

F000

Masque de type de fichier

S_IFSOCK

A000

Socket de domaine

S_IFLNK

C000

S_IFREG

8000

Fichier régulier

S_IFBLK

6000

Dispositif orienté bloc

S_IFDIR

4000

Catalogue

S_IFCHR

2000

Périphérique orienté octet (caractère)

S_IFIFO

1000

Pipe nommée (fifo)

S_ISUID

0800

SUID - changer le bit de propriétaire

S_ISGID

0400

SGID - bit de changement de groupe

S_ISVTX

0200

Peu collant

S_IRWXU

01C0

Masque des droits du propriétaire du fichier

S_IRUSR

0100

Le droit de lire

S_IWUSR

0080

Le droit d'écrire

S_IXUSR

0040

Le droit d'exécuter

S_IRWXG

0038

Masque de droits de groupe

S_IRGRP

0020

Le droit de lire

S_IWGRP

0010

Le droit d'écrire

S_IXGRP

0008

Le droit d'exécuter

S_IRWXO

0007

Masque des droits des autres utilisateurs

S_IROTH

0004

Le droit de lire

S_IWOTH

0002

Le droit d'écrire

S_IXOTH

0001

Le droit d'exécuter

Il existe plusieurs descripteurs d'inode qui sont réservés à des fins spéciales et jouent un rôle particulier dans le système de fichiers. Ce sont les descripteurs suivants

Identifiant

Sens

La description

EXT2_BAD_INO

Un inode qui répertorie l'inode des blocs Bad

EXT2_ROOT_INO

Inode racine

EXT2_ACL_IDX_INO

Inode ACL

EXT2_ACL_DATA_INO

Inode ACL

EXT2_BOOT_LOADER_INO

Inode du chargeur de démarrage

EXT2_UNDEL_DIR_INO

Restaurer l'inode du répertoire

EXT2_FIRST_INO

Premier inode non réservé

Le descripteur le plus important de cette liste est le descripteur du répertoire racine. Ce descripteur pointe vers le répertoire racine, qui, comme tous les répertoires, se compose d'entrées avec la structure suivante :

Nom de domaine

Un type

La description

Inode

ULONG

le numéro d'inode (index) du fichier

rec_len

USHORT

La longueur de cette entrée

name_len

USHORT

Longueur du nom de fichier

Nom

CARBONISER

Nom de fichier

Une seule entrée dans le répertoire ne peut pas traverser une limite de bloc (c'est-à-dire qu'elle doit être située entièrement à l'intérieur d'un bloc). Par conséquent, si l'enregistrement suivant ne tient pas entièrement dans ce bloc, il est transféré dans le bloc suivant et l'enregistrement précédent continue de manière à remplir le bloc jusqu'à la fin.

Figure 1 Blocs d'adresses directes et indirectes dans l'index

Figure 2 Taille de fichier en octets avec une taille de bloc de 1 Ko

Figure 3. Exemple d'index de disque

La figure 3 montre l'index de disque d'un fichier. Cet index appartient à un fichier régulier, propriété de "mjb" et dont la taille est de 6030 octets. Le système permet à l'utilisateur « mjb » de lire, d'écrire et d'exécuter le fichier ; les membres du groupe « os » et tous les autres utilisateurs sont uniquement autorisés à lire ou à exécuter le fichier, mais pas à y écrire des données. Le fichier a été lu pour la dernière fois le 23 octobre 1984 à 13h45, et la dernière fois a été enregistré le 22 octobre 1984 à 10h30. L'index a été modifié pour la dernière fois le 23 octobre 1984 à 13 h 30, bien qu'aucune information n'ait été écrite dans le fichier à ce moment-là. Le noyau encode toutes les données ci-dessus dans l'index. Notez la différence entre l'écriture sur disque du contenu de l'index et le contenu du fichier. Le contenu du fichier ne change que lorsque le fichier est écrit. Le contenu de l'index change à la fois lorsque le contenu du fichier change et lorsque le propriétaire du fichier, les droits d'accès et l'ensemble de pointeurs changent. La modification du contenu du fichier entraîne automatiquement la correction de l'index, mais la mise à jour de l'index ne signifie pas que le contenu du fichier a changé.

Catalogues

Les répertoires sont les fichiers à partir desquels la structure hiérarchique du système de fichiers est construite ; ils jouent un rôle important dans la conversion du nom de fichier en numéro d'index. Un répertoire est un fichier dont le contenu est un ensemble d'entrées composé d'un numéro d'index et du nom du fichier inclus dans le répertoire. Un nom composé est une chaîne de caractères terminée par un blanc, séparée par une barre oblique ("/") en plusieurs composants. Chaque composant, à l'exception du dernier, doit être un nom de répertoire, mais le dernier composant peut être un nom de fichier non-répertoire. Dans la version V d'UNIX, chaque composant est limité à 14 caractères ; ainsi, avec les 2 octets alloués au numéro d'index, la taille de l'entrée du répertoire est de 16 octets.

Décalage en octets
à l'intérieur du répertoire

Numéro d'index
(2 octets)

Nomfichier

1798

init

1276

fsck

clri

1268

mot

1799

monter

mknod

2114

mot de passe

1717

démonter

1851

liste de contrôle

fsdbld

configuration

1432

getty

crash

mkfs

Figure 4 Format du répertoire /etc

La figure 4 montre le format du répertoire "etc". Chaque répertoire contient des fichiers dont les noms sont indiqués par un point et deux points ("." Et "..") et dont les numéros d'index coïncident avec les numéros d'index de ce répertoire et le répertoire parent, respectivement. Le numéro d'index du fichier "." dans le répertoire "/ etc" a une adresse à l'offset 0 et une valeur de 83. Le numéro d'index du fichier ".." a une adresse à l'offset 16 du début du répertoire et une valeur de 2. Les entrées du répertoire peuvent être vide, le numéro d'index étant 0. Par exemple, l'entrée 224 du répertoire "/ etc" est vide, même si elle contenait autrefois le point d'entrée d'un fichier nommé "crash". Le programme mkfs initialise le système de fichiers de sorte que les numéros d'index des fichiers soient "." et ".." dans le répertoire racine sont les mêmes que le numéro d'index racine du système de fichiers.

Le noyau stocke les données dans un répertoire comme il le fait dans un fichier ordinaire, en utilisant une structure d'index et des blocs avec des niveaux d'adressage direct et indirect. Les processus peuvent lire les données des répertoires de la même manière qu'ils lisent les fichiers normaux, mais le noyau se réserve un accès exclusif en écriture au répertoire pour s'assurer que la structure du répertoire est correcte. Les droits d'accès au répertoire ont la signification suivante : le droit de lecture donne aux processus la possibilité de lire les données du répertoire ; l'autorisation d'écriture permet à un processus de créer de nouvelles entrées dans un répertoire ou de supprimer les anciennes (en utilisant les opérations système creat, mknod, link et unlink), ce qui modifie le contenu du répertoire ; l'autorisation d'exécution permet à un processus de rechercher un répertoire par nom de fichier (puisqu'il est inutile d'"exécuter" un répertoire).

Lorsqu'un processus utilise un chemin de fichier, le noyau recherche dans les répertoires le numéro d'inode approprié. Une fois qu'un nom de fichier a été converti en un numéro d'inode, ce descripteur est placé en mémoire puis utilisé dans les requêtes suivantes.

Le concept des systèmes de fichiers Unix inclut le concept de lien. Un inode peut être associé à plusieurs noms de fichiers. Le descripteur contient un champ contenant le numéro auquel le fichier est associé. L'ajout d'un lien implique la création d'une entrée de répertoire où le numéro d'inode pointe vers un autre descripteur et l'incrémentation du nombre de liens dans le descripteur. Lors de la suppression d'un lien, le noyau décrémente le compteur de références et supprime le descripteur si ce compteur devient nul.

De tels liens sont appelés liens physiques et ne peuvent être utilisés que dans un système de fichiers (vous ne pouvez pas créer de lien pour un fichier à partir d'un autre système de fichiers). De plus, un lien physique ne peut pointer que vers un fichier (un lien physique vers un répertoire peut conduire à une boucle dans le système de fichiers).

Sur la plupart des systèmes Unix, il existe un autre type de lien. Ces liens, qui ne contiennent que le nom du fichier, sont appelés liens symboliques. Lors du traitement de tels liens par le noyau, lors de la conversion du chemin d'accès à un fichier en un inode, le noyau remplace le nom du lien par le contenu du descripteur (c'est-à-dire le nom du fichier de destination) et réinterprète le chemin d'accès au fichier. Puisqu'un lien symbolique ne pointe pas vers un inode, il est possible de créer des liens vers des fichiers situés dans un système de fichiers différent. Ces liens peuvent pointer vers n'importe quel type de fichier, même inexistant. Les liens symboliques sont largement utilisés car ils n'ont pas les mêmes restrictions que les liens physiques. Cependant, ils occupent de l'espace sur le disque, où se trouvent les blocs d'inode et de données. Leur utilisation peut entraîner certains retards lors de la conversion du chemin du fichier vers l'inode, ce qui est dû au fait que lors du traitement d'un lien symbolique, le noyau doit réinterpréter le chemin du fichier.

Fichiers de l'appareil

Dans les systèmes d'exploitation de type Unix, les périphériques sont accessibles via des fichiers spéciaux. Un tel fichier ne prend pas de place sur le système de fichiers. Il s'agit uniquement du point d'accès pour le pilote de périphérique.

Il existe deux types de fichiers de périphérique : caractère et bloc. Lors de l'utilisation du type caractère, il est possible d'échanger des données avec le périphérique uniquement en mode caractère, tandis que les fichiers périphériques de type bloc permettent d'échanger uniquement des blocs à l'aide du tampon. Lorsqu'une demande d'E/S est effectuée pour un fichier de périphérique, cette demande est redirigée vers le pilote de périphérique correspondant. Chacun de ces fichiers correspond à un numéro majeur, qui identifie le type d'appareil, et à un numéro mineur, qui identifie l'appareil lui-même.

Fonctionnalités EXT2fs supplémentaires

En plus des fonctionnalités Unix standard, EXT2fs fournit des fonctionnalités supplémentaires qui ne sont généralement pas prises en charge par les systèmes de fichiers Unix.

Les attributs de fichier vous permettent de modifier la réponse du noyau lorsque vous travaillez avec des ensembles de fichiers. Vous pouvez définir des attributs sur un fichier ou un répertoire. Dans le second cas, les fichiers créés dans ce répertoire héritent de ces attributs.

Au moment du montage du système, certaines fonctionnalités liées aux attributs de fichier peuvent être installées. L'option de montage permet à l'administrateur de choisir comment les fichiers sont créés. Dans un système de fichiers spécifique à BSD, les fichiers sont créés avec le même ID de groupe que le répertoire parent. Les fonctionnalités de System V sont un peu plus complexes. Si un répertoire a le bit setgid défini, les fichiers générés hériteront de l'ID de groupe de ce répertoire, et les sous-répertoires hériteront de l'ID de groupe et du bit setgid. Sinon, les fichiers et répertoires sont créés avec l'ID de groupe principal du processus appelant.

Le système EXT2fs peut utiliser une modification de données synchrone similaire au système BSD. L'option de montage permet à l'administrateur de spécifier que toutes les données (inodes, bitblocks, indirectblocks et directoryblocks) sont écrites sur le disque en synchronisation lorsqu'elles sont modifiées. Cela peut être utilisé pour atteindre un débit d'écriture de données élevé, mais dégrade également les performances. En fait, cette fonction n'est généralement pas utilisée car, en plus de dégrader les performances, elle peut entraîner la perte de données utilisateur non marquées lors de la vérification du système de fichiers.

EXT2fs vous permet de choisir la taille du bloc logique lors de la création d'un système de fichiers. Il peut avoir une taille de 1024, 2048 ou 4096 octets. L'utilisation de blocs volumineux conduit à des opérations d'E/S plus rapides (puisque le nombre de demandes de disque diminue), et, par conséquent, à moins de mouvements de tête. D'autre part, l'utilisation de gros blocs entraîne une perte d'espace disque. Habituellement, le dernier bloc du fichier n'est pas entièrement utilisé pour stocker des informations. Par conséquent, à mesure que la taille du bloc augmente, la quantité d'espace disque gaspillé augmente.

EXT2fs permet d'utiliser des liens symboliques accélérés. Lors de l'utilisation de tels liens, les blocs de données du système de fichiers ne sont pas utilisés. Le nom du fichier de destination n'est pas stocké dans le bloc de données, mais dans l'inode lui-même. Cette structure permet d'économiser de l'espace disque et d'accélérer le traitement des liens symboliques. Bien entendu, l'espace réservé au descripteur est limité, donc tous les liens ne peuvent pas être présentés comme accélérés. La longueur maximale d'un nom de fichier dans un lien accéléré est de 60 caractères. Dans un avenir proche, il est prévu d'étendre ce schéma aux petits fichiers.

EXT2fs surveille l'état du système de fichiers. Le noyau utilise un champ séparé dans le superbloc pour indiquer l'état du système de fichiers. Si le système de fichiers est monté en mode lecture/écriture, alors son état est défini sur "Pas propre". S'il est démonté ou réinstallé en mode lecture seule, son état est défini sur "Nettoyer". Pendant le démarrage du système et la vérification de l'état du système de fichiers, ces informations sont utilisées pour déterminer si le système de fichiers doit être vérifié. Le noyau met également quelques erreurs dans ce champ. Lorsque le noyau détecte une incompatibilité, le système de fichiers est marqué comme « Erroneous ». Le vérificateur de système de fichiers teste ces informations pour vérifier le système, même si son état est en fait "Clean".

L'ignorance à long terme des tests du système de fichiers peut parfois entraîner des difficultés, c'est pourquoi EXT2fs inclut deux méthodes pour une vérification régulière du système. Le superbloc contient le compteur de montage du système. Ce compteur est incrémenté à chaque fois que le système est monté en lecture/écriture. Si sa valeur atteint sa valeur maximale (elle est également stockée dans le superbloc), alors le programme de test du système de fichiers commence à la vérifier, même si son état est "Clean". L'heure du dernier contrôle et l'intervalle maximum entre les contrôles sont également stockés dans le superbloc. Lorsque l'intervalle maximum entre les vérifications est atteint, l'état du système de fichiers est ignoré et sa vérification est lancée.

Le système EXT2fs contient des outils pour le configurer. Le programme tune2fs peut être utilisé pour changer :

  • actions lorsqu'une erreur est détectée. Lorsque le noyau détecte une discordance, le système de fichiers est marqué comme « Erroné » et l'une des trois actions suivantes peut être effectuée : continuer l'exécution, remonter le système de fichiers en mode lecture seule pour éviter de l'endommager, redémarrer le système pour vérifier le système de fichiers.
  • valeur de montage maximale.
  • intervalle maximum entre les contrôles.
  • le nombre de blocs logiques réservés à l'utilisateur root.

Les options spécifiées au montage peuvent également être utilisées pour modifier le comportement du noyau lorsqu'une erreur est détectée.

L'utilisation d'attributs permet aux utilisateurs de supprimer des fichiers secrets. Lors de la suppression d'un tel fichier, des informations aléatoires sont écrites dans les blocs qui ont été précédemment utilisés pour placer ce fichier. Cela empêche les personnes extérieures d'accéder au contenu précédent de ce fichier à l'aide d'un éditeur de disque.

De nouveaux types de fichiers ont récemment été ajoutés au système EXT2fs, tirés du système de fichiers 4.4 BSD. Les fichiers du premier type ne peuvent être utilisés qu'en lecture : personne n'a le droit de les modifier ou de les supprimer. Cela peut être utilisé pour protéger des fichiers de configuration importants. Un autre type de fichier est celui des fichiers qui peuvent être ouverts en mode écriture, et les données ne peuvent être ajoutées qu'à la fin de ce fichier. Les fichiers de ce type ne peuvent pas non plus être supprimés ou renommés. Ils peuvent être utilisés comme fichiers journaux, dont la taille ne peut que croître.

Optimisation des performances

Le système EXT2fs contient de nombreuses fonctions qui optimisent ses performances, ce qui entraîne une augmentation de la vitesse d'échange d'informations lors de la lecture et de l'écriture des fichiers.

EXT2fs utilise activement la mémoire tampon du disque. Lorsqu'un bloc doit être lu, le noyau émet une requête d'E/S pour plusieurs blocs voisins. Ainsi, le noyau essaie de s'assurer que le prochain bloc à lire est déjà chargé dans le tampon du disque. De telles opérations sont généralement effectuées par lecture séquentielle de fichiers.

Le système EXT2fs contient également un grand nombre d'optimisations de placement d'informations. Les groupes de blocs sont utilisés pour combiner les inodes et les blocs de données correspondants. Le noyau essaie toujours de placer les blocs de données d'un fichier dans le même groupe, ainsi que son descripteur. Ceci est destiné à réduire le mouvement des têtes d'entraînement lors de la lecture du descripteur et des blocs de données correspondants.

Lors de l'écriture de données dans un fichier, EXT2fs pré-alloue jusqu'à 8 blocs contigus lors de l'allocation d'un nouveau bloc. Cette méthode vous permet d'obtenir des performances élevées lorsque le système est fortement chargé. Il permet également d'allouer des blocs de fichiers contigus, ce qui les rend lus rapidement.

bibliothèque EXT2fs

La bibliothèque libext2fs a été développée pour simplifier l'utilisation des ressources EXT2fs et opérer sur les structures de contrôle de ce système de fichiers. Cette bibliothèque contient des fonctions qui peuvent être utilisées pour définir et modifier des données dans le système de fichiers EXT2 en accédant directement à un périphérique physique.

La plupart des utilitaires EXT2fs (mke2fs, e2fsck, tune2fs, dumpe2fs, debugfs, etc.) utilisent cette bibliothèque. Cela rend beaucoup plus facile la modification de ces utilitaires, car tout changement à introduire opportunités supplémentaires au système de fichiers EXT2fs doit être effectué uniquement dans la bibliothèque EXT2fs.

L'interface de la bibliothèque EXT2fs étant assez large et abstraite, elle peut être utilisée pour écrire facilement des programmes nécessitant un accès direct au système de fichiers. Par exemple, la bibliothèque EXT2fs a été utilisée lors du transfert d'un dump 4.4 BSD et de la restauration de certains utilitaires. Très peu de changements ont été nécessaires pour adapter ces outils à Linux (il a fallu remplacer plusieurs fonctions qui interagissent avec le système de fichiers par des appels à la bibliothèque EXT2fs).

La bibliothèque EXT2fs donne accès aux opérations de plusieurs classes. La première classe concerne les opérations liées au système de fichiers. N'importe quel programme peut ouvrir ou fermer un système de fichiers, lire ou écrire un bloc de bits, créer un nouveau système de fichiers sur disque. Il existe également des fonctions pour opérer sur la liste des blocs défectueux dans le système de fichiers.

La deuxième classe d'opérations fonctionne avec des répertoires. Un programme utilisant la bibliothèque EXT2fs peut créer ou développer un répertoire, ainsi qu'ajouter ou supprimer des entrées dans un répertoire. Il existe des fonctions à la fois pour déterminer le chemin d'accès à un fichier par le descripteur d'inode et pour déterminer le chemin d'accès à un fichier par le descripteur spécifié.

La dernière classe d'opérations opère sur les inodes. Il est possible de lire la table des descripteurs, de lire ou d'écrire un descripteur, de visualiser tous les blocs du descripteur spécifié. Il est possible d'utiliser les fonctions d'allocation et de libération de blocs et de descripteurs.

Installations du système EXT2fs

Des commandes puissantes ont été développées pour le système EXT2fs. Ces outils sont utilisés pour créer, modifier et corriger toute incohérence dans les systèmes de fichiers EXT2fs. Le programme mke2fs est utilisé pour monter une partition de disque contenant un système de fichiers EXT2fs vide.

Le programme tune2fs peut être utilisé pour régler les paramètres du système de fichiers. Il peut être utilisé pour modifier la réponse aux erreurs, le nombre maximum de montages système, l'intervalle maximum entre les vérifications du système et le nombre de blocs logiques réservés à l'utilisateur root.

L'outil le plus intéressant est peut-être le vérificateur de système de fichiers. E2fsck est conçu pour corriger les incohérences dans le système de fichiers après un arrêt inexact de l'ensemble du système. La version initiale du programme e2fsck est basée sur le programme Linus Torvald fsck pour le système de fichiers Minix. Cependant, la version actuelle du programme a été réécrite à l'aide de la bibliothèque EXT2fs et est plus rapide et peut corriger grande quantité erreurs dans le système lors de sa vérification, par rapport à la version originale.

Le programme e2fsck a été conçu pour fonctionner à une vitesse maximale. Étant donné que les programmes de vérification du système de fichiers conduisent au démarrage du disque, vous devez optimiser les algorithmes e2fsck de manière à ce que l'accès aux structures du système de fichiers soit beaucoup moins fréquent. Et, en outre, l'ordre de vérification des inodes et des répertoires serait effectué en fonction du numéro de bloc pour réduire le temps de déplacement des têtes de lecteur de disque.

Lors du premier passage, e2fsck parcourt tous les inodes du système de fichiers et vérifie chaque descripteur comme un élément distinct du système. Ainsi, ce test ne vérifie pas les autres objets du système de fichiers. L'un des objectifs de ces contrôles est de vérifier l'existence du type de fichier contrôlé, ainsi que de faire correspondre tous les blocs du descripteur avec des blocs portant des numéros existants. La première passe vérifie les bitmaps indiquant l'utilisation de blocs et de descripteurs.

Si e2fsck trouve des blocs de données numérotés dans plusieurs descripteurs, les passes 1B à 1D sont exécutées pour déterminer l'incohérence, soit en augmentant les blocs partagés, soit en supprimant un ou plusieurs descripteurs.

Le premier passage prend le plus de temps, car tous les inodes doivent être lus en mémoire et vérifiés. Pour réduire le temps des opérations d'E/S lors des passes suivantes, toutes les informations nécessaires restent dans la mémoire tampon. Une caractéristique de ce schéma est la recherche de tous les blocs de répertoires dans le système de fichiers. Pour obtenir ces informations, lors de la seconde passe, les structures de descripteurs de tous les répertoires du système de fichiers sont relues.

Dans la seconde passe, les répertoires sont examinés en tant qu'éléments séparés du système de fichiers. Chaque bloc de répertoire est vérifié séparément, sans référence à d'autres blocs de répertoire. Cela permet à e2fsck de trier tous les blocs de répertoires par numéro de bloc et de les vérifier dans l'ordre croissant, réduisant ainsi le temps d'accès au disque. Les blocs de répertoire sont testés pour s'assurer que leurs entrées sont valides et qu'elles contiennent des références à des descripteurs avec des numéros existants (tels que définis dans la première étape).

Pour le premier bloc de répertoire dans chaque descripteur de répertoire, l'existence du "." et "..", et quel est le numéro de descripteur à écrire dans "." correspond au répertoire courant. (Le numéro de descripteur pour l'écriture ".." n'est pas testé avant la troisième passe.)

Lors de la seconde passe, les informations correspondant au répertoire parent sont stockées dans une mémoire tampon.

Il convient de noter qu'à la fin de la deuxième passe, presque toutes les opérations d'E/S disque sont terminées. Toutes les informations requises pour les troisième, quatrième et cinquième passes sont en mémoire, cependant, les passes restantes chargent le processeur et prennent moins de 5 à 10 % de l'exécution totale de e2fsck.

Dans la troisième passe, les liens de répertoire sont vérifiés. E2fsck vérifie les chemins de chaque répertoire vers la racine en utilisant les informations obtenues lors du deuxième passage. L'entrée ".." pour chaque répertoire est également vérifiée ici. Tous les répertoires trouvés après l'analyse et n'ayant aucune connexion avec le répertoire racine sont placés dans le répertoire / lost + found.

Lors de la quatrième passe, e2fsck vérifie le nombre de liens pour chaque inode en examinant tous les descripteurs et en comparant les nombres de liens (cette information est enregistrée à partir de la première passe) avec les compteurs internes qui ont été calculés lors de la deuxième passe. Tous les fichiers non supprimés avec un nombre de références nul sont également placés dans le répertoire / lost + found.

Enfin, lors de la cinquième passe, e2fsck vérifie que toutes les informations sur le système de fichiers correspondent. Ici, les bitmaps des blocs et des descripteurs, obtenus lors des passes précédentes, sont comparés aux valeurs réelles et, si nécessaire, les informations sur le disque sont corrigées en conséquence.

Un autre outil utile est le débogueur de système de fichiers. Debugfs est un programme puissant qui vous permet de déterminer et de définir l'état du système de fichiers. Il s'agit essentiellement d'une interface interactive avec la bibliothèque EXT2fs, c'est-à-dire qu'elle traduit les commandes saisies en appels aux fonctions de la bibliothèque.

Debugfs peut être utilisé pour définir la structure du système de fichiers interne, réparer manuellement un système endommagé ou créer des tests conditionnels pour e2fsck. Malheureusement, ce programme peut endommager le système de fichiers si vous ne savez pas comment l'utiliser. Avec cet outil, il suffit de détruire simplement le système de fichiers. Par conséquent, debugfs ouvre le système de fichiers en mode lecture seule par défaut. Pour un accès en lecture/écriture, utilisez l'option -w.

Calcul des performances

Les résultats du test de Bonnie peuvent être consultés dans le tableau suivant :

Par enregistrement de caractères (Kb/s)

Bloquer l'enregistrement (Kb/s)

Enregistrement (Ko/s)

Lecture par caractère (Kb/s)

Lecture de bloc (Kb/s)

BSD asynchrone

Synchronisation BSD

Ext2 fs

1237

1033

Xia fs

Les résultats sont plutôt bons pour les blocs E/S : EXT2fs surpasse les autres systèmes en termes de performances. Cela est dû aux optimisations incluses dans les routines de placement. L'enregistrement est également assez rapide, du fait qu'il se fait en mode gupp. La vitesse de lecture élevée est due au fait que les blocs ont été répartis dans un fichier, de sorte que les têtes de lecteur ne se déplacent pas entre deux lectures et que l'optimisation de la lecture anticipée fonctionne pleinement.

D'un autre côté, le système FreeBSD a de meilleures performances pour les E/S de caractères. Cela peut être dû au fait que FreeBSD et Linux utilisent des procédures différentes pour les bibliothèques C respectives. De plus, FreeBSD est susceptible d'avoir la bibliothèque de lecture symbolique la plus optimisée et donc de fonctionner un peu mieux ici.

Résultats des tests d'André

Les résultats des tests d'Andrew peuvent être consultés dans le tableau suivant :

Pass 1 Créer

Passe 2 Copie

Réussir 3 Vérifier le statut

Vérification du parcours 4 octets

Étape 5 Compilation

2203

7391

6319

17466

75314

Synchronisation BSD

2330

7732

6317

17499

75681

Ext2 fs

Les résultats des deux premiers passages montrent que Linux gagne avec la communication asynchrone. Lors de la création de répertoires et de fichiers, le système BSD écrit de manière synchrone des descripteurs et des entrées de répertoire. Il est supposé que le support asynchrone de FreeBSD n'est pas encore complètement implémenté.

Au troisième passage, les valeurs pour Linux et BSD sont très similaires. Bien que BSD ait de meilleures performances, l'ajout d'un tampon de nom de fichier au VFS Linux résout ce problème.

Linux est plus rapide que FreeBSD dans les quatrième et cinquième passes, principalement en raison de l'utilisation de la gestion unifiée des tampons. La taille du tampon peut augmenter selon les besoins et occuper plus de mémoire que FreeBSD, qui utilise une taille fixe. La comparaison des résultats des systèmes EXT2fs et Xia fs montre que l'optimisation incluse dans EXT2fs est effectivement utilisée : la différence de performances entre ces systèmes est d'environ 5 à 10 %.

Conclusion

Le système de fichiers EXT2 est le plus largement utilisé par les utilisateurs de Linux. Il fournit des fonctionnalités Unix standard et des fonctions supplémentaires. De plus, grâce aux optimisations incluses dans le noyau, il affiche d'excellents résultats de performances.

Le système EXT2fs comprend des fonctions pour ajouter de nouvelles capacités. Certaines personnes travaillent sur le développement d'extensions pour le système de fichiers réel : Posix ACL, restore fichiers supprimés et compression de fichiers en temps réel.

Le système EXT2fs a d'abord été intégré au noyau Linux, et maintenant il est activement porté sur d'autres systèmes d'exploitation. EXT2fs est également une partie importante du système d'exploitation Masix, qui est actuellement développé par l'un des auteurs.

VLADIMIR MESHKOV

Architecture du système de fichiers Ext2

L'article traite de la structure logique de ext2 - le système de fichiers du système d'exploitation Linux.

Les principaux composants du système de fichiers ext2

Comme pour tout système de fichiers UNIX, le système de fichiers ext2 peut être divisé en les composants suivants :

  • blocs et groupes de blocs;
  • nœud d'information;
  • superbloc.

Blocs et groupes de blocs

L'espace disque entier est divisé en blocs de taille fixe qui sont des multiples de la taille du secteur - 1024, 2048 et 4096 octets. La taille de bloc est spécifiée lors de la création d'un système de fichiers sur une partition de disque dur. Une taille de bloc plus petite économise de l'espace sur le disque dur mais limite également taille maximum système de fichiers. Tous les blocs sont numérotés. Afin de réduire la fragmentation et le nombre de mouvements des têtes de disque dur lors de la lecture de grandes matrices de données, les blocs sont combinés en groupes.

Nœud d'information

Le concept de base d'un système de fichiers est un nœud d'information, ou nœud d'information, ou inode. Il s'agit d'une structure spéciale qui contient des informations sur les attributs et l'emplacement physique d'un fichier. Les attributs du fichier sont son type (fichier normal, répertoire, etc.), les droits d'accès à celui-ci, l'ID du propriétaire, la taille, l'heure de création. Les informations d'emplacement physique sont une séquence de numéros de blocs absolus contenant des données de fichier.

Superbloc

Le superbloc est l'élément principal du système de fichiers ext2. Il contient les informations suivantes sur le système de fichiers (la liste est incomplète) :

  • le nombre total de blocs et d'inodes dans le système de fichiers ;
  • le nombre de blocs et d'inodes libres dans le système de fichiers ;
  • taille de bloc du système de fichiers ;
  • le nombre de blocs et d'inodes dans le groupe ;
  • taille de l'inode ;
  • identifiant du système de fichiers ;
  • numéro du premier bloc de données.

En d'autres termes, c'est le numéro du bloc contenant le superbloc. Ce nombre est toujours 0 si la taille de bloc du système de fichiers est supérieure à 1024 octets et 1 si la taille de bloc est de 1024 octets.

L'opérabilité du système de fichiers dépend directement de l'intégrité du superbloc. Le système d'exploitation crée plusieurs sauvegardes du superbloc afin qu'il puisse être restauré en cas de dommage. La copie principale est située à 1024 octets du début de la partition sur laquelle le système de fichiers a été créé (les 1024 premiers octets sont réservés au chargeur du système d'exploitation).

Les premières versions du système de fichiers ext2 créaient des copies du superbloc au début de chaque groupe de blocs. Cela a entraîné une perte importante d'espace disque, donc plus tard, le nombre de sauvegardes de superblocs a été réduit et les groupes de blocs 0, 1, 3, 5 et 7 ont été alloués pour les accueillir.

Format de groupe de blocs

Un schéma fonctionnel généralisé du système de fichiers ext2 est illustré à la Fig. un.

Presque tous les groupes de blocs ont le même format. Dans chaque groupe, en plus des blocs d'informations, des informations sur l'occupation des blocs et l'inode du groupe sont stockées sous la forme d'un bitmap. Le groupe de blocs 0 comprend également un superbloc et une table de descripteurs de groupe, dont nous parlerons ci-dessous.

Le bitmap d'occupation de bloc est généralement situé dans le premier bloc du groupe. S'il y a une sauvegarde de superbloc dans le groupe, le bitmap est situé dans le deuxième bloc du groupe. La taille du bitmap est d'un bloc. Chaque bit de cette carte indique l'état du bloc. Si le bit est à (1), alors le bloc est occupé ; s'il est effacé (0), alors le bloc est libre. Le premier bloc du groupe correspond au bit zéro de la carte, le deuxième bloc correspond au premier bit, et ainsi de suite.

Les inodes d'un même groupe sont rassemblés dans une table. Dans un bitmap d'occupation d'inode de groupe, chaque bit représente l'état d'un élément dans la table d'inode du groupe.

Chaque groupe de blocs est décrit à l'aide d'un descripteur de groupe de blocs. Un descripteur de groupe est une structure qui contient des informations sur les adresses du bitmap d'occupation de bloc, du bitmap d'occupation d'inode et de la table d'inode du groupe correspondant. Tous les descripteurs de groupe sont collectés dans une table de descripteurs de groupe, qui est stockée dans le groupe de blocs 0. Quant au superbloc, système opérateur sauvegarde la table de descripteur de groupe.

Algorithme de lecture de fichiers

Chaque inode, comme un bloc, a un numéro de séquence qui est unique dans le système de fichiers et contient des informations sur un seul fichier. Ainsi, pour accéder au contenu d'un fichier, il est nécessaire de connaître le numéro de séquence de l'inode correspondant.

Comme mentionné ci-dessus, les informations sur l'emplacement physique du fichier sont contenues dans l'inode. Ces informations sont une séquence de numéros de blocs de 32 bits contenant des données de fichier (Fig. 1). Les 12 premiers chiffres sont des blocs d'informations directs. Le 13e nombre est un numéro de bloc indirect. Il contient l'adresse du bloc dans lequel sont stockées les adresses des blocs d'informations. Le numéro 14 est un numéro à blocs doubles, le numéro 15 est un numéro à blocs triples.

Le nom de fichier n'est pas inclus dans l'inode ; le mappage entre les noms de fichier et les numéros de séquence d'inode est effectué via des répertoires.

Catalogues

Les fichiers sur les systèmes UNIX et POSIX sont stockés dans un système de fichiers hiérarchique arborescent. La racine du système de fichiers est le répertoire racine indiqué par le symbole "/". Chaque nœud intermédiaire dans l'arborescence du système de fichiers est un répertoire. Les nœuds de fin de l'arborescence du système de fichiers sont soit des répertoires vides, soit des fichiers. Le chemin d'accès absolu du fichier se compose des noms de tous les répertoires menant au fichier spécifié, en commençant par le répertoire racine. Par exemple, le nom de chemin /home/test.file signifie que le fichier test.file se trouve dans le répertoire personnel, qui, à son tour, se trouve dans le répertoire racine "/".

Un répertoire, comme un fichier, est décrit à l'aide d'un inode. Le contenu d'un répertoire est un tableau d'entrées, dont chacune contient des informations sur un fichier qui se trouve « à l'intérieur » du répertoire actuel.

L'entrée du répertoire a le format suivant :

  • le numéro de série de l'inode du fichier ;
  • longueur d'enregistrement en octets ;
  • Nom de fichier;
  • la longueur du nom de fichier.

La recherche du numéro d'inode d'un fichier commence toujours au répertoire racine. Par exemple, pour obtenir le numéro d'inode d'un fichier situé dans le répertoire racine, le système d'exploitation doit récupérer le contenu du répertoire racine, y trouver une entrée avec le nom de ce fichier et extraire le numéro d'inode du fichier de cette entrée .

Les premiers numéros d'inode sont réservés par le système de fichiers et sont répertoriés dans le fichier d'en-tête :

* Numéros d'inode spéciaux

#define EXT2_BAD_INO 1 / * Inode de blocs défectueux * /

#define EXT2_ROOT_IN 2 / * Inode racine * /

#define EXT2_ACL_IDX_IN 3 / * ACL inode * /

#define EXT2_ACL_DATA_INO 4 / * ACL inode * /

#define EXT2_BOOT_LOADER_INO 5 / * Inode du chargeur de démarrage * /

#define EXT2_UNDEL_DIR_INO 6 / * Restaurer l'inode du répertoire * /

L'inode numéro 2 (inode racine) est réservé à l'écriture du répertoire racine. Cet inode est dans le groupe de blocs 0 et occupe la deuxième position dans la table des inodes du groupe. Le premier numéro d'inode non réservé est stocké dans le superbloc.

Après avoir déterminé le numéro de séquence de l'inode du fichier, le noyau calcule le numéro de groupe dans lequel se trouve cet inode et sa position dans la table des inodes du groupe. En lisant à partir de cette position d'inode, le système d'exploitation obtient informations complètes sur le fichier, y compris les adresses des blocs dans lesquels le contenu du fichier est stocké.

Le numéro du groupe de blocs dans lequel se trouve l'inode est calculé par la formule :

groupe = (inode_num - 1) / inodes_per_group

où:

  • grouper- le numéro requis du groupe de blocs ;
  • num_inode- le numéro ordinal de l'inode définissant le fichier ;
  • inodes_par_groupe- le nombre d'inodes dans le groupe (cette information est dans le superbloc).

La position de l'inode dans la table des inodes du groupe est déterminée par la formule :

index = (inode_num - 1)% inodes_per_groupe

où index est la position de l'inode dans la table.

Regardons un exemple d'obtention du contenu du fichier test.file situé dans le répertoire racine. Pour lire le fichier /test.file il vous faut :

  • trouver une entrée sur ce fichier dans le tableau d'entrées du répertoire racine ;
  • extraire le numéro d'ordre de l'inode du fichier, calculer le numéro du groupe dans lequel se trouve cet inode ;
  • récupérer l'adresse de la table des inodes du groupe à partir du descripteur de ce groupe ;
  • calculer la position de l'inode dans ce tableau ;
  • lire l'inode du fichier ;
  • extraire les adresses des blocs d'informations de l'inode et lire les informations dans ces blocs.

En figue. 2 montre les étapes de lecture du fichier /test.file en détail.

    Étapes 1 à 6 - Lecture du répertoire racine :

  1. Le tableau des descripteurs de groupe est lu à partir du groupe de blocs 0.
  2. Le descripteur du groupe de blocs 0 est extrait de la table des descripteurs de groupe et l'adresse de la table des inodes du groupe 0 y est lue.
  3. La table des inodes est lue à partir du groupe de blocs 0.
  4. Le numéro d'inode du répertoire racine est fixé à 2, donc le deuxième élément est lu dans la table des inodes du groupe 0, qui contient l'adresse du bloc contenant le contenu du répertoire racine. Supposons que ce bloc soit situé dans le groupe de blocs A.
  5. Un bloc contenant les entrées du répertoire racine est lu à partir du groupe de blocs A.
  6. Une recherche est effectuée pour une entrée nommée "test.file". Si une telle entrée est trouvée, le numéro d'inode du fichier "test.file" en est extrait.
  7. Après avoir déterminé le numéro d'inode, vous pouvez accéder aux blocs d'informations du fichier (étapes 7 à 11) :

  8. Le numéro du groupe dans lequel se trouve l'inode donné et sa position dans la table des inodes du groupe sont calculés (supposons que le numéro de groupe est B et que la position dans la table est X).
  9. De la table de descripteur de groupe, on extrait le descripteur du groupe de blocs B, et à partir de celui-ci on lit l'adresse de la table d'inode de ce groupe de blocs.
  10. Une table d'inodes est lue à partir du groupe de blocs B.
  11. L'inode à la position X est lu dans la table des inodes du groupe de blocs B.
  12. Les adresses du bloc avec le contenu du fichier /test.file sont extraites de l'inode lu et les informations sont lues à partir du bloc avec l'adresse spécifiée.

Implémentation logicielle de l'algorithme de lecture de fichiers

Données initiales : disponibles partitionner dur le disque sur lequel le système de fichiers ext2 a été créé. Cette section correspond au fichier de périphérique /dev/hda3. Un sous-répertoire home est créé dans le répertoire racine de la partition, et il contient le fichier test.file avec le contenu suivant :

Les agrumes vivraient-ils dans les fourrés du sud ?

Oui, mais une fausse copie !

1234567890-=

Ne pensez pas mal, ce n'est pas un non-sens, mais un exercice d'essai du stage de formation des opérateurs télégraphiques dans les troupes de transmission de l'ex-URSS !

Attention! Il y a un point important à garder à l'esprit. Le fichier créé ne sera pas immédiatement écrit sur le disque, mais ira d'abord dans la mémoire tampon du disque. Une tentative d'obtenir immédiatement le contenu du fichier à l'aide de l'algorithme ci-dessus ne mènera à rien, car les informations sur ce fichier sont physiquement absentes sur le disque. Vous devez "forcer" le système à écrire le tampon du disque sur le disque. La façon la plus simple de le faire est d'effectuer une opération de redémarrage. Par conséquent, une fois le fichier créé, redémarrez le système.

Notre tâche consiste à utiliser le fichier de périphérique /dev/hda3 pour lire le fichier /home/test.file en accédant directement à ses blocs d'informations.

Considérons une implémentation logicielle d'un module qui effectue cette opération.

Fichiers d'en-tête :

#comprendre

#comprendre

#comprendre

#comprendre

#comprendre

#comprendre

Le fichier d'en-tête définit les types structurels qui décrivent les principaux composants du système de fichiers ext2 - superbloc, descripteur de groupe de blocs, nœud d'information, entrée de répertoire.

Examinons brièvement les champs inclus dans chacune de ces structures :

  1. Structure de superbloc ext2_super_block :
    • __u32 s_inodes_count- le nombre total d'inodes dans le système de fichiers ;
    • __u32 s_blocks_count- le nombre total de blocs dans le système de fichiers ;
    • __u32 s_free_blocks_count- le nombre de blocs libres ;
    • __u32 s_free_inodes_count- le nombre d'inodes libres ;
    • __u32 s_first_data_block- numéro du premier bloc de données (numéro du bloc dans lequel se trouve le superbloc) ;
    • __u32 s_log_block_size- Cette valeur est utilisée pour calculer la taille du bloc. La taille du bloc est déterminée par la formule : taille du bloc = 1024<< s_log_block_size;
    • __u32 s_blocks_per_group- le nombre de blocs dans le groupe ;
    • __u32 s_inodes_per_group- le nombre d'inodes dans le groupe ;
    • __u16 s_magie- identifiant du système de fichiers ext2 (signature 0xEF53);
    • __u16 s_inode_size- la taille du nœud d'information (inode) ;
    • __u32 s_first_ino C'est le numéro du premier inode non réservé.
  2. La structure d'un descripteur pour un groupe de blocs struct ext2_group_desc :
    • __u32 bg_block_bitmap- bitmap d'occupation des blocs du groupe ;
    • __u32 bg_inode_bitmap- bitmap d'occupation du groupe d'inodes ;
    • __u32 bg_inode_table- adresse de la table des inodes du groupe.
  3. La structure du nœud d'information struct ext2_inode :
    • __u16 i_mode - type de fichier et droits d'accès. Le type de fichier est déterminé par les bits 12 à 15 de ce champ :
      • 0xA000- lien symbolique ;
      • 0x8000- dossier régulier ;
      • 0x6000- bloquer le fichier de l'appareil ;
      • 0x4000- annuaire ;
      • 0x2000- fichier de périphérique de caractères ;
      • 0x1000- Canal FIFO.
    • __u32 i_size- taille en octets ;
    • __u32 i_atime- heure du dernier accès au fichier ;
    • __u32 i_ctime- le temps de création du fichier ;
    • __u32 i_mtime- l'heure de la dernière modification ;
    • __u32 i_blocs- le nombre de blocs occupés par le fichier ;
    • __u32 i_block- les adresses des blocs d'informations (y compris toutes les références indirectes).
  4. La valeur EXT2_N_BLOCKS est définie dans le fichier :

    * Constantes relatives aux blocs de données

    #définir EXT2_NDIR_BLOCKS 12

    #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS

    #définir EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)

    #définir EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)

    #définir EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)

  5. La structure de l'entrée de répertoire struct ext2_dir_entry_2 :
  6. #define EXT2_NAME_LEN 255

  • __u32 inode- numéro d'inode du fichier ;
  • __u16 rec_len- la longueur de l'entrée du répertoire ;
  • __u8 name_len- la longueur du nom de fichier ;
  • nom de caractère Nom de fichier.

Définissons le nom de la section sur laquelle le système de fichiers est créé, les structures globales et les variables.

#define PART_NAME "/dev/hda3"

struct ext2_super_block sb;

/ * buffer pour stocker la table des descripteurs de groupe * /

caractère non signé buff_grp;

buff de char non signé ; / * tampon d'informations * /

int indev; / * descripteur de fichier de périphérique * /

int BLKSIZE; / * taille du bloc du système de fichiers * /

Définissons plusieurs fonctions dont nous avons besoin pour travailler :

Fonction de lecture de superbloc :

void read_sb ()

Memset (& sb, 0,1024) ;

Nous déplaçons 1024 octets depuis le début de la partition et lisons le superbloc dans la structure struct ext2_super_block sb :

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

Perror ("lcherche");

Sortie (-1);

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

Perreur ("lire");

Sortie (-1);

Vérification de l'identifiant du système de fichiers :

Si (sb.s_magic! = EXT2_SUPER_MAGIC) (

Printf ("Type de système de fichiers inconnu!");

Sortie (-1);

La valeur EXT2_SUPER_MAGIC est définie dans le fichier d'en-tête.

Nous affichons des informations sur le système de fichiers, qui se trouvent dans le superbloc :

printf ("Informations sur le superbloc -----------");

Printf ("Inodes count -% u", sb.s_inodes_count);

Printf ("Nombre de blocs -% u", sb.s_blocks_count);

Printf ("Taille de bloc -% u", 1024<< sb.s_log_block_size);

Printf ("Premier inode -% d", sb.s_first_ino);

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

Printf ("Taille de l'inode -% d", sb.s_inode_size);

Printf ("Inodes par groupe -% u", sb.s_inodes_per_group);

Printf ("Blosks par groupe -% u", sb.s_blocks_per_group);

Printf ("Premier bloc de données -% u", sb.s_first_data_block);

Revenir;

Fonction de lecture de la table de descripteur de groupe :

void read_gdt ()

Nous calculons la taille de bloc du système de fichiers :

BLKSIZE = 1024<< sb.s_log_block_size

La table de descripteur de groupe se trouve dans le bloc suivant immédiatement le premier bloc de données (après le superbloc).

Nous lisons le tableau :

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

Perror ("lcherche");

Sortie (-1);

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

Perreur ("lire");

Sortie (-1);

Revenir;

Fonction pour récupérer le contenu d'un inode par son numéro :

void get_inode (int inode_num, struct ext2_inode * dans)

Les paramètres d'entrée de la fonction sont le numéro d'inode et la structure struct ext2_inode.

Struct ext2_group_desc gd;

groupe U64, indice, pos;

On calcule le numéro du groupe de blocs contenant l'inode avec le numéro ordinal inode_num :

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

De la table de descripteur de groupe, extrayez le groupe de descripteur de groupe et copiez-le dans la structure struct ext2_group_desc gd :

Memset ((void *) & gd, 0, sizeof (gd));

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

Nous calculons la position de l'inode avec l'inode_num ordinal dans la table des inodes du groupe group et lisons cet inode dans la struct ext2_inode :

index = (inode_num - 1)% sb.s_inodes_per_group ;

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

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

Revenir;

Fonction de lecture de bloc de données :

void read_iblock (struct ext2_inode * in, int blk_num)

U64 pos;

Les paramètres d'entrée de la fonction sont la structure de l'inode et le numéro de bloc (c'est-à-dire le numéro de la séquence de blocs d'adresse situés dans l'inode).

Nous calculons le décalage par rapport au bloc d'informations sur la partition et lisons ce bloc dans le buff global :

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

Pread64 (indev, buff, BLKSIZE, pos);

Revenir;

Fonction pour récupérer le contenu du répertoire racine :

void get_root_dentry ()

Struct ext2_inode dans ;

Le numéro d'inode du répertoire racine est connu, nous obtenons donc le contenu de l'inode du répertoire racine et lisons son contenu dans le tampon buff :

get_inode (EXT2_ROOT_INO, & dans);

Read_iblock (& ​​dans, 0);

Le tampon buff contiendra le contenu du répertoire racine.

Revenir;

Fonction pour obtenir le numéro d'inode par nom de fichier :

int get_i_num (car * nom)

Les paramètres d'entrée de la fonction sont le nom du fichier. La valeur de retour est l'ordinal d'inode du fichier.

Int i = 0, rec_len = 0 ;

Struct ext2_dir_entry_2 dent ;

Le tampon buff contient un tableau d'entrées de répertoire. Pour déterminer le numéro de série de l'inode d'un fichier, vous devez trouver une entrée dans ce tableau avec le nom de ce fichier :

Pour (; je< 700; i++) {

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

Si (! Memcmp (dent.name, name, dent.name_len)) pause ;

Rec_len + = dent.rec_len;

Renvoie dent.inode;

Décrivons maintenant la fonction principale :

int main ()

Variables et structures :

struct ext2_inode dans ;

// chemin absolu du fichier

Unsigned char * full_path = "/home/test.file" ;

Char buff1 non signé ;

Int statique i = 1 ;

Int n, i_num, outf, type ;

Le premier caractère d'un chemin d'accès absolu doit être une barre oblique (/). Vérifiez-le:

Si (chemin_complet! = "/") (

Perreur ("barre oblique");

Sortie (-1);

Ouvrez le fichier de l'appareil, lisez le superbloc et la table des descripteurs de groupe :

Indev = ouvert (PART_NAME, O_RDONLY);

Si (indev< 0) {

Perreur ("ouvert");

Sortie (-1);

Read_sb ();

Read_gdt ();

On obtient le contenu du répertoire racine :

get_root_dentry ();

Maintenant, le tampon de buff contient toutes les entrées du répertoire racine (vous pouvez les enregistrer dans un fichier séparé si vous le souhaitez). Maintenant que nous avons les entrées du répertoire racine, nous pouvons accéder au contenu de test.file en utilisant l'algorithme de lecture de fichier ci-dessus. Pour cela, nous organiserons un cycle. Dans le corps de la boucle, nous analyserons le chemin d'accès absolu du fichier, en mettant en évidence ses éléments - les sous-répertoires (nous n'en avons qu'un, home) et le nom du fichier souhaité (test.file). Pour chaque élément, déterminez le numéro d'inode ordinal, lisez cet inode puis récupérez le contenu du bloc zéro (à partir de la séquence de blocs d'adresses situés dans l'inode) :

tandis que (1) (

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

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

Buff1 [n] = chemin_complet [i] ;

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

je ++;

Casser;

buff1 [n] = " ?";

Pour chaque élément du chemin absolu du fichier, nous déterminons le numéro de séquence de l'inode, lisons cet inode en mémoire puis récupérons le contenu du bloc zéro :

I_num = get_i_num (buff1) ;

Get_inode (i_num, & in);

Read_iblock (& ​​dans, 0);

Affichez les informations sur le fichier (nom, numéro d'inode, taille du fichier et son type) :

Printf ("Numéro d'inode -% u", i_num);

Printf ("Nom de fichier -% s", buff1) ;

Printf ("Taille du fichier -% u", in.i_size);

Le type de fichier est déterminé par les quatre bits les plus significatifs du champ i_mode de la structure ext2_inode :

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

Printf ("Tapez -% d", tapez);

Commutateur (type) (

Cas (0x04) :

Printf ("(répertoire)");

Casser;

Cas (0x08) :

Printf ("(fichier normal)");

Casser;

Cas (0x06) :

Printf ("(bloquer le fichier de périphérique)");

Casser;

Cas (0x02) :

Printf ("(fichier de périphérique de caractère)");

Casser;

Défaut:

Printf ("(type inconnu)");

Casser;

Vérification du type de fichier. S'il s'agit d'un fichier normal, nous brisons la boucle :

Si (tapez & 0x08) (

Le tampon de buff contiendra les informations lues à partir des blocs d'informations du fichier /home/test.file. Écrivons ces informations dans un fichier :

Outf = ouvert ("out", O_CREAT | O_RDWR, 0600);

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

Fermer (outf);

Casser;

Nous partons:

Fermer (indev) ;

Renvoie 0 ;

Ceci conclut la discussion sur la structure logique du système de fichiers ext2.



Vous avez aimé l'article ? Partagez-le