Suivant: , Précédent: , Monter: Configuration du système   [Table des matières][Index]


11.6 Espace d’échange

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 au démarrage (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).

Type de données :swap-space

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 au démarrage 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]