web-dev-qa-db-fra.com

Hibernate et reprendre à partir d'un fichier d'échange

J'ai configuré une nouvelle installation Ubuntu dans un bloc-notes pour utiliser un fichier d'échange au lieu d'utiliser une partition d'échange.

Par défaut, il n’est pas possible de mettre en veille prolongée Ubuntu à l’aide d’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 cela?

22
tfmoraes

Hibernate avec le fichier d'échange en utilisant uswusp

Bien qu'il soit possible d'hiberner pour échanger un fichier et que cela fonctionne soi-disant avec systemd hibernate en définissant les paramètres du noyau. Cependant, je ne pouvais pas le faire reprendre, alors je suis passé à l’utilisation de uswsusp (suspension du logiciel dans l’espace utilisateur) . Voici les étapes que j'ai suivies sur Ubuntu 17.04/17.10.

Créer le fichier d'échange

Les commandes permettant de 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 /mnt/4GiB.swap
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

Installer le logiciel en mode utilisateur Suspend (uswsusp)

Sudo apt install uswsusp

Configurez uswsusp

Pour créer /etc/uswsusp.conf et recréer initramfsname__:

Sudo dpkg-reconfigure -pmedium uswsusp
  • Yesto ' 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 de findmntci-dessus. ( Remarque: pas le fichier d'échange lui-même )

Remarque: Toute modification apportée manuellement à /etc/uswsusp.conf nécessitera la recréation de initramfsà l'aide de la commande suivante:

Sudo update-initramfs -u

Testez uswusp hiberner

Sudo s2disk

Il devrait y avoir des messages snapshotà l'écran en veille prolongée et reprendre.

Utilisez s2disk avec Systemd Hibernate

Par défaut, systemd utilisera ses propres commandes de veille prolongée, aussi, remplacez-les par les commandes uswusp en remplaçant le systemd-hibernate.service:

Sudo systemctl edit systemd-hibernate.service

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

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

Cela créera un fichier /etc/systemd/system/systemd-hibernate.service.d/override.conf avec les détails de la substitution.

Testez systemd hibernate:

systemctl hibernate 

Remarque: pour vérifier que le code système override.conf a été créé, chargé et qu'il n'y a pas d'erreur, exécutez:

systemctl status systemd-hibernate.service

Références:

18
Cas

Voici ce que j'ai fait pour que cela fonctionne avec Ubuntu 18.04.

  • Faites en sorte que votre /swapfile ait 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 uswsusp afin d’utiliser correctement le fichier swap:

    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"
    
  • Editez le service SystemD hibernate en utilisant Sudo systemctl edit systemd-hibernate.service et 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 CV de votre /swapfile:

    $ Sudo swap-offset /swapfile
    resume offset = 34818
    
  • Configurez Grub pour reprendre à partir du fichier d'échange en modifiant /etc/default/grub et 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 le /etc/initramfs-tools/conf.d/resume suivant:

    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 passer en hibernation avec Sudo systemctl hibernate.

On peut aussi 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 gotosleep ou passer en veille prolongée avec gotohibernation.

Vous devez être en mesure d'exécuter Sudo s2both, Sudo s2ram et Sudo systemctl hibernate sans avoir à entrer votre mot de passe pour que les scripts précédents fonctionnent.

Vous pouvez le faire par exemple en créant un groupe powerdev, en y ajoutant votre utilisateur actuel et en configurant la configuration suivante pour sudoers (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:

10
Anthony O.

J'ai donné une lecture rapide du didacticiel et, si j'ai bien compris, il vous suffit de spécifier les options resume sur la ligne de commande Linux. Avec Grub2, c’est très simple et vos modifications seront toujours conservées. Vous devez éditer le fichier /etc/default/grub, en particulier cette ligne:

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

Ensuite, exécutez Sudo update-grub pour que les modifications prennent effet.

Changer GRUB_CMDLINE_LINUX n'affectera pas vos autres installations Linux (car /etc/grub.d/30_os-prober n'utilise pas cette variable).

À propos du problème rencontré: 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 /swapfile peut être utile.

8
Andrea Corbellini