Suivant: Comptes utilisateurs, Précédent: Périphériques mappés, Monter: Configuration du système [Table des matières][Index]
Un espace d’échange est un espace disque spécifiquement dédié à la pagination mémoire : le processus en charge de la gestion de la mémoire (le noyau Linux ou le gestionnaire par défaut du Hurd) peut décider que certaines pages mémoire stockées en RAM qui appartiennent à un processus en cours d’exécution mais qui sont inutilisées devraient plutôt être stockées sur disque. Il les décharge de la RAM pour libérer la précieuse mémoire rapide, et les écrit sur l’espace d’échange. Si le programme essaye d’accéder à la page, le processus de gestion de la mémoire la charge à nouveau dans la mémoire pour que le programme puisse l’utiliser.
Une idée fausse répandue sur l’espace d’échange est qu’il n’est utile que lorsque seule une petite quantité de RAM est disponible sur le système. En réalité, vous devriez savoir que les noyaux utilisent souvent toute la RAM disponible pour le cache des accès disques pour rendre les opérations d’entrée-sortie plus rapides. En conséquence, déplacer des pages mémoire inutilisées augmentera la quantité de RAM disponible pour ce cache.
Pour une description plus complète de la gestion de la mémoire du point de vue d’un noyau monolithique, voir Memory Concepts dans le manuel de référence de la bibliothèque C de GNU.
Le noyau Linux prend en charge les partitions d’échanges et les fichiers d’échange : le premier utilise une partition disque complète pour la pagination, alors que le second utilise un fichier sur un système de fichiers pour cela (le pilote du système de fichiers doit le prendre en charge). Pour une configuration comparable, les deux ont les mêmes performances, donc vous devriez considérer la facilité d’utilisation pour vous décider entre les deux. Les partitions sont « plus simples » et n’ont pas besoin de la prise en charge dans le système de fichiers, mais ont besoin d’être allouées au formatage du disque (en oubliant les volumes logiques), alors que les fichiers peuvent être alloués et désalloués à n’importe quel moment.
Un espace d’échange est également requis pour mettre le système en hibernation (également appelé suspens sur disque), état dans lequel la mémoire est copiée dans l’espace d’échange avant l’extinction pour qu’elle puisse être récupérée après le redémarrage de la machine. L’hibernation utilise au plus la moitié de la taille de la RAM dans l’espace d’échange configuré. Le noyau Linux a besoin de connaître l’espace d’échange à utiliser lorsqu’il sort d’hibernation à l’amorçage (via un argument du noyau). Lorsque vous utilisez un fichier d’échange, sa position sur le périphérique qui le contient doit être donnée au noyau. Cette valeur doit être mise à jour si le fichier est de nouveau initialisé en tant qu’espace d’échange — p. ex. si sa taille a changé.
Remarquez que l’espace d’échange n’est pas remis à zéro à l’extinction donc les données sensibles (comme les mots de passe) peuvent y rester si elles y ont été déplacées. De fait, vous devriez faire résider votre espace d’échange sur un périphérique chiffré (voir Périphériques mappés).
Les objets de ce type représentent des espaces d’échange. Ils contiennent les membres suivants :
target
Le périphérique ou le fichier à utiliser, soit un UUID, soit un
file-system-label
, soit une chaine, comme dans la définition d’un
file-system
(voir Systèmes de fichiers).
dependencies
(par défaut : '()
)Une liste de d’objets file-system
ou mapped-device
, dont
dépend la disponibilité de l’espace. Remarquez que, tout comme pour les
objets file-system
, les dépendances qui sont requises à l’amorçage et
montées au plus tôt en espace utilisateur ne sont pas gérées par le
Shepherd, et sont donc automatiquement retirées pour vous.
priority
(par défaut : #f
)Seulement pris en charge par le noyau Linux. Soit #f
pour désactive
la priorité de l’espace d’échange, soit un entier entre 0 et 32767. Le noyau
utilisera d’abord les espaces d’échange avec la plus grande priorité, et
utilisera les espaces d’échange de même priorité à tour de rôle. Le noyau
utilisera les espaces d’échange sans priorité après les espaces
prioritaires, et dans l’ordre dans lequel ils sont apparus (donc pas à tour
de rôle).
discard?
(par défaut : #f
)Uniquement pris en charge par le noyau Linux. Lorsque la valeur est vraie, le noyau notifiera le contrôleur de disque des pages supprimées, par exemple avec l’opération TRIM sur les disques SSD.
Voici quelques exemples :
(swap-space (target (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
Utilise la partition de swap avec l’UUID donné. Vous pouvez voir l’UUID
d’une partition de swap Linux en lançant swaplabel device
,
où device est le nom de fichier /dev de cette partition.
(swap-space
(target (file-system-label "swap"))
(dependencies mapped-device))
Utilise la partition avec l’étiquette swap
, qui peut être trouvée
après que tous les périphériques mappés mapped-devices ont été
ouverts. De nouveau, la commande swaplabel
vous permet de voir et
de changer l’étiquette d’une partition swap de Linux.
Voici un exemple plus complet de la partie file-systems
d’une
déclaration operating-system
.
(file-systems (list (file-system (device (file-system-label "root")) (mount-point "/") (type "ext4")) (file-system (device (file-system-label "btrfs")) (mount-point "/btrfs") (type "btrfs")))) (swap-devices (list (swap-space (target "/btrfs/swapfile") (dependencies (filter (file-system-mount-point-predicate "/btrfs") file-systems)))))
utilise le fichier /btrfs/swapfile comme espace d’échange, ce qui dépend du système de fichiers monté sur /btrfs. Remarquez comment nous utilisons la fonction filter de Guile pour élégamment sélectionner le système de fichiers !
(swap-devices (list (swap-space (target "/dev/mapper/my-swap") (dependencies mapped-devices)))) (kernel-arguments (cons* "resume=/dev/mapper/my-swap" %default-kernel-arguments))
Le bout de code précédent provient d’une déclaration operating-system
et permet d’utiliser le périphérique mappé /dev/mapper/my-swap (qui
peut faire partie d’un périphérique chiffré) en tant qu’espace d’échange, et
dit au noyau de l’utiliser pour l’hibernation via l’argument du noyau
resume
(voir Référence de operating-system
, kernel-arguments
).
(swap-devices (list (swap-space (target "/swapfile") (dependencies (filter (file-system-mount-point-predicate "/") file-systems))))) (kernel-arguments (cons* "resume=/dev/sda3" ;device that holds /swapfile "resume_offset=92514304" ;offset of /swapfile on device %default-kernel-arguments))
This other snippet of operating-system
enables the swap file
/swapfile for hibernation by telling the kernel about the partition
containing it (resume
argument) and its offset on that partition
(resume_offset
argument). The latter value can be found in the
output of the command filefrag -e
as the first number right under
the physical_offset
column header (the second command extracts its
value directly):
$ sudo filefrag -e /swapfile Filesystem type is: ef53 File size of /swapfile is 2463842304 (601524 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 2047: 92514304.. 92516351: 2048: … $ sudo filefrag -e /swapfile | grep '^ *0:' | cut -d: -f3 | cut -d. -f1 92514304
Suivant: Comptes utilisateurs, Précédent: Périphériques mappés, Monter: Configuration du système [Table des matières][Index]