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
Branches
No related tags found
No related merge requests found
---
author: Florent Gluck - Florent.Gluck@hesge.ch
# Structure sur disque
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é
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:
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 ?
[//]: # ----------------------------------------------------------------
--
## Exemple de structure simple d'un FS
\small
Soit un FS constitué de 64 blocs
\vspace{.2cm}
\centering
![](images/simple_fs1.png){ width=100% }
![](images/simple_fs1.png)
--
[//]: # ----------------------------------------------------------------
## 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
\vspace{.2cm}
![](images/simple_fs2.png)
\centering
![](images/simple_fs2.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## 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)
\vspace{.2cm}
![](images/simple_fs3.png)
\centering
![](images/simple_fs3.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## 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
- Appelé **bitmap de blocs**
- Contient autant de bits qu'il y a de blocs de données
\centering
![](images/simple_fs4.png){ width=100% }
</div>
[//]: # ----------------------------------------------------------------
## Exemple de bitmap pour les blocs de données
![](images/simple_fs4.png)
--
### Exemple de bitmap pour les blocs de données
\small
- Soit 3 blocs de données utilisés : 2, 3 et 6
- Bitmap contient : 0,0,1,1,0,0,1,0,0,...
\centering
![](images/simple_fs5.png){ width=100% }
![](images/simple_fs5.png)
--
[//]: # ----------------------------------------------------------------
## Allocation des blocs de données
- Un bitmap pour allouer les blocs n'est qu'un exemple de structure d'allocation
- 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
[//]: # ----------------------------------------------------------------
## Association blocs de données $\leftrightarrow$ fichiers
--
### Association blocs de données `$\leftrightarrow$` fichiers
\small
- C'est la fonction principale des **inodes**
- Les inodes contiennent également les méta-données des fichiers
\centering
![](images/simple_fs6.png){ width=100% }
[//]: # ----------------------------------------------------------------
![](images/simple_fs6.png)
--
## Inodes
- 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
- appelé la **table d'inodes**
- Le inodes sont stockés de manière **contigüe** au début du FS dans la **table d'inodes**
- 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
- 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
- combien d'inodes par bloc ?
- combien d'inodes par bloc ? \
`$4096$ bytes / $128$ bytes $= 32$ inodes par bloc` <!-- .element class="fragment" -->
--
[//]: # ----------------------------------------------------------------
## Table d'inodes
\small
Exemple d'une table d'inodes utilisant 2 blocs
- Taille de bloc : 2 KB
- 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
- Chaque fichier est associé **exactement** à 1 inode
......@@ -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
- Le n° d'inode d'un fichier supprimé est réutilisé par le FS
[//]: # ----------------------------------------------------------------
--
## 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
\small
<div style="font-size: 0.7em">
Structure typique, mais qui peut varier en fonction du FS :
\scriptsize
**Champ** **Description**
-------------- -----------------------------
`type` \textcolor{myblue}{Fichier}, \textcolor{myorange}{répertoire}, device, lien, etc.
`uid` UID du propriétaire
`gid` GID du propriétaire
`rwx` Permissions (droits d'accès)
`size` Taille en bytes
`time` Date du dernier accès
`n_links` Nombre de liens/chemins d'accès vers l'inode
`direct[N]` Pointeurs directs vers les blocs du contenu du
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}
Champ | Description
------------ | -----------------------------
`type` | **Fichier**, **répertoire**, device, lien, etc.
`uid` | UID du propriétaire
`gid` | GID du propriétaire
`rwx` | Permissions (droits d'accès)
`size` | Taille en bytes
`time` | Date du dernier accès
`n_links` | Nombre de liens/chemins d'accès vers l'inode
`direct[N]` | Pointeurs directs vers les blocs du contenu du 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**
Une valeur de 0 dans les n° indique une entrée non-utilisée
[//]: # ----------------------------------------------------------------
</div>
--
## 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
\vspace{.3cm}
![](images/multi_indexed_alloc.png) <!-- .element width="70%" -->
\centering
![](images/multi_indexed_alloc.png){ width=90% }
--
[//]: # ----------------------------------------------------------------
## 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
- des données d'image si c'est un fichier png
- des données audio si c'est un fichier flac
- 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
- Une entrée de répertoire associe simplement un nom à un inode
- Structure d'une entrée de répertoire (`dir_entry`) :
**Champ** **Description**
-------------- -----------------------------
`inode` numéro d'inode du fichier
`name` nom associé à cet inode (fichier)
Champ | Description
------------- | -----------------------------
`inode` | numéro d'inode du fichier
`name` | nom associé à cet inode (fichier)
<br>
<fieldset class="warning">
\vspace{.3cm}
**\textcolor{myred}{Un fichier n'est donc pas caractérisé par son nom, mais par son inode !}**
Un fichier n'est donc pas caractérisé par son nom, mais par son inode !
</fieldset>
--
[//]: # ----------------------------------------------------------------
## Contenu d'un répertoire
\small
- Le contenu d'un fichier de type **\textcolor{myorange}{répertoire}** contient des entrées de répertoires
- Le contenu d'un fichier de type **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 : `/`
\vspace{.2cm}
![](images/dir_content.png) <!-- .element width="80%" -->
\centering
![](images/dir_content.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## Liens symboliques
\small
- 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
- 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
- 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
- Un lien symbolique peut pointer vers un fichier ou un répertoire
- 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
- 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
- En Anglais : *hard links*
......@@ -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
- `ln` permet de créer un lien dur
- 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
- 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)
- \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 !}
- 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:red" --> Un fichier (inode) n'est **réellement supprimé** que lorsque le dernier *dir_entry* (lien dur) pointant dessus est supprimée !
- <!-- .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)
[//]: # ----------------------------------------------------------------
--
## Allocation des inodes
\small
- Similairement à l'allocation des blocs de données, on utilise un bitmap
- D'autres structures sont possibles : listes, arbres, etc.
\centering
![](images/simple_fs7.png){ width=100% }
![](images/simple_fs7.png)
--
[//]: # ----------------------------------------------------------------
## Superblock
\small
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.
\centering
![](images/simple_fs8.png){ width=100% }
![](images/simple_fs8.png)
--
[//]: # ----------------------------------------------------------------
## Combien d'inodes ?
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
- `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éé
- Ensuite, arrondi au prochain multiple de la taille d'un inode (32 bytes)
- Exemple :
- 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)
- `mke2fs` se base sur un paramètre nommée \textcolor{myblue}{\texttt{bytes-per-inode}}
- Indique de créér un inode pour chaque \textcolor{myblue}{\texttt{bytes-per-inode}} bytes d'espace disque
- `mke2fs` se base sur un paramètre nommée *bytes-per-inode*
- Indique de créér un inode pour chaque *bytes-per-inode* bytes d'espace disque
- Exemple :
- soit un disque de 64 MB et \textcolor{myblue}{\texttt{bytes-per-inode}} = 4096\
$\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)
- soit un disque de 64 MB et *bytes-per-inode* = 4096\
`$\rightarrow$ inodes = 64*1024*1024/4096 = 16384`
# Ressources
- [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
\ No newline at end of file
- `mkfs.minix` [source code](https://github.com/util-linux/util-linux/blob/master/disk-utils/mkfs.minix.c)
- [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 @@
<section>
<h1>Systèmes de fichiers</h1>
<p>Guillaume Chanel</p>
<p>Remerciements à Florent Glück</p>
<p>Remerciements à Florent Glück et Mickaël Hoerdt</p>
</section>
</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