Stockage - Le swap

Le swap (espace d’échange) est une zone de stockage sur le disque dur utilisée par le système pour étendre la capacité de la mémoire vive (RAM). Lorsque la RAM atteint sa limite, le swap permet de déplacer temporairement des données moins utilisées vers le disque dur, libérant ainsi de l’espace en RAM pour les données actuellement nécessaires.

Capacité recommandée

RAM Swap Swap si hibernation
⩽ 2Go 2 x la RAM 3 x la RAM
2 Go - 8 Go = à la RAM 2 x la RAM
8 Go - 64 Go ⩾ 4 Go 1,5 x la RAM
⩾ 64 Go ⩾ 4 Go Non recommandée

Swap à partir d’une partition

Créer une partition Swap

Lister les disques et partitions disponibles avec la commande fdisk -l :

# fdisk -l

Créer une partition Swap avec fdisk /dev/sdX :

# fdisk /dev/sdX

Créez une nouvelle partition pour le swap :

  • n : créer une nouvelle partition
  • type de partition : par défaut primaire, appuyez sur Enter
  • numéro de partition : par défaut le prochain disponible, appuyez sur Enter
  • premier secteur : appuyez sur Enter pour utiliser la valeur par défaut
  • taille de la partition : syntaxe +size{K,M,G,T} (+2G pour une partition de 2 Go)
  • t: changer le type de partition, type 82 pour du swap
  • w : sauvegarder les changements

Swap à partir d’un répertoire

En général, les swaps sous Linux sont créés en utilisant des partitions dédiées plutôt que des répertoires.

Cependant il existe des approches alternatives comme l’utilisation de fichiers pour créer un swap.

Créez un fichier pour le swap

La commande dd permet de créer un fichier d’une taille souhaitée, pour un fichier de 2 Go :

# dd if=/dev/zero of=/_MonSWAP bs=1M count=2048

Autorisations

Mettre les bons droits sur /_MonSWAP :

# chmod 600 /_MonSWAP

Swap (partition ou fichier)

Formatez la partition en swap

La commande mkswap permet de formater une partition en tant que partition de swap ou de créer un espace de swap dans un fichier.

# mkswap /dev/sdXn 
# mkswap /_MonSWAP

Activez la partition swap

La commande swapon permet d’activer la nouvelle partition de swap :

# swapon /dev/sdXn
# swapon /_MonSWAP

Vérifier que le swap est bien activé avec swapon -s :

# swapon -s
# swapon -s /dev/sdXn
# swapon -s /_MonSWAP

Ou avec la commande free :

# free -h

Rendre le swap persistant après le redémarrage en ajoutant une entrée dans /etc/fstab.

/dev/sdXn           swap  swap  defaults  0 0
/_MonSWAP none swap defaults 0 0
UUID=1561e[...]1258 swap swap defaults 0 0

Enregistrer les changements et redémarrez le système ou lancer systemctl daemon-reload pour appliquer la configuration du swap.

Priorité des partitions swap

Si vous avez plusieurs partitions destinées au swap, il est possible de prioriser leur utilisation dans /etc/fstab:

UUID=1561e[...]1258   swap    swap    defaults    0   0
/dev/sdXn swap swap pri=5 0 0
/_MonSWAP none swap pri=10 0 0

/!\ Résumé des commandes

Commandes :

# fdisk -l
# fdisk /dev/sdX

# dd if=/dev/zero of=/_MonSWAP bs=1M count=2048

# chmod 600 /chemin

# mkswap /chemin

# swapon -s // Lister les swaps
# swapon -s /chemin // Lister les swaps

# free -h

Fichiers :

/etc/fstab

Cas pratique

Gestion du swap sur un disque ayant déjà une partition (1)

Ici le disque /dev/vdb inclut déjà une table de partition de 1Go et utilise le schéma de partitionnement GPT :

[root@SERVER01 ~]# parted /dev/sdb print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 1075MB 1074MB ext4

Création d’une 2ème partition sur ce disque en tant que swap :

[root@SERVER01 ~]# fdisk /dev/sdb
[...]

