Mise en veille prolongée et reprise à partir d'un fichier d'échange

23

J'ai configuré une nouvelle installation Ubuntu dans un ordinateur portable pour utiliser un fichier d'échange, au lieu d'utiliser une partition d'échange.

Par défaut, il n'est pas possible d'obtenir Ubuntu pour hiberner en utilisant un fichier d'échange, j'ai donc essayé ce tutoriel , mais il est spécifique à grub1 , et Ubuntu utilise maintenant grub2 .

Est-ce que quelqu'un sait comment faire ça?

tfmoraes
la source

Réponses:

21

Mise en veille prolongée avec fichier d'échange à l'aide de uswusp

Bien qu'il soit possible d'hiberner pour permuter le fichier et cela fonctionne censément avec systemd hibernate en définissant les paramètres du noyau. Cependant, je n'ai pas pu le faire reprendre, alors je suis passé à l'utilisation de uswsusp (suspension du logiciel de l'espace utilisateur) . Voici les étapes que j'ai utilisées sur Ubuntu 17.04 / 17.10.

Créer le fichier d'échange

Les commandes pour créer un fichier d'échange 4GiB formaté, monté et ajouté à /etc/fstab:

sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

Vérifier la partition de fichier d'échange

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

Installer la suspension du logiciel de l' espace utilisateur (uswsusp)

sudo apt install uswsusp

Configurer uswsusp

Pour créer /etc/uswsusp.confet recréer initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • Yesà « Continuer sans espace d'échange valide? ' (L'assistant n'a pas encore défini le fichier d'échange.)
  • Sélectionnez la partition sur laquelle réside le fichier d'échange, référence croisée avec les détails findmntci-dessus. ( Remarque: pas le fichier d'échange lui-même )

Remarque: Toutes les modifications apportées manuellement /etc/uswsusp.confnécessiteront une recréation initramfsultérieure avec cette commande:

sudo update-initramfs -u

Test uswusp hibernate

sudo s2disk

Il devrait y avoir des snapshotmessages à l'écran lors de la mise en veille prolongée et de la reprise.

Utiliser s2disk avec systemd hibernate

Par défaut, systemd utilisera ses propres commandes hibernate alors remplacez-les par les commandes uswusp en remplaçant systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

Dans l'éditeur de texte qui s'ouvre, placez le texte suivant (le ExecStart vierge est requis). Ensuite, enregistrez et quittez:

[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk 
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep

Cela créera un /etc/systemd/system/systemd-hibernate.service.d/override.conffichier avec les détails de remplacement.

Test du système en hibernation:

systemctl hibernate 

Remarque: Pour vérifier que le systemd override.confa été créé, chargé et qu'il n'y a aucune erreur, exécutez:

systemctl status systemd-hibernate.service

Les références:

Cas
la source
Ces instructions semblent fonctionner mais l'hibernation systemd ne fonctionne pas pour moi. L'avez-vous testé vous-même? Si c'est le ExceStart=run-parts -a post /lib/systemd/system-sleepcasExceStartPost=run-parts -a post /lib/systemd/system-sleep
Joaquín Aramendía
Il a été testé et fonctionne mais peut-être que cet ajout est nécessaire. J'ai mis à jour ma réponse.
Cas
Cela ne semble pas tout à fait correct. L' enableoption des systemctl liens symboliques de /etc/systemd/system/à /lib/systemd/system/. Vous ne devriez jamais copier directement dans/etc/systemd/system/
Auspex
1
Je n'ai pas réussi à faire ça 😞. J'ai installé swapfile, installé et configuré uswsusp, mais sudo s2diskuniquement les journaux Saving snapshot, puis éteint l'écran, se bloque pendant environ 5 minutes, puis il arrête l'ordinateur. Cependant, après l'avoir allumé, il démarre normalement comme s'il n'y avait pas d'hibernation.
m93a
1
Je pense que cette ligne sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swapdevrait être remplacée parsudo findmnt -no SOURCE,UUID -T /swapfile
user1915011
12

Voici ce que j'ai fait pour le faire fonctionner avec Ubuntu 18.04.

  • Faites en /swapfilesorte d'avoir au moins la taille de votre RAM

    sudo swapoff /swapfile
    sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | grep MemTotal | grep -oh '[0-9]*') count=1024 conv=notrun
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  • Notez l'UUID de la partition contenant votre /swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • Reconfigurez le package uswsuspafin d'utiliser correctement le fichier d'échange:

    sudo dpkg-reconfigure -pmedium uswsusp
    # Answer "Yes" to continue without swap space
    # Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
    # Encrypt: "No"
    
  • Modifiez le service SystemD hibernate à l'aide de sudo systemctl edit systemd-hibernate.serviceet remplissez-le avec le contenu suivant:

    [Service]
    ExecStart=
    ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
    ExecStart=/usr/sbin/s2disk
    ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep
    
  • Notez le décalage de reprise de votre /swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • Configurez Grub pour reprendre à partir du fichier d'échange en modifiant /etc/default/grubet en modifiant la ligne suivante:

    GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
    
  • Mettre à jour Grub:

    sudo update-grub
    
  • Créez les éléments suivants /etc/initramfs-tools/conf.d/resume:

    RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
    
  • Mettre à jour initramfs:

    sudo update-initramfs -u -k all
    

Vous pouvez maintenant hiberner avec sudo systemctl hibernate.

On peut également créer ces scripts:

    sudo tee /usr/local/bin/gotosleep <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo /usr/sbin/s2both
    EOF
    sudo chmod +x /usr/local/bin/gotosleep
    sudo tee /usr/local/bin/gotohibernation <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo systemctl hibernate
    EOF
    sudo chmod +x /usr/local/bin/gotohibernation

Vous pouvez donc dormir avec gotosleepou hiberner avec gotohibernation.

Vous devez être en mesure d'exécuter sudo s2both, sudo s2ramet sudo systemctl hibernatesans avoir à saisir votre mot de passe pour les scripts précédents au travail.

Vous pouvez le faire par exemple en créant un powerdevgroupe, ajoutez-y votre utilisateur actuel et configurez la configuration sudoers suivante (modifiez-la avec sudo visudo -f /etc/sudoers.d/powerdev):

     %powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate

Documentation utilisée:

Anthony O.
la source
Merci pour ça! J'ai essayé de nombreuses méthodes, mais seule la vôtre fonctionne pour moi sur Ubuntu 18.04 :)
jirislav
Cela me fait presque envie d'essayer à nouveau d'hibernation - j'ai eu un problème avec une corruption occasionnelle sur mes disques, qui était apparemment liée au processus d'hibernation. Avez-vous rencontré quelque chose comme ça?
Charles Green
Merci, @Anthony! J'ai essayé tellement de choses pour mettre l'hibernation au travail. La vôtre était la solution finale qui l'a fait. Il me semble très étrange que cela ne soit pas configuré correctement tout de suite. :(
Mike Williamson
Merci pour ce guide. Après avoir suivi les étapes puis essayé d'hiberner à l'aide de $ sudo systemctl hibernate, mon ordinateur portable se réveille quelques secondes après avoir essayé d'hiberner. / var / log / syslog affiche de nombreuses erreurs, mais celles-ci semblent les plus pertinentes: - Impossible de définir le mode d'économie d'énergie pour la sortie eDP-1: autorisation refusée ... - L'objet .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150), a déjà été finalisé. Impossible de lui attribuer une propriété. ... - s2disk: impossible d'utiliser le périphérique de reprise (essayez le swapon -a). Raison: aucun appareil de ce type - systemd-hibernate.service: processus principal terminé, code = sorti, ...
Jelani Nelson
1
C'est la seule solution qui a fonctionné pour moi. Je me suis connecté juste pour voter pour cette réponse. Merci.
dpetrini
8

