Linux Filesystem
Warning : Translating in progress
Introduction
Cet article a pour but de regrouper des connaissances que j’avais ou que j’avais envie d’acquérir. Il mélange beaucoup de notion parfois éloignées les unes des autres. On peut voir ça comme un bloc note sur le système de fichier Linux plutôt qu’un article. Je ne rentrerai pas dans le dur du sujet et comment fonctionnement en profondeur les système de fichier sur Linux.
Comprendre le Système de Fichier Linux
Le système de fichier Linux est un composant essentiel de tout système d’exploitation Linux. Il gère la façon dont les données sont stockées, organisées et accédées sur un disque dur ou un autre support de stockage. Dans cet article, nous allons explorer plusieurs aspects clés du système de fichier Linux, allant des notions de temps d’accès et de modification, à la journalisation, en passant par les différents types de systèmes de fichiers et leur importance, ainsi que plusieurs concepts avancés comme LUKS, LVM, UEFI…
Métriques du stockage
La capacité
La capacité est mesurée en octets ou en bits
Le débit
Le débit est une quantité de données qui est transferée par intervalle de temps, exemple : 80 Mio/s
Opérations par seconde
Nombre d’opérations d’entrée-sorties individuelles faites en un temps donné, typiquement noté N IOps, N IO/s ou N IOPS
La latence
Temps nécessaire pour qu’une opération démarre effectivement, mesurée en seconde ou millisecondes (le traditionnel ping
lors des tests de connexions internet mesure la latence en milliseconde)
RPM
Cette unité correspond aux tours par minute d’un disque dur.
Et les unités de stockages ?
Un problème majeur mais sans importance pour le grand public réside dans la convention des unités de stockages. En effet, 1ko peut être différent de 1ko, et pourtant, on l’écrit de la même manière. Cela est inhérent à la base 2 et aux raccourcis que l’on prend. 2¹⁰ cela donne 1024 et non pas 1000. Initialement, 1ko = 1000 octets, et se transforme parfois 1024 octets.
à noter :
k
est en minuscule
C’est là que Kio
intervient, 1Kio = 1024 octets. Plus de soucis avec ça !
Petite pause notation :
1 Yio = 210 Zio = 220 Eio = 230 Pio = 240 Tio = 250 Gio = 280 octets
Norme associées : Standard ISO/IEC 80000-13:2008 (& norme EN 60027-2:2007 dérivée du standard IEC 60027 de 1999)
En Anglais : kibibyte (KiB), mebibyte (MiB)
Notion de montage
Unix :
Sur un UNIX/POSIX : le montage d’un système de fichier se fait sur un répertoire.
Le point de montage doit exister avant le montage, contenu original du répertoire inaccessible après le montage et nécessite d’être root
.
Trouver qui accède au système de fichiers :
fuser -um /point_de_montage
Trouver de quelle manière est fait cet accès :
lsof -au $USER -p $PID /point_de_montage
Notions de fichiers et existence sur le système
Un fichier est une séquence d’octets tandis qu’un répertoire un un fichier spécial (représenté par un d
) qui contient le nom des autres objets.
Un lien symbolique (softlink
ou symlink
) est un fichier qui pointe vers un autre objet (répertoire ou fichier lui même), mais pas nécessairement dans le même système de fichier.
Un hardlink est un alias pour un autre objet.
Le numéro d’inode est accessible en executant la commande suivante :
ls -li requinqué.jpg
22047422 -rw-r--r-- 1 auteqia auteqia 41467 Jul 12 19:20 requinqué.jpg
Le numéro d’inode est donc 22047422
Essayons de faire un lien symbolique :
cd /tmp
ln -s ~/Downloads/requinqué.jpg requinqué.jpg
ls -li requinqué.jpg
1928 lrwxrwxrwx 1 auteqia auteqia 38 Jul 12 20:09 requinqué.jpg -> /home/auteqia/Downloads/requinqué.jpg
Le lien symbolique ne porte pas le même numéro d’inode mais fait réference au même fichier.
Les autres types d’objets spécifiques au système Linux :
- socket Unix, utilisé par SSH ou Docker notamment
- Périphériques, comme
/dev/sda1
- Pipe nommé
Le nommage d’un fichier sur Linux est assez libre, il interdit seulement le caractère /
ainsi que \0
Suppression d’un fichier
Lorsque vous utilisez la commande rm
pour supprimer un fichier, le système d’exploitation effectue les étapes suivantes :
Réduction du Compteur de Références : Chaque fichier sous Linux est représenté par un inode. L’inode contient des informations sur le fichier, comme ses attributs, son emplacement sur le disque et un compteur de références. Ce compteur de références indique combien de liens (noms de fichiers) pointent vers cet inode. Lorsque vous supprimez un fichier, le compteur de références est décrémenté.
Libération de l’Inode : Si le compteur de références atteint zéro, l’inode est marqué comme libre et les blocs de données du fichier sont ajoutés à la liste des blocs libres du système de fichiers. Cependant, les données ne sont pas immédiatement effacées du disque ; elles sont simplement marquées comme disponibles pour réécriture.
Arrêt de l’Indexation L’indexation est le processus par lequel un système d’exploitation maintient une base de données des fichiers pour faciliter la recherche rapide. Lorsque vous arrêtez l’indexation, le système cesse de mettre à jour cette base de données, ce qui peut ralentir les recherches futures mais n’affecte pas directement la suppression des fichiers ou la gestion des inodes.
Conséquences sur les Numéros d’Inodes
Les inodes jouent un rôle crucial dans la gestion des fichiers. Lorsqu’un fichier est supprimé :
- Réutilisation des Inodes : L’inode associé au fichier supprimé est libéré et peut être réutilisé pour un nouveau fichier. Tant que l’inode n’est pas réutilisé, les données du fichier supprimé restent sur le disque et peuvent être récupérées.
Aspects Forensic
la suppression d’un fichier n’efface pas les données du disque. Les données peuvent souvent être récupérées jusqu’à ce qu’elles soient écrasées par de nouvelles données. Les techniques courantes incluent :
-
File Carving : Cette technique consiste à récupérer des fichiers supprimés en analysant le contenu brut du disque. Les outils de file carving recherchent des signatures de fichiers spécifiques pour reconstituer les fichiers supprimés.
-
Analyse des Inodes : Les inodes contiennent des informations sur les fichiers, y compris les timestamps et les références aux blocs de données. Même après la suppression d’un fichier, l’inode peut fournir des indices sur les fichiers supprimés.
Suppression Propre d’un Fichier
Pour supprimer un fichier de manière irréversible et sécurisée, il est nécessaire d’écraser les données avant de libérer l’inode. Les commandes suivantes peuvent être utilisées pour cela :
- shred : La commande
shred
écrase les données d’un fichier avant de le supprimer.
shred fichier.txt
Dans cet exemple, shred
va réecrire 25 fois le contenu du fichier avec des octets aléatoires.
Attention, shred
ne fonctionne pas sur les système de fichier journalisés (quasiment tous) et ni sur les SSD à cause du wear leveling
(réparation de l’usure en français). C’est une technique utilisée sur les mémoires flash (clés USB, SSD…) afin de prolonger la durée de vie d’un support de stockage non volatil, en répartissant uniformément le nombre d’écritures et d’effacements sur toutes les cellules de stockage.
Wikipedia.
Les octets aléatoires se retrouveront sur les blocs suivants et un peu partout.
Le wear leveling
empêche quiconque d’écrire sur un bloc spécifique. Cette protection existe pour empêcher d’écrire le même bloc encore et encore, ce que shred essaye de faire.
Sans ça, la durée de vie d’une mémoire flash serait drastiquement réduite.
Cependant, on peut noter quelques commandes shred
si votre système de fichier n’est pas monté sur une mémoire de type flash :
# overwrite 10 times the file
shred -n 10 file.txt
# rempli de zéro la dernière overwrite pour cacher le shreding
shred -z file.txt
- wipe permet d’effacer de manière sécurisée en réecrivant le(s) bloc(s) et en vidant le cache. La commande effectue plusieurs passages comme
shred
wipe fichier.txt
Réecrire un certain nombre de fois :
wipe -Q 10 file.txt
- dd qui permet de réecrire un certain nombre de bloc à partir d’une source vers une destination :
dd if=/dev/urandom of=/dev/sdb2 bs=1M
Dans cet exemple, je prend la source /dev/urandom
et l’écrit sur /dev/sbd2
avec une taille de bloc (bloc size -> bs
) de 1mio
Notion de mode bloc
Le mode d’accès bloc
permet d’écrire sur un périphérique par morceau de taille N.

