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

WIP: add part 4 on minix

parent e91eac4b
No related branches found
No related tags found
No related merge requests found
--- # MINIX-fs
author: Florent Gluck - Florent.Gluck@hesge.ch
title: Systèmes de fichiers - MINIX-fs <!--
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
---
## TODO ## TODO
...@@ -27,7 +11,10 @@ pandoc-latex-fontsize: ...@@ -27,7 +11,10 @@ pandoc-latex-fontsize:
- "tree --inodes -p -s -a" affiche arborescence avec n°inodes, permissions+type, tailles - "tree --inodes -p -s -a" affiche arborescence avec n°inodes, permissions+type, tailles
- "-a" affiche également les fichiers cachés - "-a" affiche également les fichiers cachés
[//]: # ---------------------------------------------------------------- -->
--
## Introduction à MINIX-fs ## Introduction à MINIX-fs
- MINIX-fs est le système de fichiers (FS) natif du système d'exploitation MINIX écrit par Andrew S. Tanenbaum en 1987 - MINIX-fs est le système de fichiers (FS) natif du système d'exploitation MINIX écrit par Andrew S. Tanenbaum en 1987
...@@ -35,7 +22,8 @@ pandoc-latex-fontsize: ...@@ -35,7 +22,8 @@ pandoc-latex-fontsize:
- de répliquer la structure du FS de UNIX, mais sans les fonctionnalités avancées et complexes de ce dernier - de répliquer la structure du FS de UNIX, mais sans les fonctionnalités avancées et complexes de ce dernier
- de fournir une aide à l'enseignement des systèmes de fichiers et des OS - de fournir une aide à l'enseignement des systèmes de fichiers et des OS
[//]: # ---------------------------------------------------------------- --
## Linux et MINIX-fs ## Linux et MINIX-fs
- Les premières versions du noyau Linux (1992) utilisaient MINIX-fs comme FS - Les premières versions du noyau Linux (1992) utilisaient MINIX-fs comme FS
...@@ -46,7 +34,8 @@ pandoc-latex-fontsize: ...@@ -46,7 +34,8 @@ pandoc-latex-fontsize:
- 2006 : la version instable de ext4 est publiée - 2006 : la version instable de ext4 est publiée
- 2008 : la version stable de ext4 est publiée - 2008 : la version stable de ext4 est publiée
[//]: # ---------------------------------------------------------------- --
## Versions de MINIX-fs ## Versions de MINIX-fs
- Il existe 3 versions de MINIX-fs : v1, v2 et v3 - Il existe 3 versions de MINIX-fs : v1, v2 et v3
...@@ -55,45 +44,40 @@ pandoc-latex-fontsize: ...@@ -55,45 +44,40 @@ pandoc-latex-fontsize:
- variante avec noms de fichiers de 14 caractères max (superblock magic value `0x137F`) - variante avec noms de fichiers de 14 caractères max (superblock magic value `0x137F`)
- variante avec noms de fichiers de 30 caractères max (superblock magic value `0x138F`) - variante avec noms de fichiers de 30 caractères max (superblock magic value `0x138F`)
[//]: # ---------------------------------------------------------------- --
## Comparaison MINIX-fs et ext2/3/4 ## Comparaison MINIX-fs et ext2/3/4
Valeurs max pour les caractéristiques principales des FS : Valeurs max pour les caractéristiques principales des FS :
\footnotesize Name | FS | File | Block | Extent | File length
--------------|--------|-------- |-------------|---------- |---------------
MINIX-fs v1.0 |256 MB |256 MB |1 KB (fixed) |n/a |14/30
ext |2 GB |2 GB |? |n/a |255
ext2 |32 TB |2 TB |8 KB |n/a |255
ext3 |32 TB |2 TB |8 KB |n/a |255
ext4 |1 EB |16 TB |4 KB |128 MB |255
**Name** **FS** **File** **Block** **Extent** **File length** <br>
------------- --------------- -------------------- --------------- ---------- --------------- <div style="font-size:0.85em">Remarque : ext3 est simplement ext2 avec l'ajout d'un journal</div>
MINIX-fs v1.0 256 MB 256 MB 1 KB (fixed) n/a 14/30
ext 2 GB 2 GB ? n/a 255
ext2 32 TB 2 TB 8 KB n/a 255
ext3 32 TB 2 TB 8 KB n/a 255
ext4 1 EB 16 TB 4 KB 128 MB 255
\small --
Remarque : ext3 est simplement ext2 avec l'ajout d'un journal
[//]: # ----------------------------------------------------------------
## Structure générale ## Structure générale
\small
Structure générale sur disque de MINIX-fs v1.0 Structure générale sur disque de MINIX-fs v1.0
\vspace{.5cm}
\centering ![](images/minix_gen_struct.png)
![](images/minix_gen_struct.png){ width=100% }
--
[//]: # ----------------------------------------------------------------
## Structure des inodes ## Structure des inodes
\small
Structure d'un inode dans MINIX-fs v1.0 : Structure d'un inode dans MINIX-fs v1.0 :
\vspace{.2cm} ```c
```{.c .verysmall}
struct minix_inode { struct minix_inode {
u16 i_mode; // file type and permissions for file u16 i_mode; // file type and permissions for file
u16 i_uid; // user id u16 i_uid; // user id
...@@ -111,29 +95,29 @@ struct minix_inode { ...@@ -111,29 +95,29 @@ struct minix_inode {
- **Important** : structure sur disque stockée selon l'ordre *little-endian* - **Important** : structure sur disque stockée selon l'ordre *little-endian*
- Taille d'un inode en bytes ? - Taille d'un inode en bytes ?
[//]: # ---------------------------------------------------------------- --
## Structure du mode du fichier ## Structure du mode du fichier
Format du champs `i_mode` (16 bits) de l'inode : Format du champs `i_mode` (16 bits) de l'inode :
\footnotesize Bits | Description | t
----------------| -------------------------- |---------------------------
`12-15` | Type de fichier : |`0x1` : named pipe (FIFO)
`` | a |`0x2` : char device
b | b |`0x4` : directory
c | c |`0x6` : block device
d | d |`0x8` : regular file
we | e |`0xA` : symbolic link
`11` | SUID bit |
`10` | SGID bit |
`9` | Sticky bit |
`6-8` | user permissions (rwx) |
`3-5` | group permissions (rwx) |
`0-2` | others permissions (rwx) |
--
**Bits** **Description**
---------------- -------------------------- ---------------------------
`12-15` Type de fichier : `0x1` : named pipe (FIFO)
`0x2` : char device
`0x4` : directory
`0x6` : block device
`0x8` : regular file
`0xA` : symbolic link
`11` SUID bit
`10` SGID bit
`9` Sticky bit
`6-8` user permissions (rwx)
`3-5` group permissions (rwx)
`0-2` others permissions (rwx)
[//]: # ----------------------------------------------------------------
## Structure des entrées de répertoires ## Structure des entrées de répertoires
Structure d'une entrée de répertoire dans MINIX-fs v1.0 : Structure d'une entrée de répertoire dans MINIX-fs v1.0 :
...@@ -152,7 +136,8 @@ struct minix_dir_entry { ...@@ -152,7 +136,8 @@ struct minix_dir_entry {
- Taille d'un `dir_entry` en bytes ? - Taille d'un `dir_entry` en bytes ?
[//]: # ---------------------------------------------------------------- --
## Structure du superbloc ## Structure du superbloc
Structure du superbloc dans MINIX-fs v1.0 : Structure du superbloc dans MINIX-fs v1.0 :
...@@ -176,7 +161,8 @@ struct minix_super_block { ...@@ -176,7 +161,8 @@ struct minix_super_block {
- Taille du superbloc en bytes ? - Taille du superbloc en bytes ?
[//]: # ---------------------------------------------------------------- --
## Exemple de superbloc ## Exemple de superbloc
- Soit un disque de 20 MB et une taille de bloc de 1 KB\ - Soit un disque de 20 MB et une taille de bloc de 1 KB\
...@@ -207,7 +193,8 @@ struct minix_super_block { ...@@ -207,7 +193,8 @@ struct minix_super_block {
[^1]: \scriptsize permet d'arrondir au prochain multiple de la taille d'un inode [^1]: \scriptsize permet d'arrondir au prochain multiple de la taille d'un inode
[//]: # ---------------------------------------------------------------- --
## Exemple de superbloc ## Exemple de superbloc
```{.c .tiny} ```{.c .tiny}
...@@ -233,7 +220,8 @@ struct minix_super_block { ...@@ -233,7 +220,8 @@ struct minix_super_block {
\centering \centering
![](images/minix_example.png){ width=100% } ![](images/minix_example.png){ width=100% }
[//]: # ---------------------------------------------------------------- --
## Exemple d'inode - fichier répertoire ## Exemple d'inode - fichier répertoire
Contenu de l'inode 1, la racine du FS Contenu de l'inode 1, la racine du FS
...@@ -257,7 +245,8 @@ struct minix_inode { ...@@ -257,7 +245,8 @@ struct minix_inode {
}; };
``` ```
[//]: # ---------------------------------------------------------------- --
## Exemple de bloc de données - contenu répertoire ## Exemple de bloc de données - contenu répertoire
\footnotesize \footnotesize
...@@ -289,7 +278,8 @@ struct minix_inode { ...@@ -289,7 +278,8 @@ struct minix_inode {
- 7 répertoires : `root`, `bin`, `usr`, `etc`, `tmp`, `dev` (inodes 1, 2, 3, 4, 0xA, 0xF, 0x32) - 7 répertoires : `root`, `bin`, `usr`, `etc`, `tmp`, `dev` (inodes 1, 2, 3, 4, 0xA, 0xF, 0x32)
- 8 `dir_entry` inutilisées (inodes à 0) ; rappel : une entrée fait 16 bytes - 8 `dir_entry` inutilisées (inodes à 0) ; rappel : une entrée fait 16 bytes
[//]: # ---------------------------------------------------------------- --
## Exemple d'inode - fichier répertoire ## Exemple d'inode - fichier répertoire
Contenu de l'inode 2, répertoire `/root` Contenu de l'inode 2, répertoire `/root`
...@@ -313,7 +303,8 @@ struct minix_inode { ...@@ -313,7 +303,8 @@ struct minix_inode {
}; };
``` ```
[//]: # ---------------------------------------------------------------- --
## Exemple de bloc de données - contenu répertoire ## Exemple de bloc de données - contenu répertoire
\small \small
...@@ -343,7 +334,8 @@ struct minix_inode { ...@@ -343,7 +334,8 @@ struct minix_inode {
- Il y a 2 fichiers : `hello.c` (inode 0xB) et `.bash_login` (inode 0xE) - Il y a 2 fichiers : `hello.c` (inode 0xB) et `.bash_login` (inode 0xE)
- Il y a 4 `dir_entry` inutilisées (inodes à 0) - Il y a 4 `dir_entry` inutilisées (inodes à 0)
[//]: # ---------------------------------------------------------------- --
## Exemple d'inode - fichier régulier ## Exemple d'inode - fichier régulier
Contenu de l'inode 11 (0xB) Contenu de l'inode 11 (0xB)
...@@ -366,7 +358,8 @@ struct minix_inode { ...@@ -366,7 +358,8 @@ struct minix_inode {
}; };
``` ```
[//]: # ---------------------------------------------------------------- --
## Exemple de bloc de données - contenu fichier régulier ## Exemple de bloc de données - contenu fichier régulier
\small \small
...@@ -393,7 +386,8 @@ Contenu du 1er bloc de données référencé par l'inode 11\ ...@@ -393,7 +386,8 @@ Contenu du 1er bloc de données référencé par l'inode 11\
00091CD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00091CD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
``` ```
[//]: # ---------------------------------------------------------------- --
## Exemple d'inode - fichier régulier ## Exemple d'inode - fichier régulier
Contenu de l'inode 16 Contenu de l'inode 16
...@@ -417,7 +411,8 @@ struct minix_inode { ...@@ -417,7 +411,8 @@ struct minix_inode {
}; };
``` ```
[//]: # ---------------------------------------------------------------- --
## Exemple de bloc de données - contenu fichier régulier ## Exemple de bloc de données - contenu fichier régulier
\small \small
...@@ -444,7 +439,8 @@ Contenu du bloc indirect référencé par l'inode 11\ ...@@ -444,7 +439,8 @@ Contenu du bloc indirect référencé par l'inode 11\
- Prochains blocs de données : 0x254, 0x255, 0x256, 0x257, ... - Prochains blocs de données : 0x254, 0x255, 0x256, 0x257, ...
[//]: # ---------------------------------------------------------------- --
## Important : inodes ## Important : inodes
\small \small
...@@ -464,7 +460,8 @@ En conséquence : ...@@ -464,7 +460,8 @@ En conséquence :
- Pour lire le contenu de l'inode `n`, il faut lire l'entrée à l'indice `(n-1)` dans la table des inodes - Pour lire le contenu de l'inode `n`, il faut lire l'entrée à l'indice `(n-1)` dans la table des inodes
- Pour savoir si l'inode `n` est utilisé, il faut lire le bit à l'indice `n` dans le bitmap des inodes - Pour savoir si l'inode `n` est utilisé, il faut lire le bit à l'indice `n` dans le bitmap des inodes
[//]: # ---------------------------------------------------------------- --
## Important : blocs de données ## Important : blocs de données
\small \small
...@@ -493,7 +490,8 @@ En conséquence[^2] : ...@@ -493,7 +490,8 @@ En conséquence[^2] :
- le bit 3 du bitmap correspond donc au bloc 113, etc. - le bit 3 du bitmap correspond donc au bloc 113, etc.
--> -->
[//]: # ---------------------------------------------------------------- --
## Rappel : *endianness* (1/2) ## Rappel : *endianness* (1/2)
- L'*endianness* défini la manière dont les entiers sont stockés en mémoire - L'*endianness* défini la manière dont les entiers sont stockés en mémoire
...@@ -508,7 +506,8 @@ En conséquence[^2] : ...@@ -508,7 +506,8 @@ En conséquence[^2] :
- le byte le plus significatif (d'un mot) est stocké à l'adresse la plus haute - le byte le plus significatif (d'un mot) est stocké à l'adresse la plus haute
- le byte le moins significatif est stocké à l'adresse la plus basse - le byte le moins significatif est stocké à l'adresse la plus basse
[//]: # ---------------------------------------------------------------- --
## Rappel : *endianness* (2/2) ## Rappel : *endianness* (2/2)
Exemple de valeurs 8 bits, 16 bits et 32 bits, en représentation hexadécimale, où les adresses "grandissent" de gauche à droite : Exemple de valeurs 8 bits, 16 bits et 32 bits, en représentation hexadécimale, où les adresses "grandissent" de gauche à droite :
...@@ -522,7 +521,8 @@ Exemple de valeurs 8 bits, 16 bits et 32 bits, en représentation hexadécimale, ...@@ -522,7 +521,8 @@ Exemple de valeurs 8 bits, 16 bits et 32 bits, en représentation hexadécimale,
16 bits (2 bytes) `4c3f` `4c 3f` `3f 4c` 16 bits (2 bytes) `4c3f` `4c 3f` `3f 4c`
32 bits (4 bytes) `4c3f85ed` `4c 3f 85 ed` `ed 85 3f 4c` 32 bits (4 bytes) `4c3f85ed` `4c 3f 85 ed` `ed 85 3f 4c`
[//]: # ---------------------------------------------------------------- --
## Sérialisation/déserialisation de structure ## Sérialisation/déserialisation de structure
- **Sérialisation** de structure = écriture, en une opération, d'une structure sur un fichier, un socket, un pipe, etc. - **Sérialisation** de structure = écriture, en une opération, d'une structure sur un fichier, un socket, un pipe, etc.
...@@ -533,7 +533,8 @@ Exemple de valeurs 8 bits, 16 bits et 32 bits, en représentation hexadécimale, ...@@ -533,7 +533,8 @@ Exemple de valeurs 8 bits, 16 bits et 32 bits, en représentation hexadécimale,
- **Déserialisation** de structure = lecture, en une opération, depuis un fichier, un socket, un pipe, etc. dans une structure - **Déserialisation** de structure = lecture, en une opération, depuis un fichier, un socket, un pipe, etc. dans une structure
- typiquement via un appel à `read` ou `fread` - typiquement via un appel à `read` ou `fread`
[//]: # ---------------------------------------------------------------- --
## Danger avec la sérialisation/déserialisation ## Danger avec la sérialisation/déserialisation
```{.c .tiny} ```{.c .tiny}
...@@ -558,7 +559,8 @@ int main() { ...@@ -558,7 +559,8 @@ int main() {
- Conséquence : **\textcolor{myred}{toujours}** utiliser l'attribut `__packed__` sur les structures sérialisées\ ! - Conséquence : **\textcolor{myred}{toujours}** utiliser l'attribut `__packed__` sur les structures sérialisées\ !
::: :::
[//]: # ---------------------------------------------------------------- --
## Ressources ## Ressources
\small \small
...@@ -568,5 +570,4 @@ int main() { ...@@ -568,5 +570,4 @@ int main() {
\small \small
- `minix-fs` on-disk structures\
\footnotesize [\textcolor{myblue}{https://github.com/util-linux/util-linux/blob/master/include/minix.h}](https://github.com/util-linux/util-linux/blob/master/include/minix.h)
...@@ -3,9 +3,11 @@ ...@@ -3,9 +3,11 @@
- [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)
- [The Second Extended File System - Internal Layout](https://www.nongnu.org/ext2-doc/ext2.html) - [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) - [Ext4 (and Ext2/Ext3) Wiki](https://ext4.wiki.kernel.org/index.php/Main_Page)
- `mkfs.minix` [source code](https://github.com/util-linux/util-linux/blob/master/disk-utils/mkfs.minix.c)
- `minix-fs` [on-disk structures](https://github.com/util-linux/util-linux/blob/master/include/minix.h)
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment