diff --git a/9.filesystems/04_Systemes_fichiers_minix.md b/9.filesystems/04_Systemes_fichiers_minix.md index e836e80cf1e42caa5cb9820f2f712f98a061a7c9..cc6cc311894ab4067876dd5b5aaa4a53c8097406 100644 --- a/9.filesystems/04_Systemes_fichiers_minix.md +++ b/9.filesystems/04_Systemes_fichiers_minix.md @@ -1,22 +1,6 @@ ---- -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 -{ width=100% } + + +-- -[//]: # ---------------------------------------------------------------- ## 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 { 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) + diff --git a/9.filesystems/Ressources.md b/9.filesystems/Ressources.md index 703758cdd4b3ddf763cfd8e630176795c03f9abc..4f65bbf88068e4ba9de586ac2073c7440212c1e4 100644 --- a/9.filesystems/Ressources.md +++ b/9.filesystems/Ressources.md @@ -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