Skip to content
Snippets Groups Projects
Commit e91eac4b authored by Guillaume Chanel's avatar Guillaume Chanel
Browse files

Add part3 on disk structure

parent 95634ada
No related branches found
No related tags found
No related merge requests found
--- # Structure sur disque
author: Florent Gluck - Florent.Gluck@hesge.ch
title: Systèmes de fichiers - Structure sur disque --
date: \vspace{.5cm} \footnotesize \today
institute: \vspace{0.5cm} \tiny \textsuperscript{*}Remerciements à Mickaël Hoerdt
pandoc-latex-fontsize:
- classes: [tiny]
size: tiny
- classes: [verysmall]
size: scriptsize
- classes: [small]
size: footnotesize
- classes: [huge, important]
size: huge
---
[//]: # ----------------------------------------------------------------
## Concepts clés d'un système de fichiers stocké ## Concepts clés d'un système de fichiers stocké
1. Quelles sont les structures de données stockées sur le disque qui organisent les méta-données et le contenu des fichiers ? 1. Quelles sont les structures de données stockées sur le disque qui organisent les méta-données et le contenu des fichiers ?
...@@ -28,107 +11,100 @@ pandoc-latex-fontsize: ...@@ -28,107 +11,100 @@ pandoc-latex-fontsize:
1. Quelles sont les interfaces d'accès au système de fichiers (FS) ? 1. Quelles sont les interfaces d'accès au système de fichiers (FS) ?
- comment est-ce que le système associe p.ex. `open()`, `read()` et `write()` aux points 1 et 2 ? - comment est-ce que le système associe p.ex. `open()`, `read()` et `write()` aux points 1 et 2 ?
[//]: # ---------------------------------------------------------------- --
## Exemple de structure simple d'un FS ## Exemple de structure simple d'un FS
\small
Soit un FS constitué de 64 blocs Soit un FS constitué de 64 blocs
\vspace{.2cm} ![](images/simple_fs1.png)
\centering
![](images/simple_fs1.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## Exemple de structure simple d'un FS ## Exemple de structure simple d'un FS
\small
Le bloc 0 est réservé : contient potentiellement le secteur de boot et la table de partitions Le bloc 0 est réservé : contient potentiellement le secteur de boot et la table de partitions
\vspace{.2cm} ![](images/simple_fs2.png)
\centering --
![](images/simple_fs2.png){ width=100% }
[//]: # ----------------------------------------------------------------
## Blocs de données ## Blocs de données
\small
Pour stocker des données il est préférable que la majorité des blocs soient réservés pour cela (blocs de données) Pour stocker des données il est préférable que la majorité des blocs soient réservés pour cela (blocs de données)
\vspace{.2cm} ![](images/simple_fs3.png)
\centering --
![](images/simple_fs3.png){ width=100% }
[//]: # ----------------------------------------------------------------
## Allocation des blocs de données ## Allocation des blocs de données
\footnotesize <div style="font-size:0.8em">
- Un tableau de bits indique quels blocs de données sont disponibles/utilisés - Un tableau de bits indique quels blocs de données sont disponibles/utilisés
- Appelé **bitmap de blocs** - Appelé **bitmap de blocs**
- Contient autant de bits qu'il y a de blocs de données - Contient autant de bits qu'il y a de blocs de données
\centering </div>
![](images/simple_fs4.png){ width=100% }
[//]: # ---------------------------------------------------------------- ![](images/simple_fs4.png)
## Exemple de bitmap pour les blocs de données
--
### Exemple de bitmap pour les blocs de données
\small
- Soit 3 blocs de données utilisés : 2, 3 et 6 - Soit 3 blocs de données utilisés : 2, 3 et 6
- Bitmap contient : 0,0,1,1,0,0,1,0,0,... - Bitmap contient : 0,0,1,1,0,0,1,0,0,...
\centering ![](images/simple_fs5.png)
![](images/simple_fs5.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## Allocation des blocs de données ## Allocation des blocs de données
- Un bitmap pour allouer les blocs n'est qu'un exemple de structure d'allocation - Un bitmap pour allouer les blocs n'est qu'un exemple de structure d'allocation
- D'autres structures sont possibles : listes, arbres, etc. - D'autres structures sont possibles : listes, arbres, etc.
- On peut donc allouer/libérer des blocs de données, mais on veut aussi associer des blocs à un/des fichiers - On peut donc allouer/libérer des blocs de données, mais on veut aussi associer des blocs à un/des fichiers
[//]: # ---------------------------------------------------------------- --
## Association blocs de données $\leftrightarrow$ fichiers
### Association blocs de données `$\leftrightarrow$` fichiers
\small
- C'est la fonction principale des **inodes** - C'est la fonction principale des **inodes**
- Les inodes contiennent également les méta-données des fichiers - Les inodes contiennent également les méta-données des fichiers
\centering
![](images/simple_fs6.png){ width=100% }
[//]: # ---------------------------------------------------------------- ![](images/simple_fs6.png)
--
## Inodes ## Inodes
- La taille d'un inode est fixe pour un FS donné - La taille d'un inode est fixe pour un FS donné
- Le inodes sont stockés de manière **contigüe** au début du FS - Le inodes sont stockés de manière **contigüe** au début du FS dans la **table d'inodes**
- appelé la **table d'inodes**
- Selon le FS, la taille varie (typiquement divise la taille d'un secteur, 512 bytes) - Selon le FS, la taille varie (typiquement divise la taille d'un secteur, 512 bytes)
- La taille d'un inode est définie à la création du FS - La taille d'un inode est définie à la création du FS
- Un petit FS (= faible nombre de blocs) aura typiquement une taille d'inode inférieure à un grand FS - Un petit FS (= faible nombre de blocs) aura typiquement une taille d'inode inférieure à un grand FS
- Soit des blocs de 4 KB et une taille d'inode de 128 bytes - Soit des blocs de 4 KB et une taille d'inode de 128 bytes
- combien d'inodes par bloc ? - combien d'inodes par bloc ? \
`$4096$ bytes / $128$ bytes $= 32$ inodes par bloc` <!-- .element class="fragment" -->
--
[//]: # ----------------------------------------------------------------
## Table d'inodes ## Table d'inodes
\small
Exemple d'une table d'inodes utilisant 2 blocs Exemple d'une table d'inodes utilisant 2 blocs
- Taille de bloc : 2 KB - Taille de bloc : 2 KB
- Taille d'inode : 128 bytes - Taille d'inode : 128 bytes
**\textcolor{myred}{Les inodes sont indexés à 1}** **Les inodes sont indexés à 1**
\vspace{.3cm} ![](images/inodes_table.png) <!-- .element width="70%" -->
\centering --
![](images/inodes_table.png){ width=75% }
[//]: # ----------------------------------------------------------------
## Relation fichier $\leftrightarrow$ inode ## Relation fichier $\leftrightarrow$ inode
- Chaque fichier est associé **exactement** à 1 inode - Chaque fichier est associé **exactement** à 1 inode
...@@ -136,117 +112,117 @@ Exemple d'une table d'inodes utilisant 2 blocs ...@@ -136,117 +112,117 @@ Exemple d'une table d'inodes utilisant 2 blocs
- Des FS différents peuvent utiliser les mêmes n° d'inodes - Des FS différents peuvent utiliser les mêmes n° d'inodes
- Le n° d'inode d'un fichier supprimé est réutilisé par le FS - Le n° d'inode d'un fichier supprimé est réutilisé par le FS
[//]: # ---------------------------------------------------------------- --
## Historique du nom "inode" ## Historique du nom "inode"
"In truth, I don't know either. It was just a term that we started to use. ‘Index’ is my best guess, because of the
slightly unusual file system structure that stored the access information of files as a flat array on the disk..."
\vspace{.5cm} > In truth, I don't know either. It was just a term that we started to use. ‘Index’ is my best guess, because of the slightly unusual file system structure that stored the access information of files as a flat array on the disk...
Dennis Ritchie[^1] *Dennis Ritchie*<sup>1</sup>
[^1]: \footnotesize Un des deux principaux créateurs d'UNIX, l'autre étant Ken Thompson <small>1: Un des deux principaux créateurs d'UNIX, l'autre étant Ken Thompson</small>
--
[//]: # ----------------------------------------------------------------
## Structure d'un inode ## Structure d'un inode
\small <div style="font-size: 0.7em">
Structure typique, mais qui peut varier en fonction du FS : Structure typique, mais qui peut varier en fonction du FS :
\scriptsize Champ | Description
------------ | -----------------------------
**Champ** **Description** `type` | **Fichier**, **répertoire**, device, lien, etc.
-------------- ----------------------------- `uid` | UID du propriétaire
`type` \textcolor{myblue}{Fichier}, \textcolor{myorange}{répertoire}, device, lien, etc. `gid` | GID du propriétaire
`uid` UID du propriétaire `rwx` | Permissions (droits d'accès)
`gid` GID du propriétaire `size` | Taille en bytes
`rwx` Permissions (droits d'accès) `time` | Date du dernier accès
`size` Taille en bytes `n_links` | Nombre de liens/chemins d'accès vers l'inode
`time` Date du dernier accès `direct[N]` | Pointeurs directs vers les blocs du contenu du fichier, **dans l'ordre**
`n_links` Nombre de liens/chemins d'accès vers l'inode `indir[M]` | Pointeurs indirects vers les blocs du contenu du fichier, **dans l'ordre**
`direct[N]` Pointeurs directs vers les blocs du contenu du `dbl_indir[P]`| Pointeurs doublement indirects vers les blocs du contenu du fichier, **dans l'ordre**
fichier, **dans l'ordre**
`indir[M]` Pointeurs indirects vers les blocs du contenu
du fichier, **dans l'ordre**
`dbl_indir[P]` Pointeurs doublement indirects vers les blocs
du contenu du fichier, **dans l'ordre**
\vspace{-.3cm}
Une valeur de 0 dans les n° indique une entrée non-utilisée Une valeur de 0 dans les n° indique une entrée non-utilisée
[//]: # ---------------------------------------------------------------- </div>
--
## Allocation des blocs de données dans un inode ## Allocation des blocs de données dans un inode
\small
Exemple avec : 10 pointeurs directs, 1 pointeur indirect, 1 pointeur doublement indirect et 1 pointeur triplement indirect Exemple avec : 10 pointeurs directs, 1 pointeur indirect, 1 pointeur doublement indirect et 1 pointeur triplement indirect
\vspace{.3cm} ![](images/multi_indexed_alloc.png) <!-- .element width="70%" -->
\centering --
![](images/multi_indexed_alloc.png){ width=90% }
[//]: # ----------------------------------------------------------------
## Contenu des fichiers ## Contenu des fichiers
- Un fichier de **type \textcolor{myblue}{fichier}** est un fichier habituel dont les données (contenu) peuvent être : - Un **fichier régulier** est un fichier habituel dont les données (contenu) peuvent être :
- du texte si c'est un fichier texte - du texte si c'est un fichier texte
- des données d'image si c'est un fichier png - des données d'image si c'est un fichier png
- des données audio si c'est un fichier flac - des données audio si c'est un fichier flac
- etc. - etc.
- Un fichier de **type \textcolor{myorange}{répertoire}** (*directory*) est un fichier qui contient des entrées de répertoires (*directory entries*) - Un fichier de **type répertoire** (*directory*) est un fichier qui contient des entrées de répertoires (*directory entries*)
--
[//]: # ----------------------------------------------------------------
## Entrée de répertoire ## Entrée de répertoire
- Une entrée de répertoire associe simplement un nom à un inode - Une entrée de répertoire associe simplement un nom à un inode
- Structure d'une entrée de répertoire (`dir_entry`) : - Structure d'une entrée de répertoire (`dir_entry`) :
**Champ** **Description** Champ | Description
-------------- ----------------------------- ------------- | -----------------------------
`inode` numéro d'inode du fichier `inode` | numéro d'inode du fichier
`name` nom associé à cet inode (fichier) `name` | nom associé à cet inode (fichier)
<br>
<fieldset class="warning">
\vspace{.3cm} Un fichier n'est donc pas caractérisé par son nom, mais par son inode !
**\textcolor{myred}{Un fichier n'est donc pas caractérisé par son nom, mais par son inode !}**
</fieldset>
--
[//]: # ----------------------------------------------------------------
## Contenu d'un répertoire ## Contenu d'un répertoire
\small - Le contenu d'un fichier de type **répertoire** contient des entrées de répertoires
- Le contenu d'un fichier de type **\textcolor{myorange}{répertoire}** contient des entrées de répertoires
- Par convention, dans la plupart des FS, l'inode n° 1 est le répertoire racine du FS : `/` - Par convention, dans la plupart des FS, l'inode n° 1 est le répertoire racine du FS : `/`
\vspace{.2cm} ![](images/dir_content.png) <!-- .element width="80%" -->
\centering --
![](images/dir_content.png){ width=100% }
[//]: # ----------------------------------------------------------------
## Liens symboliques ## Liens symboliques
\small
- En Anglais : *soft links* ou *symbolic links* - En Anglais : *soft links* ou *symbolic links*
- Un fichier de type **lien symbolique** a comme contenu (1 seul bloc de donnée) une chaîne de caractères représentant le chemin de destination du lien - Un fichier de type **lien symbolique** a comme contenu (1 seul bloc de donnée) une chaîne de caractères représentant le chemin de destination du lien
- Lors de l'analyse d'un chemin d'accès, si le système rencontre un lien symbolique, alors son contenu est concaténé avec le chemin déjà parcouru - Lors de l'analyse d'un chemin d'accès, si le système rencontre un lien symbolique, alors son contenu est concaténé avec le chemin déjà parcouru
- `ln -s` permet de créer un lien symbolique - `ln -s` permet de créer un lien symbolique
- Exemple : créé le lien symbolique `pipo.c` vers `code/src/prog.c` : - Exemple : créé le lien symbolique `pipo.c` vers `code/src/prog.c` :
```{.shell .verysmall}
ln -s code/src/prog.c pipo.c ```bash
$ ln -s code/src/prog.c pipo.c
``` ```
[//]: # ---------------------------------------------------------------- --
## Liens symboliques : considérations importantes ## Liens symboliques : considérations importantes
- Un lien symbolique peut pointer vers un fichier ou un répertoire - Un lien symbolique peut pointer vers un fichier ou un répertoire
- Un lien symbolique peut traverser les FS - Un lien symbolique peut traverser les FS
- il est possible de créer un lien symbolique X sur le FS1 qui pointe vers le fichier Y sur le FS2 - il est possible de créer un lien symbolique X sur le FS1 qui pointe vers le fichier Y sur le FS2
- Si la destination d'un lien symbolique est déplacée ou supprimée, le lien symbolique devient alors invalide\ ! - Si la destination d'un lien symbolique est déplacée ou supprimée, le lien symbolique devient alors invalide !
--
[//]: # ----------------------------------------------------------------
## Liens durs ## Liens durs
- En Anglais : *hard links* - En Anglais : *hard links*
...@@ -254,51 +230,55 @@ Exemple avec : 10 pointeurs directs, 1 pointeur indirect, 1 pointeur doublement ...@@ -254,51 +230,55 @@ Exemple avec : 10 pointeurs directs, 1 pointeur indirect, 1 pointeur doublement
- En d'autres termes, il s'agit simplement d'un nom supplémentaire pointant vers le même inode - En d'autres termes, il s'agit simplement d'un nom supplémentaire pointant vers le même inode
- `ln` permet de créer un lien dur - `ln` permet de créer un lien dur
- Exemple : créé le lien dur `pipo.c` vers `code/src/prog.c` : - Exemple : créé le lien dur `pipo.c` vers `code/src/prog.c` :
```{.shell .verysmall}
ln code/src/prog.c pipo.c ```.bash
$ ln code/src/prog.c pipo.c
``` ```
[//]: # ---------------------------------------------------------------- --
## Liens durs : considérations importantes ## Liens durs : considérations importantes
- Un lien dur ne peut pas pointer vers un répertoire - Un lien dur ne peut pas pointer vers un répertoire
- Un lien dur ne peut pas traverser les FS car un numéro d'inode est seulement unique à un FS\ ! - Un lien dur ne peut pas traverser les FS car un numéro d'inode est seulement unique à un FS !
- La valeur `Links` affichée par la commande `stat` indique le nombre de `dir_entry` pointant sur le fichier (inode) - La valeur `Links` affichée par la commande `stat` indique le nombre de `dir_entry` pointant sur le fichier (inode)
- \textcolor{myred}{Un fichier (inode) n'est \textbf{réellement supprimé} que lorsque le dernier \texttt{dir\_entry} (lien dur) pointant dessus est supprimée !} - <!-- .element style="color:red" --> Un fichier (inode) n'est **réellement supprimé** que lorsque le dernier *dir_entry* (lien dur) pointant dessus est supprimée !
- aussi, si un descripteur de fichier ouvert référence ce fichier (inode), alors le fichier ne sera supprimé que lorsque le dernier descripteur sera fermé - <!-- .element style="color:black"--> aussi, si un descripteur de fichier ouvert référence ce fichier (inode), alors le fichier ne sera supprimé que lorsque le dernier descripteur sera fermé
- Les liens durs (ou `dir_entry`) sont donc simplement des références vers un inode (fichier) - Les liens durs (ou `dir_entry`) sont donc simplement des références vers un inode (fichier)
[//]: # ---------------------------------------------------------------- --
## Allocation des inodes ## Allocation des inodes
\small
- Similairement à l'allocation des blocs de données, on utilise un bitmap - Similairement à l'allocation des blocs de données, on utilise un bitmap
- D'autres structures sont possibles : listes, arbres, etc. - D'autres structures sont possibles : listes, arbres, etc.
\centering ![](images/simple_fs7.png)
![](images/simple_fs7.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## Superblock ## Superblock
\small
Le superblock stocke des informations globales sur le FS : Le superblock stocke des informations globales sur le FS :
- Signature du FS, nombre d'inodes total, nombre de blocs total, taille du bitmap des inodes, etc. - Signature du FS, nombre d'inodes total, nombre de blocs total, taille du bitmap des inodes, etc.
\centering ![](images/simple_fs8.png)
![](images/simple_fs8.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## Combien d'inodes ? ## Combien d'inodes ?
Le nombre d'inodes détermine le nombre maximum de fichiers pouvant être créés sur un FS Le nombre d'inodes détermine le nombre maximum de fichiers pouvant être créés sur un FS
\vspace{.5cm} <fieldset class="warning">
Combien d'inodes faut-il réserver pour un FS d'une taille donnée ?
**\textcolor{myred}{Combien d'inodes faut-il réserver pour un FS d'une taille donnée ?}** </fieldset>
--
[//]: # ----------------------------------------------------------------
## Combien d'inodes : mkfs.minix ## Combien d'inodes : mkfs.minix
- `mkfs.minix` se base sur la taille du disque (`DS`) ; ci-dessous `fs_blocks` = nombre total de blocs dans le FS - `mkfs.minix` se base sur la taille du disque (`DS`) ; ci-dessous `fs_blocks` = nombre total de blocs dans le FS
...@@ -308,37 +288,14 @@ Le nombre d'inodes détermine le nombre maximum de fichiers pouvant être créé ...@@ -308,37 +288,14 @@ Le nombre d'inodes détermine le nombre maximum de fichiers pouvant être créé
- Ensuite, arrondi au prochain multiple de la taille d'un inode (32 bytes) - Ensuite, arrondi au prochain multiple de la taille d'un inode (32 bytes)
- Exemple : - Exemple :
- soit un disque de 64 MB et des blocs de 1 KB\ - soit un disque de 64 MB et des blocs de 1 KB\
$\rightarrow$ `inodes = (64*1024/3 + 32) & 0xFFFFFFE0 = 21856` `$\rightarrow$ inodes = (64*1024/3 + 32) & 0xFFFFFFE0 = 21856`
--
[//]: # ----------------------------------------------------------------
## Combien d'inodes : mke2fs (ext2/3/4) ## Combien d'inodes : mke2fs (ext2/3/4)
- `mke2fs` se base sur un paramètre nommée \textcolor{myblue}{\texttt{bytes-per-inode}} - `mke2fs` se base sur un paramètre nommée *bytes-per-inode*
- Indique de créér un inode pour chaque \textcolor{myblue}{\texttt{bytes-per-inode}} bytes d'espace disque - Indique de créér un inode pour chaque *bytes-per-inode* bytes d'espace disque
- Exemple : - Exemple :
- soit un disque de 64 MB et \textcolor{myblue}{\texttt{bytes-per-inode}} = 4096\ - soit un disque de 64 MB et *bytes-per-inode* = 4096\
$\rightarrow$ `inodes = 64*1024*1024/4096 = 16384` `$\rightarrow$ inodes = 64*1024*1024/4096 = 16384`
[//]: # ----------------------------------------------------------------
## Ressources
\small
- Operating Systems: Three Easy Pieces, Remzi H. and Andrea C. Arpaci-Dusseau. Arpaci-Dusseau Books\
\footnotesize [\textcolor{myblue}{http://pages.cs.wisc.edu/~remzi/OSTEP/}](http://pages.cs.wisc.edu/~remzi/OSTEP/)
- livre disponible à la bibliothèque
\small
- `mkfs.minix` source code\
\footnotesize [\textcolor{myblue}{https://github.com/util-linux/util-linux/blob/master/disk-utils/mkfs.minix.c}](https://github.com/util-linux/util-linux/blob/master/disk-utils/mkfs.minix.c)
\small
- The Second Extended File System - Internal Layout\
\footnotesize [\textcolor{myblue}{https://www.nongnu.org/ext2-doc/ext2.html}](https://www.nongnu.org/ext2-doc/ext2.html)
\small
- Ext4 (and Ext2/Ext3) Wiki\
\footnotesize [\textcolor{myblue}{https://ext4.wiki.kernel.org/index.php/Main\_Page}](https://ext4.wiki.kernel.org/index.php/Main_Page)
# Ressources # Ressources
- [Operating Systems: Three Easy Pieces](http://pages.cs.wisc.edu/~remzi/OSTEP/), Remzi H. and Andrea C. Arpaci-Dusseau. Arpaci-Dusseau Books - [Operating Systems: Three Easy Pieces](http://pages.cs.wisc.edu/~remzi/OSTEP/), Remzi H. and Andrea C. Arpaci-Dusseau. Arpaci-Dusseau Books
livre disponible à la bibliothèque
livre disponible à la bibliothèque - `mkfs.minix` [source code](https://github.com/util-linux/util-linux/blob/master/disk-utils/mkfs.minix.c)
\ No newline at end of file
- [The Second Extended File System - Internal Layout](https://www.nongnu.org/ext2-doc/ext2.html)
- [Ext4 (and Ext2/Ext3) Wiki](https://ext4.wiki.kernel.org/index.php/Main_Page)
\ No newline at end of file
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
<section> <section>
<h1>Systèmes de fichiers</h1> <h1>Systèmes de fichiers</h1>
<p>Guillaume Chanel</p> <p>Guillaume Chanel</p>
<p>Remerciements à Florent Glück</p> <p>Remerciements à Florent Glück et Mickaël Hoerdt</p>
</section> </section>
</section> </section>
<section data-markdown="01_Systemes_fichiers_intro.md" data-separator-vertical="^\r?\n--\r?\n$"></section> <section data-markdown="01_Systemes_fichiers_intro.md" data-separator-vertical="^\r?\n--\r?\n$"></section>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment