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
Branches
No related tags found
No related merge requests found
---
author: Florent Gluck - Florent.Gluck@hesge.ch
# MINIX-fs
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
......@@ -27,7 +11,10 @@ pandoc-latex-fontsize:
- "tree --inodes -p -s -a" affiche arborescence avec n°inodes, permissions+type, tailles
- "-a" affiche également les fichiers cachés
[//]: # ----------------------------------------------------------------
-->
--
## 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
......@@ -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 fournir une aide à l'enseignement des systèmes de fichiers et des OS
[//]: # ----------------------------------------------------------------
--
## Linux et MINIX-fs
- Les premières versions du noyau Linux (1992) utilisaient MINIX-fs comme FS
......@@ -46,7 +34,8 @@ pandoc-latex-fontsize:
- 2006 : la version instable de ext4 est publiée
- 2008 : la version stable de ext4 est publiée
[//]: # ----------------------------------------------------------------
--
## Versions de MINIX-fs
- Il existe 3 versions de MINIX-fs : v1, v2 et v3
......@@ -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 30 caractères max (superblock magic value `0x138F`)
[//]: # ----------------------------------------------------------------
--
## Comparaison MINIX-fs et ext2/3/4
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**
------------- --------------- -------------------- --------------- ---------- ---------------
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
<br>
<div style="font-size:0.85em">Remarque : ext3 est simplement ext2 avec l'ajout d'un journal</div>
\small
Remarque : ext3 est simplement ext2 avec l'ajout d'un journal
--
[//]: # ----------------------------------------------------------------
## Structure générale
\small
Structure générale sur disque de MINIX-fs v1.0
\vspace{.5cm}
\centering
![](images/minix_gen_struct.png){ width=100% }
![](images/minix_gen_struct.png)
--
[//]: # ----------------------------------------------------------------
## Structure des inodes
\small
Structure d'un inode dans MINIX-fs v1.0 :
\vspace{.2cm}
```{.c .verysmall}
```c
struct minix_inode {
u16 i_mode; // file type and permissions for file
u16 i_uid; // user id
......@@ -111,29 +95,29 @@ struct minix_inode {
- **Important** : structure sur disque stockée selon l'ordre *little-endian*
- Taille d'un inode en bytes ?
[//]: # ----------------------------------------------------------------
--
## Structure du mode du fichier
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 d'une entrée de répertoire dans MINIX-fs v1.0 :
......@@ -152,7 +136,8 @@ struct minix_dir_entry {
- Taille d'un `dir_entry` en bytes ?
[//]: # ----------------------------------------------------------------
--
## Structure du superbloc
Structure du superbloc dans MINIX-fs v1.0 :
......@@ -176,7 +161,8 @@ struct minix_super_block {
- Taille du superbloc en bytes ?
[//]: # ----------------------------------------------------------------
--
## Exemple de superbloc
- Soit un disque de 20 MB et une taille de bloc de 1 KB\
......@@ -207,7 +193,8 @@ struct minix_super_block {
[^1]: \scriptsize permet d'arrondir au prochain multiple de la taille d'un inode
[//]: # ----------------------------------------------------------------
--
## Exemple de superbloc
```{.c .tiny}
......@@ -233,7 +220,8 @@ struct minix_super_block {
\centering
![](images/minix_example.png){ width=100% }
[//]: # ----------------------------------------------------------------
--
## Exemple d'inode - fichier répertoire
Contenu de l'inode 1, la racine du FS
......@@ -257,7 +245,8 @@ struct minix_inode {
};
```
[//]: # ----------------------------------------------------------------
--
## Exemple de bloc de données - contenu répertoire
\footnotesize
......@@ -289,7 +278,8 @@ struct minix_inode {
- 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
[//]: # ----------------------------------------------------------------
--
## Exemple d'inode - fichier répertoire
Contenu de l'inode 2, répertoire `/root`
......@@ -313,7 +303,8 @@ struct minix_inode {
};
```
[//]: # ----------------------------------------------------------------
--
## Exemple de bloc de données - contenu répertoire
\small
......@@ -343,7 +334,8 @@ struct minix_inode {
- Il y a 2 fichiers : `hello.c` (inode 0xB) et `.bash_login` (inode 0xE)
- Il y a 4 `dir_entry` inutilisées (inodes à 0)
[//]: # ----------------------------------------------------------------
--
## Exemple d'inode - fichier régulier
Contenu de l'inode 11 (0xB)
......@@ -366,7 +358,8 @@ struct minix_inode {
};
```
[//]: # ----------------------------------------------------------------
--
## Exemple de bloc de données - contenu fichier régulier
\small
......@@ -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 ................
```
[//]: # ----------------------------------------------------------------
--
## Exemple d'inode - fichier régulier
Contenu de l'inode 16
......@@ -417,7 +411,8 @@ struct minix_inode {
};
```
[//]: # ----------------------------------------------------------------
--
## Exemple de bloc de données - contenu fichier régulier
\small
......@@ -444,7 +439,8 @@ Contenu du bloc indirect référencé par l'inode 11\
- Prochains blocs de données : 0x254, 0x255, 0x256, 0x257, ...
[//]: # ----------------------------------------------------------------
--
## Important : inodes
\small
......@@ -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 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
\small
......@@ -493,7 +490,8 @@ En conséquence[^2] :
- le bit 3 du bitmap correspond donc au bloc 113, etc.
-->
[//]: # ----------------------------------------------------------------
--
## Rappel : *endianness* (1/2)
- L'*endianness* défini la manière dont les entiers sont stockés en mémoire
......@@ -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 moins significatif est stocké à l'adresse la plus basse
[//]: # ----------------------------------------------------------------
--
## 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 :
......@@ -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`
32 bits (4 bytes) `4c3f85ed` `4c 3f 85 ed` `ed 85 3f 4c`
[//]: # ----------------------------------------------------------------
--
## 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.
......@@ -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
- typiquement via un appel à `read` ou `fread`
[//]: # ----------------------------------------------------------------
--
## Danger avec la sérialisation/déserialisation
```{.c .tiny}
......@@ -558,7 +559,8 @@ int main() {
- Conséquence : **\textcolor{myred}{toujours}** utiliser l'attribut `__packed__` sur les structures sérialisées\ !
:::
[//]: # ----------------------------------------------------------------
--
## Ressources
\small
......@@ -568,5 +570,4 @@ int main() {
\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 @@
- [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
- `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
- [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