Ici la Sector size
Il peut arriver que les données écrites en mode bloc subissent un décalage.
Notions de Temps d’Accès et de Modification
Les systèmes de fichiers Linux utilisent trois types de timestamps pour les fichiers :
-
Access Time (atime) : Le dernier moment où le fichier a été lu. Ce timestamp est mis à jour chaque fois qu’un fichier est accédé (lu) par une application ou un utilisateur. C’est particulièrement utile pour les applications de sauvegarde ou pour analyser les fichiers fréquemment utilisés.
-
Modified Time (mtime) : Le dernier moment où le contenu du fichier a été modifié. Ce timestamp est mis à jour lorsque les données d’un fichier sont modifiées. Il est essentiel pour les applications de synchronisation et de sauvegarde différentielles, qui se basent souvent sur cette valeur pour déterminer quels fichiers ont changé.
-
Change Time (ctime) : Le dernier moment où les métadonnées du fichier (comme les permissions ou le nom) ont été modifiées. Contrairement à mtime, ctime change même si seulement les métadonnées du fichier sont modifiées, par exemple, lorsqu’on change les permissions d’un fichier sans toucher à son contenu.
Un timestamp peut contenir 2 147 483 647 secondes, depuis l’Epoch, ça signifie le 19 janvier 2038 à 3h14 et 07 secondes (du matin). Cela posera un problème à ce moment là !
Ces timestamps sont utiles pour des tâches comme les sauvegardes, la gestion des versions et l’audit des accès aux fichiers. La gestion de ces timestamps peut également avoir un impact sur les performances, c’est pourquoi certains systèmes de fichiers permettent d’optimiser ou de désactiver la mise à jour de ces timestamps selon les besoins. Ces timestamps ont une importance majeure dans la partie forensic et plus globalement pour lever un diagnostic lors d’un problème survenu ou d’une compromission.
Les systèmes de fichier plus récents comme NTFS de Windows ajoutent les valeurs de birth time.
Comment voir les différents timestamps ?
Pour voir le mtime
:
ls -l requinqué.jpg
-rw-r--r-- 1 auteqia auteqia 41467 Jul 12 19:20 requinqué.jpg
Pour voir le atime
:
ls -lu requinqué.jpg
-rw-r--r-- 1 auteqia auteqia 41467 Jul 12 19:20 requinqué.jpg
Pour voir le ctime
:
ls -lc requinqué.jpg
-rw-r--r-- 1 auteqia auteqia 41467 Jul 12 19:21 requinqué.jpg
Pour voir tous les timestamps en même temps :
stat requinqué.jpg
File: requinqué.jpg
Size: 41467 Blocks: 88 IO Block: 4096 regular file
Device: 259,4 Inode: 22047422 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ auteqia) Gid: ( 1000/ auteqia)
Access: 2024-07-12 19:20:33.795628668 +0200
Modify: 2024-07-12 19:20:33.795628668 +0200
Change: 2024-07-12 19:21:18.382294981 +0200
Birth: 2024-07-12 19:20:33.795628668 +0200
Timestomping
Une méthode dite anti-forensic
nommé le timestomping
agit sur ces timestamps. L’attaquant modifie le atime
, mtime
ainsi que le ctime
pour brouiller les pistes et rendre plus difficile l’investigation.
Les tests
Modifier l’access time “gentiment”
touch -a file
Ceci va changer l’access time du fichier au timestamp actuel de l’ordinateur
Modifier l’access time “gentiment”
touch -m file
Pour modifier plus en détail, on peut choisir une certaine date et heure :
touch -d "2024-05-06 11:14:30" file
Ce qui changera le atime
et mtime
du fichier à 11h14m30s le 06 mai 2024
Pour changer uniquement le ctime
, donc uniquement les métadatas, nous pouvons faire ceci :
chmod +x file
Il est bien sur possible de cumuler tout ceci.
Journalisation du Système de Fichier
La journalisation est une technique utilisée par certains systèmes de fichiers pour améliorer la fiabilité en cas de panne. Un système de fichier journalisé garde une trace des modifications qui vont être apportées avant de les appliquer, ce qui permet de récupérer plus facilement en cas de plantage.
-
Ext3 et Ext4 : Les systèmes de fichiers ext3 et ext4 utilisent la journalisation pour garantir l’intégrité des données. La journalisation réduit les risques de corruption de données lors d’un crash système ou d’une panne de courant.
-
XFS : XFS est un système de fichiers hautement performant et extensible, conçu pour gérer de grandes quantités de données. Il utilise une journalisation avancée pour assurer la cohérence des données et propose des fonctionnalités comme la défragmentation en ligne.
La journalisation peut être configurée pour fonctionner en mode « ordered » (seules les métadonnées sont journalisées) ou « writeback » (les données et les métadonnées sont journalisées). Le choix du mode de journalisation impacte les performances et la sécurité des données.
Types de Systèmes de Fichier
Listes d’inodes :
- Ext4 : Ext4 (Extended File System 4) est le système de fichier par défaut pour de nombreuses distributions Linux. Il offre une excellente performance et stabilité, supporte des volumes et des fichiers de très grande taille (jusqu’à 1 exaoctet pour le volume et 16 téraoctets pour un fichier), et inclut des fonctionnalités avancées comme la journalisation, l’allocation retardée, et la défragmentation en ligne.
Arbres binaires :
- XFS : XFS est un système de fichier haute performance développé par Silicon Graphics (SGI) en 1993. Il est particulièrement adapté aux systèmes où de grandes quantités de données sont manipulées, grâce à sa capacité à gérer de très grands fichiers et volumes. XFS est également connu pour son efficacité dans la gestion de nombreux petits fichiers.
Je ne rentrerai pas plus dans le détail de XFS mais voici quelques liens sympas : Wikipedia Archi Linux Wiki Papier très compliqué de 192 pages
Accès à la journalisation :
Pour ext4 vous pouvez vérifier si votre partition possède bien la journalisation :
sudo tune2fs -l /dev/nvme0n1p4 | grep "has_journal"
Filesystem features: has_journal ext_attr resize_inode dir_index orphan_file filetype needs_recovery extent 64bit flex_bg metadata_csum_seed sparse_super large_file huge_file dir_nlink extra_isize metadata_csum orphan_present
Des informations détaillée sur le journal :
sudo dumpe2fs /dev/nvme0n1p4 | grep -i journal
dumpe2fs 1.47.1 (20-May-2024)
Filesystem features: has_journal ext_attr resize_inode dir_index orphan_file filetype needs_recovery extent 64bit flex_bg metadata_csum_seed sparse_super large_file huge_file dir_nlink extra_isize metadata_csum orphan_present
Journal inode: 8
Journal backup: inode blocks
Journal features: journal_incompat_revoke journal_64bit journal_checksum_v3
Total journal size: 1024M
Total journal blocks: 262144
Journal sequence: 0x0009ef1e
Journal start: 45641
Journal checksum type: crc32c
Journal checksum: 0xaa866d43
La journalisation est importante dans un système de fichier et notamment en forensic car elle retrace avec une grande précision (variant selon les systèmes de fichiers) les changements.
Virtual File System (VFS)
Le VFS (Virtual File System) est une couche d’abstraction au-dessus des systèmes de fichiers physiques. Il permet à Linux de supporter plusieurs types de systèmes de fichiers tout en fournissant une interface uniforme pour l’accès aux fichiers. Le VFS rend possible l’intégration transparente de différents systèmes de fichiers, qu’ils soient locaux (ext4, XFS) ou réseau (NFS, CIFS).
Fonctionnement
cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
nodev proc
nodev tmpfs
nodev devtmpfs
nodev debugfs
nodev securityfs
nodev sockfs
nodev usbfs
nodev pipefs
nodev anon_inodefs
nodev inotifyfs
nodev devpts
ext3
ext2
nodev ramfs
nodev hugetlbfs
iso9660
nodev mqueue
ext4
nodev fuse
fuseblk
nodev fusectl
nodev vmblock
Lorsque l’on monte un filesystem, la commande mount
donne 3 paramètres au kernel :
- le
block device
physique - Le point de montage
- Le type de filesystem (
ext4, fat32...
)
Petite commande sympa :
sudo blkid /dev/nvme0n1p1
/dev/nvme0n1p1: UUID="CE79-0477" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="primary" PARTUUID="bd63fccb-6cac-4dd0-b4ea-55db8c000c98"
Loop Devices
Les loop devices permettent de monter un fichier en tant que système de fichier. Cela est particulièrement utile pour travailler avec des images de disque ou des fichiers ISO sans avoir besoin de les graver sur un support physique. On note que c’est souvent le cas dans le cadre des analyses de disques dans les compétitions de type Capture The Flag.
Par exemple, pour monter une image ISO, on peut utiliser la commande suivante :
sudo mount -o loop image.iso /mnt
Ou bien :
sudo losetup /dev/loop0 image.iso
sudo mount /dev/loop0 /mnt
Si l’on veut partitionner notre loop device :
sudo losetup /dev/loop0 image.iso
sudo kpartx -av /dev/loop0
# créer les partitions dans /dev/mapper/
sudo mount /dev/mapper/loop0n1 /mnt
Ces commandes monte l’image image.iso
sur le répertoire /mnt
, permettant d’accéder aux fichiers contenus dans l’image comme s’ils faisaient partie du système de fichiers local.
Arborescence du Système de Fichier
L’arborescence des fichiers sous Linux suit une structure hiérarchique commençant par la racine /
. Voici quelques répertoires importants :
-
/bin les fichiers exécutables (en binaire) (initialisation du système + commandes “essentielles”)
-
/boot le noyau
**vmlinuz**
et les fichiers de démarrage -
/dev répertoire de fichiers spéciaux, qui servent de canaux de communication avec les périphériques (disques, adaptateur réseau, cartes son etc…)
-
/etc les fichiers de configuration du système et les principaux scripts de paramétrage
-
/etc/rc.d scripts de démarrage du système
-
/etc/X11 scripts de configuration du serveur X
-
/etc/sysconfig configuration des périphériques
-
/etc/cron description des tâches périodiques à effectuer
-
/etc/skel fichiers recopiés dans le rép. personnel d’un nouvel utilisateur
-
/home la racine des répertoires personnels des utilisateurs
-
/lib les bibliothèques et les modules du noyau
-
/mnt la racine des points de montage des systèmes de fichiers périphériques ou extérieurs (cd, disquette, nfs ..).
-
/opt lieu d’installation d’applications supplémentaires (comme starOffice, java ..)
-
/root répertoire personnel du super-utilisateur root
-
/sbin les fichiers exécutables pour l’administration du système
-
/tmp stockage des fichiers temporaires
-
/usr programmes accessibles à tout utilisateur; sa structure reproduit celle de la racine /
-
/var données variables liées à la machine (fichiers d’impression, traces de connexions http, smb .. dans /var/log)
-
/proc ce pseudo-répertoire contient une “image” du système (
/proc/kcore
est l’image de la RAM
Les différents systèmes de fichiers montés
findmnt -l

tmpfs
/tmp tmpfs tmpfs rw,nosuid,nodev,nr_inodes=1048576,inode64
On voit tmpfs
qui est monté sur /tmp
. Ce système de fichier est temporaire comme son nom l’indique car il est stocké en RAM. Les fichiers sont écrit en RAM et disparaissent après un redémarrage.
devtmpfs
/dev dev devtmpfs rw,nosuid,relatime,size=9156676k,nr_inodes=2289169,mode=755,inode64
devtmpfs est le nom du système de fichier pour le point de montage /dev
qui contient les fichiers device block
très particuliers. Il est aussi chargé en RAM.
root
/ /dev/nvme0n1p3 ext4 rw,relatime
On voit que mon système de fichier racine est en ext4
et monté sur /
boot efi
/boot/efi /dev/nvme0n1p1 vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro
Pour la partition efi qui sert de lanceur au démarrage, elle est formatée en vfat
securityfs
/sys/kernel/security securityfs securityfs rw,nosuid,nodev,noexec,relatime
securityfs
est un peu spécial car il se situe au dessus de VFS
. Il agit comme un système de fichier virtuel à son tour. Ce sont les modules de sécurité kernel qui placent leur configuration ici.
On peut y retrouver Apparmor
où le TPM.
Voici les liens expliquant plus en détail :
UEFI et le Fichier efi.boot
L’UEFI (Unified Extensible Firmware Interface) est un standard de firmware pour les ordinateurs, succédant au BIOS. Il permet un démarrage plus rapide et des fonctionnalités avancées comme le démarrage sécurisé.
Le fichier efi.boot
est un fichier binaire situé dans la partition EFI (ESP - EFI System Partition) et est utilisé pour démarrer le système d’exploitation. Cette partition, formatée en FAT32 (ou VFAT), contient les fichiers nécessaires au démarrage du système, y compris les chargeurs de démarrage et les gestionnaires de boot.
Pour ma part :
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 206847 204800 100M EFI System
LUKS (Linux Unified Key Setup)
LUKS (Linux Unified Key Setup) est la norme pour le chiffrement des disques sous Linux. Il permet de chiffrer tout un périphérique de stockage.
Pour configurer un disque avec LUKS, les étapes de base sont les suivantes :
- Initialiser le disque avec
cryptsetup
:
sudo cryptsetup luksFormat /dev/sdX
- Ouvrir le disque chiffré :
sudo cryptsetup luksOpen /dev/sdX my_encrypted_disk
- Créer un système de fichier sur le disque chiffré :
sudo mkfs.ext4 /dev/mapper/my_encrypted_disk
- Monter le système de fichier :
sudo mount /dev/mapper/my_encrypted_disk /mnt
LVM (Logical Volume Manager)
Le LVM (Logical Volume Manager) permet de gérer des volumes logiques plutôt que des partitions physiques, offrant une grande flexibilité pour redimensionner, ajouter ou supprimer des volumes sans perturber le système en cours de fonctionnement.
Les composants clés de LVM sont :
- Physical Volumes (PV) : Les disques physiques ou partitions utilisés par LVM.
- Volume Groups (VG) : Groupes de volumes physiques combinés pour former un pool de stockage.
- Logical Volumes (LV) : Les volumes logiques créés à partir du pool de stockage des volume groups.
Voici un exemple de création d’un volume logique avec LVM :
- Créer un volume physique :
sudo pvcreate /dev/sdX1
- Créer un volume group :
sudo vgcreate my_volume_group /dev/sdX1
- Créer un volume logique de 10Gib :
sudo lvcreate -n my_logical_volume -L 10G my_volume_group
- Formater le volume logique :
sudo mkfs.ext4 /dev/my_volume_group/my_logical_volume
- Monter le volume logique :
sudo mount /dev/my_volume_group/my_logical_volume /mnt
Fichiers de Configuration Cruciaux
- /etc/fstab : Contient des informations sur les systèmes de fichiers et les points de montage. Voici un exemple de contenu de
/etc/fstab
:
# <file system> <mount point> <type> <options> <dump> <pass> UUID=123e4567-e89b-12d3-a456-426614174000 / ext4 defaults 0 1 UUID=123e4567-e89b-12d3-a456-426614174001 /home ext4 defaults 0 2
Ces entrées spécifient quels systèmes de fichiers monter au démarrage et avec quelles options.
- /etc/crypttab : Contient des informations sur les volumes chiffrés à déchiffrer au démarrage. Par exemple :
my_encrypted_disk UUID=123e4567-e89b-12d3-a456-426614174002 none luks
Cette entrée spécifie un volume chiffré à déverrouiller lors du démarrage.
- /etc/mkinitcpio.conf : Configuration pour la génération de l’initramfs, une image minimale du système de fichiers utilisée au démarrage. Ce fichier contient des informations sur les hooks et les modules à inclure dans l’initramfs.
Commande mkinitcpio
La commande mkinitcpio est utilisée pour générer une nouvelle image d’initramfs basée sur les configurations définies dans /etc/mkinitcpio.conf
. Cela est souvent nécessaire après une mise à jour du noyau.
Par exemple, pour générer une nouvelle image initramfs :
sudo mkinitcpio -p linux
Cette commande crée une nouvelle image initramfs
pour le noyau Linux installé, en incluant tous les modules et hooks spécifiés.
Système de Fichier SWAP
- SWAP : Une partition ou un fichier utilisé pour étendre la mémoire vive (RAM) en utilisant de l’espace disque. La swap aide à éviter les plantages du système lorsque la mémoire RAM est saturée. Pour créer une partition swap :
sudo mkswap /dev/sdX2 sudo swapon /dev/sdX2
Pour ajouter un fichier swap :
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo mkswap /swapfile sudo swapon /swapfile
Les informations sur les partitions ou fichiers swap doivent être ajoutées à /etc/fstab
pour être activées au démarrage.
RAMFS
- ramfs : Un système de fichiers en RAM, offrant des performances très élevées car il utilise la mémoire vive pour le stockage temporaire des fichiers. Contrairement à tmpfs, ramfs ne permet pas de définir une limite de taille, ce qui peut entraîner une saturation de la mémoire si utilisé de manière excessive.
Pour monter un ramfs :
sudo mount -t ramfs ramfs /mnt
Les fichiers stockés dans ramfs seront perdus lors d’un redémarrage, car ils ne sont pas persistants.
procFS
- /proc/PID/cmdline, la commande qui a lancé le processus à l’origine.
- /proc/PID/cwd, un lien symbolique vers le répertoire de travail actuel du processus.
- /proc/PID/environ contient les noms et les valeurs des variables d’environnement qui affectent le processus.
- /proc/PID/exe, un lien symbolique vers le fichier exécutable original, s’il existe toujours (un processus peut continuer à s’exécuter après que son exécutable original a été supprimé ou remplacé).
- /proc/PID/fd, un répertoire contenant un lien symbolique pour chaque descripteur de fichier ouvert.
- /proc/PID/fdinfo, un répertoire contenant des entrées qui décrivent la position et les drapeaux de chaque descripteur de fichier ouvert.
- /proc/PID/maps, un fichier texte contenant des informations sur les fichiers et les blocs mappés (comme le tas et la pile).
- /proc/PID/mem, une image binaire représentant la mémoire virtuelle du processus, accessible uniquement par un processus ptrace.
- /proc/PID/root, un lien symbolique vers le chemin de la racine tel qu’il est perçu par le processus. Pour la plupart des processus, il s’agira d’un lien vers /, à moins que le processus ne s’exécute dans une prison chroot.
- /proc/PID/status contient des informations de base sur un processus, notamment son état d’exécution et son utilisation de la mémoire.
- /proc/PID/task, un répertoire contenant des liens en dur vers toutes les tâches qui ont été lancées par ce processus (c’est-à-dire le processus parent).
la Couche VFS (Virtual File System)
La couche VFS (Virtual File System) est un élément central du noyau Linux, jouant un rôle crucial dans la gestion des systèmes de fichiers. Elle agit comme une interface entre le noyau et les différents systèmes de fichiers, offrant une abstraction qui permet à Linux de supporter plusieurs types de systèmes de fichiers de manière transparente.
Fonctionnement de VFS
Pour mieux comprendre l’importance de VFS, il est utile de voir comment il fonctionne :
-
Inodes et Dentries : VFS utilise des structures appelées inodes et dentries pour représenter les fichiers et les répertoires. Un inode contient des informations sur un fichier, telles que sa taille, ses permissions, et ses timestamps. Une dentry représente une entrée de répertoire, reliant un nom de fichier à un inode.
-
Superblocks : Un superblock contient des informations sur un système de fichiers monté, telles que sa taille, son type, et son état. Chaque système de fichiers monté a un superblock associé, géré par VFS.
-
VFS API : Les systèmes de fichiers doivent implémenter un ensemble standard de fonctions définies par l’API VFS, telles que
vfs_read
,vfs_write
,vfs_open
, etvfs_close
. Ces fonctions permettent à VFS de déléguer les opérations spécifiques au système de fichiers sous-jacent.
Détail de l’Initial Ramdisk (initramfs) sous Linux
L’initial ramdisk (initramfs) est une image de système de fichiers minimaliste utilisée lors du processus de démarrage du système d’exploitation Linux. Il contient les fichiers nécessaires pour monter les systèmes de fichiers réels et initialiser le noyau avant que le contrôle ne soit transféré au véritable système de fichiers racine. Voici une exploration détaillée de l’initramfs, de son rôle, de sa création et de son utilisation.
Rôle de l’initramfs
L’initramfs joue un rôle crucial dans le processus de démarrage en fournissant les éléments suivants :
-
Modules du noyau : Contient les pilotes et modules nécessaires pour accéder au matériel essentiel (comme les disques durs ou les contrôleurs RAID) qui ne sont pas intégrés directement dans le noyau.
-
Scripts d’init : Les scripts nécessaires pour préparer l’environnement avant de monter le système de fichiers racine. Ils peuvent configurer le matériel, démarrer des services initiaux, et trouver et monter le système de fichiers racine.
-
Dépendances utilisateur : Les bibliothèques et les utilitaires nécessaires pour exécuter les scripts d’initialisation.
Fonctionnement de l’initramfs
Lors du démarrage, le boot loader (comme GRUB) charge le noyau et l’image initramfs en mémoire. Voici les étapes typiques du processus de démarrage utilisant initramfs :
-
Chargement du noyau et de l’initramfs : Le boot loader charge le noyau Linux et l’image initramfs en mémoire.
-
Démarrage du noyau : Le noyau commence son exécution et monte l’initramfs comme son système de fichiers racine temporaire.
-
Exécution du script d’init : L’initramfs exécute un script d’initialisation (souvent
/init
). Ce script configure le système, charge les modules du noyau nécessaires, et prépare l’environnement pour le véritable système de fichiers racine. -
Montage du système de fichiers racine : Le script d’init localise le véritable système de fichiers racine, le monte, et transfère le contrôle au processus d’init du système d’exploitation (souvent systemd ou init).
Création de l’initramfs
L’image initramfs est généralement générée lors de l’installation ou de la mise à jour du noyau. Sous les distributions basées sur Arch Linux, la commande mkinitcpio
est utilisée, tandis que sous Debian et Ubuntu, update-initramfs
est couramment utilisé. Voici comment cela fonctionne avec mkinitcpio
:
Génération de l’initramfs
Pour générer une nouvelle image initramfs, utilisez la commande suivante :
sudo mkinitcpio -p linux
Cette commande crée une nouvelle image initramfs basée sur les paramètres du fichier de configuration.
Utilisation de l’initramfs
Une fois générée, l’image initramfs est stockée dans le répertoire /boot
, généralement avec un nom indiquant le noyau pour lequel elle est destinée, par exemple initramfs-linux.img
.
Le boot loader doit être configuré pour utiliser cette image initramfs. Sous GRUB, cela se fait dans le fichier de configuration /boot/grub/grub.cfg
ou via des scripts de mise à jour comme update-grub
.
Fichier vmlinuz
Le fichier vmlinuz est une composante cruciale du système d’exploitation Linux. Il s’agit du noyau compressé, chargé par le boot loader (comme GRUB) lors du processus de démarrage. Le nom vmlinuz est une abréviation de “Virtual Memory LINUx gZipped”. Explorons en détail ce qu’est le fichier vmlinuz, son rôle, et comment il fonctionne.
Qu’est-ce que vmlinuz ?
vmlinuz est l’image compressée du noyau Linux. Lors de la compilation et de l’installation d’un nouveau noyau, cette image est créée et placée dans le répertoire /boot
. Le fichier vmlinuz contient le code du noyau ainsi que les informations nécessaires pour que le boot loader puisse le charger en mémoire.
2. Histoire et Évolution
Le nom vmlinuz a évolué au fil du temps :
- vmlinux : Initialement, l’image du noyau Linux non compressée était appelée vmlinux. Cette image contenait le noyau sous forme de binaire exécutable.
- vmlinuz : Pour économiser de l’espace disque et réduire le temps de chargement, l’image du noyau a été compressée en utilisant gzip, d’où le nom vmlinuz.
Contenu du Fichier vmlinuz
Le fichier vmlinuz est composé de plusieurs sections :
- Header : Contient les informations nécessaires pour que le boot loader puisse charger et démarrer le noyau.
- Kernel Code : Le code exécutable du noyau.
- Compressed Data : Le code du noyau est compressé pour réduire la taille de l’image.
- Setup Code : Code d’initialisation qui prépare le matériel et configure les paramètres nécessaires avant que le noyau ne prenne le relais.
Fonctionnement lors du Démarrage
Voici les étapes typiques du processus de démarrage utilisant vmlinuz :
- boot loader : Le boot loader (comme GRUB) est configuré pour charger le fichier vmlinuz depuis le répertoire
/boot
. - Chargement en Mémoire : Le boot loader charge vmlinuz en mémoire et commence son exécution.
- Décompression : Le code de décompression intégré dans vmlinuz décompresse le noyau.
- Initialisation : Le code d’initialisation configure le matériel et prépare l’environnement pour l’exécution du noyau.
- Exécution du Noyau : Le noyau prend le contrôle et commence l’initialisation du système, y compris le montage des systèmes de fichiers et le lancement des processus initiaux.
Création et Installation de vmlinuz
Lorsque vous compilez un noyau, le fichier vmlinuz est généré à partir du fichier vmlinux. Voici un aperçu du processus de compilation et de création de vmlinuz :
a. Compilation du Noyau
Pour compiler le noyau, vous devez télécharger les sources du noyau et configurer les options de compilation. Voici un exemple de processus de compilation :
make menuconfig make make modules_install
b. Création de vmlinuz
Après la compilation, l’image du noyau non compressée (vmlinux) est convertie en vmlinuz en utilisant des outils de compression comme gzip :
gzip -c vmlinux > vmlinuz
c. Installation de vmlinuz
Le fichier vmlinuz est ensuite installé dans le répertoire /boot
:
cp vmlinuz /boot/vmlinuz-$(uname -r)
d. Mise à Jour du boot loader
Le boot loader (comme GRUB) doit être configuré pour utiliser la nouvelle image du noyau. Sous GRUB, cela peut être fait avec :
sudo update-grub
Gestion des Versions du Noyau
Dans le répertoire /boot
, vous pouvez trouver plusieurs versions de vmlinuz, correspondant aux différents noyaux installés sur le système. Par exemple :
/boot/vmlinuz-5.4.0-72-generic
/boot/vmlinuz-5.10.0-13-amd64
Cela permet aux utilisateurs de choisir entre différentes versions du noyau au démarrage, offrant ainsi une flexibilité en cas de problèmes avec une version spécifique du noyau.
Compression et Décompression de vmlinuz
Le noyau Linux utilise diverses méthodes de compression pour créer vmlinuz. Les méthodes de compression couramment utilisées incluent gzip, bzip2, lzma, et xz. La décompression est effectuée par un petit morceau de code dans vmlinuz, qui est exécuté avant que le noyau ne prenne le contrôle.