Linux Filesystem

Warning : Translating in progress

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.

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…

La capacité est mesurée en octets ou en bits

Le débit est une quantité de données qui est transferée par intervalle de temps, exemple : 80 Mio/s

Nombre d’opérations d’entrée-sorties individuelles faites en un temps donné, typiquement noté N IOps, N IO/s ou N IOPS

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)

Cette unité correspond aux tours par minute d’un disque dur.

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 :

bash

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)

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 :

bash

fuser -um /point_de_montage

Trouver de quelle manière est fait cet accès :

bash

lsof -au $USER -p $PID /point_de_montage

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 :

bash

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 :

bash

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

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.

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.

bash

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 :

bash

# 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

Nice Shred article

  • 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

bash

wipe fichier.txt

Réecrire un certain nombre de fois :

bash

wipe -Q 10 file.txt
  • dd qui permet de réecrire un certain nombre de bloc à partir d’une source vers une destination :

bash

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

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.

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 :

bash

ls -l requinqué.jpg
-rw-r--r-- 1 auteqia auteqia 41467 Jul 12 19:20 requinqué.jpg

Pour voir le atime :

bash

ls -lu requinqué.jpg
-rw-r--r-- 1 auteqia auteqia 41467 Jul 12 19:20 requinqué.jpg

Pour voir le ctime :

bash

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 :

bash

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

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.

Modifier l’access time “gentiment”

bash

touch -a file

Ceci va changer l’access time du fichier au timestamp actuel de l’ordinateur

Modifier l’access time “gentiment”

bash

touch -m file

Pour modifier plus en détail, on peut choisir une certaine date et heure :

bash

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 :

bash

chmod +x file

Il est bien sur possible de cumuler tout ceci.

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.

  • 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.
  • 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

Pour ext4 vous pouvez vérifier si votre partition possède bien la journalisation :

bash

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 :

bash

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.

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).

Image from here : VFS

bash

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 :

bash

sudo blkid /dev/nvme0n1p1

/dev/nvme0n1p1: UUID="CE79-0477" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="primary" PARTUUID="bd63fccb-6cac-4dd0-b4ea-55db8c000c98"

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 :

bash

sudo mount -o loop image.iso /mnt

Ou bien :

bash

sudo losetup /dev/loop0 image.iso
sudo mount /dev/loop0 /mnt

Si l’on veut partitionner notre loop device :

bash

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.

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

bash

findmnt -l

bash

/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.

bash

/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.

bash

/           /dev/nvme0n1p3 ext4            rw,relatime

On voit que mon système de fichier racine est en ext4 et monté sur /

bash

/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

bash

/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 :

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 :

bash

Device             Start        End   Sectors   Size Type
/dev/nvme0n1p1      2048     206847    204800   100M EFI System

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 :

  1. Initialiser le disque avec cryptsetup :

bash

sudo cryptsetup luksFormat /dev/sdX
  1. Ouvrir le disque chiffré :

bash

sudo cryptsetup luksOpen /dev/sdX my_encrypted_disk
  1. Créer un système de fichier sur le disque chiffré :

bash

sudo mkfs.ext4 /dev/mapper/my_encrypted_disk
  1. Monter le système de fichier :

bash

sudo mount /dev/mapper/my_encrypted_disk /mnt

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 :

  1. Créer un volume physique :

bash

sudo pvcreate /dev/sdX1
  1. Créer un volume group :

bash

sudo vgcreate my_volume_group /dev/sdX1
  1. Créer un volume logique de 10Gib :

bash

sudo lvcreate -n my_logical_volume -L 10G my_volume_group
  1. Formater le volume logique :

bash

sudo mkfs.ext4 /dev/my_volume_group/my_logical_volume
  1. Monter le volume logique :

bash

sudo mount /dev/my_volume_group/my_logical_volume /mnt
  • /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.

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 :

bash

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.

  • 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 :

bash

sudo mkswap /dev/sdX2 sudo swapon /dev/sdX2

Pour ajouter un fichier swap :

bash

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 : 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 :

bash

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.

  • /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).

Wikipedia

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.

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, et vfs_close. Ces fonctions permettent à VFS de déléguer les opérations spécifiques au système de fichiers sous-jacent.

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.

L’initramfs joue un rôle crucial dans le processus de démarrage en fournissant les éléments suivants :

  1. 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.

  2. 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.

  3. Dépendances utilisateur : Les bibliothèques et les utilitaires nécessaires pour exécuter les scripts d’initialisation.

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 :

  1. Chargement du noyau et de l’initramfs : Le boot loader charge le noyau Linux et l’image initramfs en mémoire.

  2. Démarrage du noyau : Le noyau commence son exécution et monte l’initramfs comme son système de fichiers racine temporaire.

  3. 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.

  4. 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).

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 :

Pour générer une nouvelle image initramfs, utilisez la commande suivante :

bash

sudo mkinitcpio -p linux

Cette commande crée une nouvelle image initramfs basée sur les paramètres du fichier de configuration.

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.

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.

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.

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.

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.

Voici les étapes typiques du processus de démarrage utilisant vmlinuz :

  1. boot loader : Le boot loader (comme GRUB) est configuré pour charger le fichier vmlinuz depuis le répertoire /boot.
  2. Chargement en Mémoire : Le boot loader charge vmlinuz en mémoire et commence son exécution.
  3. Décompression : Le code de décompression intégré dans vmlinuz décompresse le noyau.
  4. Initialisation : Le code d’initialisation configure le matériel et prépare l’environnement pour l’exécution du noyau.
  5. 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.

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 :

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 :

bash

make menuconfig make make modules_install

Après la compilation, l’image du noyau non compressée (vmlinux) est convertie en vmlinuz en utilisant des outils de compression comme gzip :

bash

gzip -c vmlinux > vmlinuz

Le fichier vmlinuz est ensuite installé dans le répertoire /boot :

bash

cp vmlinuz /boot/vmlinuz-$(uname -r)

Le boot loader (comme GRUB) doit être configuré pour utiliser la nouvelle image du noyau. Sous GRUB, cela peut être fait avec :

bash

sudo update-grub

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.

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.