Outils pour utilisateurs

Outils du site


cours:informatique:sysadmin:serveur_fichiers_linux:220_systeme_de_fichier_ext4

Notes et transcriptions du cours “Montez un serveur de fichiers sous Linux” disponible sur la plateforme Openclassrooms.

Gérez le système de fichier ext4

Dans le chapitre précédent, vous avez formaté une partition au format ext4 qui est le système de fichier par défaut d’Ubuntu. Dans cette partie, vous allez en apprendre un peu plus sur ce format de système de fichier puis vous verrez comment redimensionner votre partition.

Optimisez une partition ext4 avec tune2fs

Sur votre serveur vm-serveur , tapez la commande :

sudo tune2fs -l /dev/sdb1

Pour afficher les informations de votre partition /dev/sdb1 . Comme vous pouvez le voir, il y a beaucoup d’informations. Ici, nous allons seulement détailler les plus importantes.

Filesystem volume name:   <none>
Filesystem UUID: 8c2d60b0-9435-4852-b857-d2fd367d3e79

Actuellement, vous avez identifié votre partition (notamment dans /etc/fstab) par son nom de périphérique /dev/sdb1.

La limite de cette nomination c’est que les noms de périphériques sont attribués en fonction du premier disque détecté au démarrage… et ça peut changer. En particulier si vous vous amusez à brancher vos disques sur un connecteur différent.

Ext4 vous propose donc un identifiant aléatoire unique (le UUID) pour identifier votre disque ainsi que la possibilité de définir un label, un nom personnalisé qui sera peut-être plus compréhensible par un humain. Vous pourrez ensuite utiliser ces noms dans votre fichier /etc/fstab et dans la plupart des commandes qui manipulent des partitions.

Filesystem state:         clean

Bonne nouvelle ! Votre système de fichier est “propre”, c’est-à-dire qu’il fonctionne normalement. Nous verrons plus loin comment le réparer en cas de problème.

Inode count:              65536
Block count:              261883
Reserved block count:     13094
Block size:               4096

Sur votre partition, les données sont stockées sous forme de blocs. Ici, la taille d’un bloc est fixée à 4096 octets, soit 4ko. Nous avons 261883 blocs de 4ko ce qui correspond bien à 1Go de stockage. Un fichier occupera au minimum un bloc de 4ko et un fichier de plus de 4ko occupera autant de blocs que nécessaire.

Le schéma ci-dessus indique le remplissage des blocs de 4ko sur un système de fichier ext4 pour des fichiers de 1ko, 6ko et 15ko. Ext4 écrit les fichiers par blocs.

Si vous deviez stocker principalement des milliers de fichiers de 1ko, il pourrait être intéressant de diminuer la taille des blocs pour limiter l’espace perdu.

Pour que le système puisse retrouver les blocs de données qui correspondent à un même fichier, il stocke l’adresse des blocs dans un nœud d’index qu’on appelle inode. Sur votre partition, vous avez ainsi 65536 inodes disponibles ; ce qui veut dire que vous ne pourrez pas créer plus de 65536 fichiers sur cette partition.

Sur des partitions très petites avec un grand nombre de fichiers, vous pouvez être à court d’inodes avant d’être à court de blocs.

Si vous avez des erreurs indiquant un “disque plein” alors que vous voyez qu’il vous reste de l’espace libre, pensez à vérifier vos inodes.

Vous pouvez vérifier :

  • L’espace libre sur vos disques par la commande df -h ;
  • Le nombre d’inodes disponibles par la la commande df -hi.

Enfin, vous voyez que 13094 blocs sont réservés. En effet, par défaut, 5% des blocs sont réservés à l’utilisateur root. C’est principalement utile pour permettre à l’utilisateur root de pouvoir se connecter à un système dont le disque serait plein.

On peut utiliser tune2fs pour modifier tous ces attributs :

  • Pour mieux identifier votre partition de données, vous allez l’appeler “DATA1” via l'option -L.
  • Sur une partition dédiée à du stockage de données, vous n’avez pas besoin de blocs réservés. Vous allez donc supprimer cette réservation via l' option -m 0.
df -h /dev/sdb1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       991M  2.6M 922M   1% /var/data1
 
sudo tune2fs -m 0 -L DATA1 /dev/sdb1
tune2fs 1.44.1 (24-Mar-2018)
Setting reserved blocks percentage 0% (0 blocks)
 
$ df -h /dev/sdb1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       991M  2.6M 973M   1% /var/data

Voilà, on a gagné 50Mo de stockage. Vous pouvez maintenant remplacer /dev/sdb1 par LABEL=DATA1 dans votre fichier /etc/fstab.

LABEL=DATA1 /mnt/data ext4 defaults 0 0

Redimensionnez une partition ext4

Sur votre disque de données /dev/sdb de 1Go, vous n’avez créé qu’une partition qui s’étend sur tout le disque. On peut imaginer des cas où on aurait besoin, a posteriori, de disposer de deux partitions sur ce disque. Par exemple, pour créer une nouvelle partition de 200Mo, on aurait besoin de :

  • Réduire notre système de fichier ext4 de 1Go à 800Mo ;
  • Réduire la partition /dev/sdb1 à 800Mo également ;
  • Créer une partition /dev/sdb2 de 200Mo ;
  • Formater cette partition /dev/sdb2.

Ci-dessous, le schéma des trois couches à prendre en compte : le disque physique, la partition, le système de fichier. Il faudra agir en premier sur la couche la plus haute.

Évidemment, ça n’est pas magique, vous ne pourrez réduire la taille d’une partition que dans la limite de la taille disponible sur cette partition.

