Maison > Article > Tutoriel système > Métadonnées de fichiers dans les systèmes Linux : explication détaillée de l'inode
Inode est une structure de données importante dans les systèmes Linux. Elle est utilisée pour stocker les métadonnées des fichiers, telles que le type de fichier, la taille, les autorisations, l'horodatage, le nombre de liens, l'emplacement du bloc de données, etc. Inode est le composant principal du système de fichiers, qui peut être utilisé pour créer, supprimer, modifier, rechercher et autres opérations sur des fichiers. Dans cet article, nous présenterons les principes et les caractéristiques des inodes, y compris la numérotation, l'allocation, la libération, la recherche, l'indexation, etc., et donnerons des exemples de leur utilisation et de leurs précautions.
Nom du fichier -> inode -> bloc de périphérique
Comprendre les inodes commence par le stockage de fichiers.
Les fichiers sont stockés sur le disque dur. La plus petite unité de stockage du disque dur est appelée « Secteur ». Chaque secteur stocke 512 octets (équivalent à 0,5 Ko).
Lorsque le système d'exploitation lit le disque dur, il ne le lit pas secteur par secteur, ce qui est trop inefficace, mais lit plusieurs secteurs en continu à la fois, c'est-à-dire qu'il lit un « bloc » à la fois. Ce « bloc » composé de plusieurs secteurs est la plus petite unité d'accès aux fichiers. La taille de « bloc » la plus courante est de 4 Ko, c'est-à-dire que huit secteurs consécutifs forment un bloc.
Les données du fichier sont stockées dans des "blocs", donc évidemment il faut aussi trouver un endroit pour stocker les méta-informations du fichier, comme le créateur du fichier, la date de création du fichier, la taille du fichier, etc. . Cette zone qui stocke les métainformations du fichier est appelée inode et sa traduction chinoise est « nœud d'index ».
inode contient des méta-informations du fichier, en particulier le contenu suivant :
* Le nombre d'octets dans le fichier
* ID utilisateur du propriétaire du fichier
* ID de groupe du fichier
* Autorisations de lecture, d'écriture et d'exécution de fichiers
* Il existe trois horodatages du fichier : ctime fait référence à l'heure à laquelle l'inode a été modifié pour la dernière fois, mtime fait référence à l'heure à laquelle le contenu du fichier a été modifié pour la dernière fois et atime fait référence à l'heure à laquelle le fichier a été ouvert pour la dernière fois.
* Nombre de liens, c'est-à-dire combien de noms de fichiers pointent vers cet inode
* L'emplacement du bloc de données du fichier
Vous pouvez utiliser la commande stat pour afficher les informations d'inode d'un certain fichier :
exemple de statistique.txt
En bref, toutes les informations sur le fichier, à l'exception du nom du fichier, sont stockées dans l'inode. Quant à la raison pour laquelle il n’y a pas de nom de fichier, vous trouverez une explication détaillée ci-dessous.
Inode consomme également de l'espace sur le disque dur, donc lorsque le disque dur est formaté, le système d'exploitation divise automatiquement le disque dur en deux zones. L'une est la zone de données, qui stocke les données du fichier ; l'autre est la zone d'inode (table d'inode), qui stocke les informations contenues dans l'inode.
La taille de chaque nœud inode est généralement de 128 octets ou 256 octets. Le nombre total de nœuds inodes est indiqué lors du formatage, généralement un inode est défini tous les 1 Ko ou tous les 2 Ko. Supposons que dans un disque dur de 1 Go, la taille de chaque nœud d'inode est de 128 octets et qu'un inode est défini pour chaque 1 Ko, la taille de la table d'inode atteindra 128 Mo, représentant 12,8 % de l'ensemble du disque dur.
Pour afficher le nombre total d'inodes et le nombre utilisé de chaque partition du disque dur, vous pouvez utiliser la commande df.
df -i
Pour afficher la taille de chaque nœud inode, vous pouvez utiliser la commande suivante :
sudo dumpe2fs -h /dev/hda | grep « Taille de l'inode »
Comme chaque fichier doit avoir un inode, il peut arriver que les inodes soient épuisés mais que le disque dur ne soit pas plein. Pour le moment, aucun nouveau fichier ne peut être créé sur le disque dur.
Chaque inode a un numéro et le système d'exploitation utilise le numéro d'inode pour identifier différents fichiers.
Cela vaut la peine de le répéter ici, les systèmes Unix/Linux n'utilisent pas de noms de fichiers en interne, mais utilisent des numéros d'inodes pour identifier les fichiers. Pour le système, le nom du fichier n'est qu'un alias ou un surnom pour le numéro d'inode pour une identification facile. En apparence, l'utilisateur ouvre le fichier par le nom du fichier. En fait, le processus au sein du système est divisé en trois étapes : premièrement, le système trouve le numéro d'inode correspondant au nom de fichier ; deuxièmement, obtient les informations d'inode via le numéro d'inode enfin, sur la base des informations d'inode, il trouve le numéro d'inode ; bloc où se trouvent les données du fichier et lit les données.
Utilisez la commande ls -i pour voir le numéro d'inode correspondant au nom du fichier :
ls -i exemple.txt
Dans les systèmes Unix/Linux, un répertoire est aussi une sorte de fichier. Ouvrir un répertoire signifie en fait ouvrir le fichier répertoire.
La structure d'un fichier répertoire est très simple, c'est une liste d'une série d'entrées de répertoire (dirent). Chaque entrée de répertoire se compose de deux parties : le nom du fichier contenu et le numéro d'inode correspondant au nom du fichier.
La commande ls répertorie uniquement tous les noms de fichiers dans les fichiers du répertoire :
ls /etc
La commandels -i répertorie tous les fichiers du répertoire, c'est-à-dire les noms de fichiers et les numéros d'inodes :
ls -i /etc
Si vous souhaitez afficher les informations détaillées du fichier, vous devez accéder au nœud inode et lire les informations en fonction du numéro d'inode. La commande ls -l répertorie des informations détaillées sur un fichier.
ls -l /etc
Généralement, les noms de fichiers et les numéros d'inode ont une relation de « correspondance biunivoque », et chaque numéro d'inode correspond à un nom de fichier. Cependant, les systèmes Unix/Linux permettent à plusieurs noms de fichiers de pointer vers le même numéro d'inode. Cela signifie que le même contenu est accessible avec des noms de fichiers différents ; la modification du contenu du fichier affectera tous les noms de fichiers ; cependant, la suppression d'un nom de fichier n'affectera pas l'accès à un autre nom de fichier ; Cette situation est appelée « lien dur ».
La commande ln peut créer des liens physiques :
Fichier source ln fichier cible
Après avoir exécuté la commande ci-dessus, les numéros d'inode du fichier source et du fichier cible sont les mêmes et pointent vers le même inode. Il y a un élément dans les informations de l'inode appelé "Nombre de liens", qui enregistre le nombre total de noms de fichiers pointant vers l'inode, et sera augmenté de 1 à ce moment-là. À l’inverse, la suppression d’un nom de fichier réduira de 1 le « nombre de liens » dans le nœud inode. Lorsque cette valeur diminue à 0, indiquant qu'aucun nom de fichier ne pointe vers cet inode, le système recyclera le numéro d'inode et sa zone de bloc correspondante.
Au fait, parlons du « nombre de liens » du fichier répertoire. Lors de la création d'un répertoire, deux entrées de répertoire sont générées par défaut : "." et ".." Le numéro d'inode du premier est le numéro d'inode du répertoire courant, qui est équivalent au « lien physique » du répertoire courant ; le numéro d'inode du second est le numéro d'inode du répertoire parent du répertoire courant, qui est équivalent au "lien dur" du répertoire parent. Par conséquent, le nombre total de "liens physiques" de tout répertoire est toujours égal à 2 plus le nombre total de ses sous-répertoires (y compris les répertoires cachés). Le 2 correspond ici aux "liens physiques" du répertoire parent et aux "liens physiques". du répertoire actuel.
En plus des liens physiques, il existe un cas particulier. Bien que les numéros d'inodes du fichier A et du fichier B soient différents, le contenu du fichier A est le chemin du fichier B. Lors de la lecture du fichier A, le système dirigera automatiquement le visiteur vers le fichier B. Par conséquent, quel que soit le fichier ouvert, le fichier B est finalement lu. A cette époque, le fichier A est appelé « lien logiciel » ou « lien symbolique » du fichier B.
Cela signifie que le fichier A dépend du fichier B pour son existence. Si le fichier B est supprimé, une erreur sera signalée lors de l'ouverture du fichier A : "Aucun fichier ou répertoire de ce type". C'est la plus grande différence entre les liens symboliques et les liens physiques : le fichier A pointe vers le nom de fichier du fichier B, et non vers le numéro d'inode du fichier B. Le "numéro de lien" d'inode du fichier B ne changera pas en conséquence.
La commandeln -s peut créer des liens symboliques.
ln -s fichier source ou répertoire fichier ou répertoire cible
En raison de la séparation du numéro d'inode et du nom de fichier, ce mécanisme conduit à certains phénomènes propres aux systèmes Unix/Linux.
1. Parfois, le nom du fichier contient des caractères spéciaux et ne peut pas être supprimé normalement. À ce stade, la suppression directe du nœud inode peut jouer le rôle de suppression du fichier.
2. Déplacer des fichiers ou renommer des fichiers modifie uniquement le nom du fichier et n'affecte pas le numéro d'inode.
3. Après avoir ouvert un fichier, le système identifiera le fichier en fonction du numéro d'inode et ne prendra plus en compte le nom du fichier. Par conséquent, d’une manière générale, le système ne peut pas apprendre le nom du fichier à partir du numéro d’inode.
Le point 3 simplifie les mises à jour logicielles et peut être mis à jour sans fermer le logiciel ni redémarrer. Parce que le système identifie les fichiers en cours d'exécution via le numéro d'inode, pas le nom du fichier. Lors de la mise à jour, la nouvelle version du fichier générera un nouvel inode avec le même nom de fichier, ce qui n'affectera pas le fichier en cours d'exécution. La prochaine fois que vous exécuterez ce logiciel, le nom du fichier pointera automatiquement vers la nouvelle version du fichier et l'inode de l'ancienne version du fichier sera recyclé.
Neuf questions pratiques
Lors de la création d'un fichier dans la partition /data d'un serveur Linux avec une faible configuration (petite mémoire et disque dur), le système indique que l'espace disque est insuffisant. J'ai utilisé la commande df -h pour vérifier l'utilisation du disque et j'ai constaté que. la partition /data n'utilise qu'elle a atteint 66% et il reste encore 12 Go d'espace restant. Il va de soi que ce problème ne se produira pas. Plus tard, j'ai utilisé df -i pour vérifier le nœud d'index (inode) de la partition /data et j'ai constaté qu'il était plein (IUsed=100%), empêchant le système de créer de nouveaux répertoires et fichiers.
Trouvez la raison :
Il existe un très grand nombre de fichiers cache de petits octets dans le répertoire /data/cache, qui n'occupent pas beaucoup de blocs, mais occupent un grand nombre d'inodes.
Solution :
1. Supprimez certains fichiers du répertoire /data/cache et libérez certains inodes dans la partition /data.
2. Utilisez une connexion logicielle pour connecter le répertoire newcache de la partition libre /opt à /data/cache, et utilisez l'inode de la partition /opt pour atténuer le problème des inodes insuffisants dans la partition /data :
ln -s /opt/newcache /data/cache
A travers cet article, nous comprenons les principes et les caractéristiques de l'inode, qui peut être utilisé pour gérer et exploiter des fichiers. Nous devons choisir un système de fichiers approprié en fonction des besoins réels et suivre certains principes de base, tels qu'éviter l'épuisement des inodes, vérifier régulièrement l'état des inodes, utiliser des liens physiques ou des liens logiciels, etc. Inode est l'un des concepts les plus fondamentaux du système Linux. Il peut extraire et encapsuler des fichiers, et peut également améliorer les performances et la fiabilité du système de fichiers. J’espère que cet article pourra vous être utile et inspirant.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!