J'ai donné une lecture rapide au tutoriel et, si j'ai bien compris, il vous suffit de spécifier les resumeoptions de la ligne de commande Linux. Avec Grub2, c'est vraiment simple, et vos modifications seront toujours préservées. Vous devez modifier le /etc/default/grubfichier, en particulier cette ligne:

GRUB_CMDLINE_LINUX="resume=... resume_offset=..."

Après cela, exécutez sudo update-grubpour que les modifications prennent effet.

La modification GRUB_CMDLINE_LINUXn'affectera pas les autres installations Linux que vous avez (car /etc/grub.d/30_os-probern'utilise pas cette variable).

À propos du problème que vous rencontrez: la partition du fichier d'échange est-elle cryptée? Si c'est le cas, l'hibernation ne fonctionnera pas. Sinon, la sortie de filefrag -v /swapfilepeut être utile.

Andrea Corbellini
la source
Merci! Je vais essayer. Mais je pense que cela configure toutes les entrées Linux dans grub avec cette ligne.
tfmoraes
N'oubliez pas: après avoir changé, /etc/default/grubvous devez courirupdate-grub .
janvier
@tfmoraes: pourquoi ne voudriez-vous pas que cela soit ajouté à toutes les entrées Linux?
janvier
@JanC: Parce que d'autres distributions Linux peuvent être installées.
tfmoraes
1
@ didi_X8 ce commentaire a été écrit il y a 8 ans. Il est possible que les choses aient changé depuis lors. Merci d'avoir partagé.
Andrea Corbellini