Pour réduire une partition ext4, il est nécessaire qu’elle soit démontée :

# Équivalent à umount /dev/sdb1
sudo umount LABEL=DATA1

On va ensuite préparer la partition grâce à la commande e2fsck qui va vérifier que votre système de fichier est propre et rassembler les blocs au début de partition si besoin.

On pourra alors procéder au redimensionnement avec resize2fs

sudo e2fsck -f /dev/sdb1
 
e2fsck 1.45.5 (07-Jan-2020)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
DATA1: 12/65536 files (0.0% non-contiguous), 8860/261883 block

Pour réparer votre système de fichiers en cas de crash, vous pourrez utiliser la commande e2fsck -y /dev/sdb1 qui demandera à e2fsck de réparer automatiquement votre système de fichiers.

En général ça marche assez bien et s’il retrouve des fichiers perdus, il les placera dans le répertoire lost+found à la racine de la partition.

On peut à présent redimensionner le système de fichier :

sudo resize2fs /dev/sdb1 700M

Ce schéma représente le système de fichier réduit à 700Mo mais la partition fait toujours 1Go.

C’est moins que les 800Mo annoncés, c'est une marge volontaire pour éviter une perte de données liée aux différences d'unités utilisées par les commandes resize2fs et gdisk (le réajustement se fera ultérieurement).

En effet :

  • resize2fs calcule les tailles en blocs de 4096 octets ;
  • gdisk compte en secteurs disques de 512 octets,

il est parfois difficile de parfaitement synchroniser la taille du système de fichier avec la taille de la partition.

Ce qui compte, c’est d’éviter à tout prix d’avoir une partition plus petite que votre système de fichiers : c’est comme mettre des chaussures trop petites, ça fait mal ! On pourra agrandir votre système de fichier par la suite pour occuper l’espace vide.

À ce stade, la partition /dev/sdb1 fait encore 1Go. Nous allons la réduire à 800Mo et créer une seconde partition de 200Mo grâce à gdisk.

En réalité, ce qu’il faut faire pour notre première partition, c’est la supprimer puis la recréer. Heureusement, cette opération ne touche pas aux données mais seulement à la table de partition.

Commencez par supprimer la partition :

# Démarrer gdisk en mode interactif
sudo gdisk /dev/sdb

Créez ensuite un nouvelle partition de 800Mo :

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-2097118, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-2097118, default = 2097118) or {+-}size{KMGTP}: 800M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem

Pour la seconde partition, gdisk vous propose directement de la placer à la suite de la première et de l’étendre jusqu’à la fin du disque : ça vous va très bien, confirmez.

Indiquez simplement 8200 pour le code hexadécimal de la partition ce qui correspond à une partition de swap (il fallait bien choisir d’en faire quelque chose).

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-2097118, default = 1640448) or {+-}size{KMGTP}:
Last sector (1640448-2097118, default = 2097118) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap

Vérifiez que la table de partition est correcte :

Command (? for help): p
Disk /dev/sdb: 2097152 sectors, 1024.0 MiB
Model: VBOX HARDDISK
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 52A98F48-8F15-4DC8-8483-A65140F9AF00
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 2097118
Partitions will be aligned on 2048-sector boundaries
Total free space is 4061 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size     Code  Name
  1          2048         1638400   799.0 MiB  8300 Linux filesystem
  2            1640448         2097118   223.0 MiB  8200 Linux swa

Si c’est bon, vous pouvez enregistrer les changements en frappant : W et en confirmant les changements.

Sur le schéma ci-dessous on représente les 3 couches de stockages mais avec une partition de 800Mo et une partition de 200Mo. Vous avez maintenant 2 partitions et un système de fichier sur la 1ère.

Il nous reste maintenant à ajuster la taille de notre système de fichier ext4 à la taille de la partition avec la commande resize2fs :

$ sudo resize2fs /dev/sdb1
e2fsck 1.45.5 (07-Jan-2020)
Resizing the filesystem on /dev/sdb1 to 204544 (4k) blocks.
The filesystem on /dev/sdb1 is now 204544 (4k) blocks long

Voilà l’astuce : sans indication de taille, resize2fs ajuste la taille du système de fichier à la taille disponible sur la partition. Ça vous évite de calculer à l’octet près l’espace à ajouter.

Pour utiliser votre espace de swap nouvellement créé, il suffit de formater la partition puis d’indiquer au noyau Linux que cet espace est prêt à être utilisé :

sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2

Enfin, pour activer cette partition de swap au démarrage, ajoutez la ligne suivante à votre fichier /etc/fstab :

/dev/sdb2    none    swap    sw    0 0

Ci-dessous le schéma présente les 3 couches de stockage mais avec un système de fichier ext4 de 800Mo sur la 1ere partition et un système de fichier swap de 200Mo sur la 2e.

On a bien un partitionnement final avec une partition ext4 de 800Mo et une partition de swap de 200Mo.

Bravo, vous avez partitionné votre disque de données !

En résumé

  • L’espace disponible sur une partition ext4 est limité par le nombre de blocs et par le nombre d’inodes ;
  • On modifie des attributs du système de fichiers ext4 par la commande tune2fs ;
  • Pour réparer un système de fichiers ext4, vous utiliserez la commande e2fsck ;

Dans le prochain chapitre, vous verrez comment vous prémunir de défaillances matérielles grâce à la technologie RAID.

◁ Précédent | ⌂ Retour au sommaire | Suivant ▷

cours/informatique/sysadmin/serveur_fichiers_linux/220_systeme_de_fichier_ext4.txt · Dernière modification : 2024/02/04 13:32 de yoann