GNU/Linux >> Tutoriels Linux >  >> Linux

Hibernation sans échange activée

  1. Désactiver le swap lorsque vous savez déjà que votre système peut arriver au point où il n'aura pas assez de mémoire est une mauvaise idée . Juste au moment où le noyau n'a pas de mémoire pour allouer votre système sera probablement très-très ne répond pas ou se bloque simplement, vous devrez donc le redémarrer. Les blocages peuvent entraîner des pertes de données, parfois une corruption du système de fichiers. Selon le système de fichiers, il peut être corrigé automatiquement (famille ext*, famille fat, btrfs et quelques autres), mais tous les FS ne prennent pas en charge cette fonctionnalité. Je parie que vous n'aimerez probablement pas exécuter fsck en mode mono-utilisateur à chaque fois que vous avez une corruption...

  2. Le noyau n'est pas si stupide d'écrire tout ce qu'il veut sur votre SSD, il se comporte différemment des disques durs et essaie de faire le moins d'écritures possibles en utilisant des éléments tels que TRIM. Il n'y a pas autant de mal à votre conduite que vous pourriez le penser.

  3. L'hibernation est un intégré sous-système du noyau qui fonctionne à un niveau bas. Il doit toujours avoir une partition séparée avec une taille ≥ RAM lui permettant de faire un instantané complet de votre mémoire. Ici, vous pouvez lire comment Linux gère l'hibernation. S'il n'y a pas d'endroit pour stocker en permanence l'image mémoire, il n'y a aucun moyen que l'hibernation fonctionne. Vous ne pouvez pas stocker de données dans l'air. Pas de stockage physique permanent =pas d'hibernation. C'est donc aussi la réponse à votre question :vous ne pouvez pas utiliser l'hibernation sans swap sous Linux .

Donc, mon point est que vous pouvez bien sûr vivre sans échange et l'activer uniquement pour l'hibernation, mais seulement si vous êtes sûr que 99,9% du temps, le système est allumé, il a assez de mémoire pour tout. Si ce n'est pas votre cas, vous devez utiliser swap.

Passons maintenant à la solution possible :

Lorsque vous exécutez systemctl hibernate systemd démarre un service appelé systemd-hibernate.service . Fichier d'unité dont il se trouve généralement /usr/lib/systemd/system/ répertoire

Sur Debian, cela ressemble à ceci :

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target
After=sleep.target

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate

Comme vous pouvez le voir, il y a des exigences et Après options. Nous pouvons écrire une autre unité qui activera le swap et ajoutera son nom à ces champs. Nous l'appellerons swap-on.service et placez-le dans /etc/systemd/system/ répertoire

Notre fichier ressemblera à ceci :

# Unit filed is not required in our case so you can skip it
[Unit]
Description=Enable swap partition

[Service]
# This line means that service will be executed just once and immediately stop when
# swapon enables swap on /dev/sda3
Type=oneshot

# Change /dev/sda3 with device named after your swap partition 
# like /dev/sdb3 or /dev/nvme0n1p3
# Use lsblk to determine your swap partition (partition with [SWAP] as mountpoint)
# Of course you can think of a more complex solution like running external script
# that determines your swap partition automatically every time service is executed
# but for now I'll go with simple /dev/sda3
ExecStart=/sbin/swapon /dev/sda3

Nous devons maintenant modifier le systemd-hibernate.service de notre système :

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target swap-on.service <--
After=sleep.target swap-on.service <--

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate

Nous dupliquons swap-on.service dans After pour s'assurer que systemd démarre l'hibernation après le swap est activé et non l'inverse et dans Requis pour s'assurer que systemd n'essaiera pas d'hiberner si swap-on.service échoué.

Maintenant, lorsque nous exécutons systemctl hibernate systemd exécute notre systemd-hibernate.service modifié qui exécute swap-on.service qui permet l'échange. Lorsque l'échange est activé et que les champs Requis et Après sont satisfaits, systemd peut enfin mettre notre système en veille prolongée.

Pour que systemd désactive l'échange après la reprise de l'hibernation, nous n'aurons pas besoin de créer un autre fichier de service appelé swap-off.service qui fera la même chose que notre swap-on.service , placez-le dans le même répertoire que le service "on" (/etc/systemd/system/). La seule différence est que ce service exécutera swapoff au lieu d'échanger :

[Unit]
Description=Disable swap partition

[Service]
Type=oneshot

#  again, change /dev/sda3 to your swap partition /dev file
ExecStart=/sbin/swapoff /dev/sda3 <--

L'étape suivante consiste à modifier le fichier de service appelé [email protected] situé dans le même /usr/lib/systemd/system répertoire :

[Unit]
Description=Resume from hibernation using device %f
Documentation=man:[email protected](8)
DefaultDependencies=no
BindsTo=%i.device
Wants=local-fs-pre.target
After=%i.device
Before=local-fs-pre.target
ConditionPathExists=/etc/initrd-release

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-hibernate-resume %f

Nous devons modifier Avant champ maintenant. Ajouter swap-off.service à côté de local-fs-pre.target :

...
After=%i.device
Before=local-fs-pre.target swap-off.service <--
ConditionPathExists=/etc/initrd-release
...

Maintenant, lorsque vous sortez de l'hibernation, systemd exécutera swap-off.service après le chargement de l'image d'échange en mémoire (en fait un peu plus tard, mais cela n'a pas d'importance pour nous)

Gardez à l'esprit qu'il s'agit d'une solution entièrement théorique, je ne l'ai pas encore essayée, mais d'après ce que je sais de systemd, cela devrait fonctionner. Étant donné que UPower demande à systemd d'hiberner, ce qui, comme je l'ai expliqué, exécute systemd-hibernate.service, c'est probablement ce que vous recherchez


Linux
  1. Swap est-il un anachronisme ?

  2. Service du système d'exploitation Linux "dhcpd"

  3. Service d'exploitation Linux "anacron"

  4. Service d'exploitation Linux "iptables"

  5. Service de système d'exploitation Linux "réseau"

Comment répertorier les services de démarrage au démarrage sous Linux

Service d'exploitation Linux "xendomains"

Service de système d'exploitation Linux « nscd »

Service d'exploitation Linux "squid"

Service d'exploitation Linux "smartd"

Puis-je exécuter un serveur Oracle sans swap ?