Command (m for help): n
Partition number (2-128, default 2): 2
First sector (2099200-10485726, default 2099200): 2099200
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2099200-10485726, default 10485726): +500M

Created a new partition 2 of type 'Linux filesystem' and of size 500 MiB.

Command (m for help): t
Partition number (1,2, default 2): 2
Partition type or alias (type L to list all): swap

Changed type of partition 'Linux filesystem' to 'Linux swap'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Vérification avec lsblk et parted :

[root@SERVER01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 48.4G 0 part
├─rhel-root 253:0 0 44.5G 0 lvm /
└─rhel-swap 253:1 0 3.9G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 500M 0 part
sdc 8:32 0 5G 0 disk
└─sdc1 8:33 0 1G 0 part /root/2024-Archives
sdd 8:48 0 5G 0 disk
└─sdd1 8:49 0 2G 0 part /root/PHOTOS
sr0 11:0 1 9.8G 0 rom
[root@SERVER01 ~]# parted /dev/sdb print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 1075MB 1074MB ext4
2 1075MB 1599MB 524MB swap

Pour s’assurer que le noyau et udev ont bien pris en compte cette nouvelle partition, on utilise udevadm settle :

[root@SERVER01 ~]# udevadm settle

Création du swap avec mkswap :

[root@SERVER01 ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 500 MiB (524283904 bytes)
no label, UUID=474c8c15-b888-47d1-9c7f-c4b794cfe60d

Activation du swap :

[root@SERVER02 ~]# swapon /dev/sdb2

Vérification :

[root@SERVER01 ~]# swapon -show
Filename Type Size Used Priority
/dev/dm-1 partition 4128764 0 -2
/_MonSWAP file 2097148 0 -3
/dev/sdb2 partition 511996 0 -4

Désactiver l’ancien swap (qui techniquement était un fichier faisant office de swap) :

[root@SERVER01 ~]# swapoff /_MonSWAP

Vérification :

[root@SERVER01 ~]# swapon -show
Filename Type Size Used Priority
/dev/dm-1 partition 4128764 0 -2
/dev/sdb2 partition 511996 0 -3

Rendre le swap persistant au démarrage du système en modifiant /etc/fstab :

[root@SERVER01 ~]# lsblk -fp /dev/sdb2
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
/dev/sdb2 swap 1 474c8c15-b888-47d1-9c7f-c4b794cfe60d [SWAP]
[root@SERVER01 ~]# vim /etc/fstab
[...]
UUID=474c8c15-b888-47d1-9c7f-c4b794cfe60d swap swap defaults 0 0

Reload systemd pour que le système applique la nouvelle configuration de /etc/fstab :

[root@SERVER01 ~]# systemctl daemon-reload

Activez le swap :

[root@SERVER01 ~]# swapon -a

Vérification, ici l’ancien fichier de swap /_MonSWAP est revenu car il est toujours présent dans /etc/fstab :

# swapon -show
Filename Type Size Used Priority
/dev/dm-1 partition 4128764 0 -2
/_MonSWAP file 2097148 0 -4
/dev/sdb2 partition 511996 0 -3

Après un redemarrage, le swap /dev/sdb2 sera toujours présent.

Gestion du swap sur un disque ayant déjà une partition (2)

Un disque /dev/sdd est déjà partionné :

[root@SERVER02 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
[...]
sdd 8:48 0 5G 0 disk
└─sdd1 8:49 0 2G 0 part /root/PHOTOS

Sur ce même disque, on créé 2 autres partitions GPT de 512 Mo appelée swap1 et swap2 :

[root@SERVER02 ~]# fdisk /dev/sdd
[...]
Command (m for help): n
Partition number (2-128, default 2): 2
First sector (4196352-10485726, default 4196352): 4196352
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4196352-10485726, default 10485726): +500M

Created a new partition 2 of type 'Linux filesystem' and of size 500 MiB.

Command (m for help): n
Partition number (3-128, default 3): 3
First sector (5220352-10485726, default 5220352): 5220352
Last sector, +/-sectors or +/-size{K,M,G,T,P} (5220352-10485726, default 10485726): +500M

Created a new partition 3 of type 'Linux filesystem' and of size 500 MiB.

Command (m for help): t
Partition number (1-3, default 3): 2
Partition type or alias (type L to list all): swap

Changed type of partition 'Linux filesystem' to 'Linux swap'.

Command (m for help): t
Partition number (1-3, default 3): 3
Partition type or alias (type L to list all): swap

Changed type of partition 'Linux filesystem' to 'Linux swap'.

Command (m for help): w
The partition table has been altered.
Syncing disks.

Vérification avec lsblk et parted :

[root@SERVER02 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
[...]
sdd 8:48 0 5G 0 disk
├─sdd1 8:49 0 2G 0 part /root/PHOTOS
├─sdd2 8:50 0 500M 0 part
└─sdd3 8:51 0 500M 0 part
[root@SERVER02 ~]# parted sdd print
Error: Could not stat device sdd - No such file or directory.
Retry/Cancel? ^C
[root@Redhat1-Test3 ~]# parted /dev/sdd print
Model: VMware Virtual disk (scsi)
Disk /dev/sdd: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 2149MB 2147MB xfs
2 2149MB 2673MB 524MB swap
3 2673MB 3197MB 524MB swap

Pour s’assurer que le noyau et udev ont bien pris en compte cette nouvelle partition, on utilise udevadm settle :

[root@SERVER01 ~]# udevadm settle

Créer les espaces swap :

[root@SERVER02 ~]# mkswap /dev/sdd2
Setting up swapspace version 1, size = 500 MiB (524283904 bytes)
no label, UUID=f8c609eb-d7e9-47a3-8c8c-226bf07c937d
[root@SERVER02 ~]# mkswap /dev/sdd3
Setting up swapspace version 1, size = 500 MiB (524283904 bytes)
no label, UUID=d5afaf8c-b0fe-44af-a514-1f1069db7ea0

Définir la priorité et le nom des swaps :

[root@SERVER02 ~]# vim /etc/fstab
[...]
UUID=284c4620-69cd-48b5-9cc7-8a6ea145611a /root/PHOTOS xfs defaults 0 0
UUID=f8c609eb-d7e9-47a3-8c8c-226bf07c937d swap1 swap pri=10 0 0
UUID=d5afaf8c-b0fe-44af-a514-1f1069db7ea0 swap2 swap pri=20 0 0

Reload systemd pour relire /etc/fstab :

[root@SERVER02 ~]# systemctl daemon-reload

À ce stade, le swap n’est pas actif, le FSTYPE est bien swap mais il n’y a pas de MOUNTPOINTS défini :

[root@SERVER02 ~]# lsblk -fp
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
[...]
/dev/sdd
├─/dev/sdd1 xfs 284c4620-69cd-48b5-9cc7-8a6ea145611a
├─/dev/sdd2 swap 1 f8c609eb-d7e9-47a3-8c8c-226bf07c937d
└─/dev/sdd3 swap 1 d5afaf8c-b0fe-44af-a514-1f1069db7ea0

Activation des swaps :

[root@SERVER02 ~]# swapon -a
[root@SERVER02 ~]# swapon --show
NAME TYPE SIZE USED PRIO
/dev/sdd2 partition 500M 0B 10
/dev/sdd3 partition 500M 0B 20
[root@SERVER02 ~]# lsblk -fp
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
[...]
├─/dev/sdd1 xfs 284c4620-69cd-48b5-9cc7-8a6ea145611a
├─/dev/sdd2 swap 1 f8c609eb-d7e9-47a3-8c8c-226bf07c937d [SWAP]
└─/dev/sdd3 swap 1 d5afaf8c-b0fe-44af-a514-1f1069db7ea0 [SWAP]

Au redémarrarre :

[aline@SERVER02 ~]$ mount | grep /PHOTOS
/dev/sdd1 on /root/PHOTOS type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

5.4. Vérifiez que le système active les deux espaces d’échange.

[aline@SERVER02 ~]# swapon --show
NAME TYPE SIZE USED PRIO
/dev/sdd3 partition 500M 0B 20
/dev/sdd2 partition 500M 0B 10

Documentation

MAN fdisk
MAN mkswap(8)
MAN swapon(8)
MAN swapoff(8)
MAN dd

> Partager <