118 votes

Comment mettre en hibernation sur Ubuntu 16.04 ?

Comment réussir l'hibernation d'Ubuntu 16.04 ?

J'ai essayé presque toutes les solutions proposées sur le Web, mais aucune n'a été utile. J'ai trouvé mon problème presque entièrement similaire à celui-ci

80voto

Zanna Points 65764

Hibernation à l'aide de systemctl et le faire fonctionner dans des cas difficiles

Pour moi, pm-hibernate échoue toujours. Après quelques ajustements, j'ai pu hiberner en utilisant l'interface de systemd (système init dans les versions 16.04 et supérieures). J'ai également réussi à la faire fonctionner sur 17.04 avec un fichier d'échange. Cette étude de cas peut être utile pour d'autres personnes ayant des problèmes.

Premier essai :

sudo systemctl hibernate

Si cela échoue, commencez à dépanner : en état d'hibernation (HTD ou ACPI S4), l'état de la machine est écrit sur le disque afin qu'aucune alimentation ne soit nécessaire pour le préserver. L'état est écrit soit dans une partition d'échange, soit dans un fichier d'échange. Note : si vous utilisez Btrfs, N'ESSAYEZ PAS d'utiliser un fichier d'échange car cela pourrait entraîner une corruption du système de fichiers.

Il se peut que votre partition ou fichier d'échange doive avoir la même taille que la RAM pour permettre l'hibernation, mais il y a de fortes chances que vous puissiez hiberner si sa taille est au moins égale à 2/5 de celle de la RAM, selon le site el Page wiki d'Arch Par conséquent, essayez d'abord d'autres mesures avant d'augmenter la taille de l'échange.

Si votre problème est que vous obtenez un démarrage propre au lieu de la reprise attendue, au minimum vous devez probablement définir un paramètre de démarrage pour trouver l'image disque

Trouvez votre partition d'échange :

grep swap /etc/fstab

pour moi, cela renvoie (sortie partielle)

# swap was on /dev/mmcblk0p3 during installation

donde /dev/mmcblk0p3 est la partition à spécifier

Ajouter un paramètre de démarrage :

sudoedit /etc/default/grub

Vers la ligne de départ GRUB_CMDLINE_LINUX_DEFAULT añadir resume=/dev/YourSwapPartition à la section entre guillemets (remplacez-la par la partition que vous avez identifiée précédemment). En utilisant mon exemple :

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3" 

Chaque fois que vous modifiez ce fichier, vous devez exécuter sudo update-grub ou les changements n'auront aucun effet.

Maintenant, vous devez redémarrer. Puis vous pouvez essayer d'hiberner, en lançant la commande :

sudo systemctl hibernate

Pour reprendre, appuyez sur le bouton d'alimentation et le système démarrera.

Si vous avez toujours des problèmes, commencez à déboguer.

J'inclus mon cas ci-dessous à titre d'exemple, mais vous trouverez des informations détaillées sur le débogage des états S dans ce blog y également celui-ci .

Définissez d'autres paramètres de démarrage pour capturer plus d'informations. Supprimer quiet y splash et ajouter initcall_debug y no_console_suspend ce qui aura pour effet d'imprimer les appels système init sur la console afin que vous puissiez observer ce qui ne va pas. J'ai réglé ça :

GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"

Ce qui m'a aidé à voir ce qui n'allait pas lors de la sortie d'hibernation. Vous pouvez également essayer d'utiliser dmesg .

Dans mon cas, après la reprise, j'ai perdu le WiFi, et le noyau était clairement contrarié car la plupart des commandes (par exemple lire quelque chose à partir de /sys le rechargement des modules ou tout systemctl ) ne fonctionne pas - le processus semble démarrer et se bloque (tout cela revient à la normale après un redémarrage bien sûr). En regardant le système s'éteindre très lentement et en lisant tous les messages de débogage, j'ai remarqué qu'il y avait beaucoup de problèmes avec "brcm", j'ai donc supposé que mon module de pilote sans fil Broadcom était en cause. J'ai donc ajusté ma procédure d'hibernation pour décharger le module en premier :

sudo modprobe -r brcmfmac
sudo systemctl hibernate

sur la reprise, je réinsère le module

sudo modprobe brcmfmac

Et tout a fonctionné parfaitement. Je dois aussi mettre sur liste noire le btsdio qui semble être incompatible avec le module brcmfmac


Mise à jour : Hibernation en utilisant un fichier de swap sur 17.04.

Une fois de plus, avec l'aide de la page wiki d'Arch et quelques bricolages supplémentaires, j'ai réussi à faire fonctionner l'hibernation sur 17.04 avec un fichier d'échange. Cela a nécessité un paramètre de démarrage supplémentaire, resume_offset=n où n est le premier nombre sous physical_offset dans la sortie de sudo filefrag -v /swapfile :

$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   .... 

Par conséquent, dans mon cas, le paramètre de démarrage supplémentaire est le suivant resume_offset=34816 . Vous devez encore définir un paramètre de démarrage pour la partition à reprendre. Ce sera la partition racine (ou n'importe quelle partition sur laquelle se trouve votre fichier d'échange) Mes paramètres sont maintenant :

GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"

Wo /dev/mmcblk1p2 est ma partition racine (la vôtre est plus susceptible d'être quelque chose comme /dev/sda2 ).

Pendant la reprise, j'ai vu l'image se charger avec succès, mais dans mon cas (juste un exemple - YMMVAPD) puis d'autres pilotes ( i2c_designware ) a généré quelques erreurs et le système s'est complètement figé lors de la reprise. L'hibernation fonctionne si je décharge ces modules en plus de brcmfmac mais le système devient rapidement inutilisable sans ces modules. J'ai donc fait une sorte de script pour décharger les modules bogués et les réinsérer immédiatement à la reprise :

# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac

Quand je veux hiberner, j'exécute sudo bash script . Cela fonctionne très bien.


TL;DR

Utilisez systemd, définissez un paramètre de démarrage pour la reprise à partir de l'échange, identifiez les pilotes bogués et déchargez-les avant de lancer l'hibernation. Si le système ne peut pas fonctionner longtemps sans ces modules ou si vous devez en décharger plusieurs, il peut être plus facile d'utiliser un simple script pour initier l'hibernation.

66voto

Meeks Points 11

Vous pouvez utiliser

sudo pm-hibernate 

pour vérifier si hibernation fonctionne sur votre système ( cela va mettre votre ordinateur en hibernation ).

Si cela ne fonctionne pas, vérifiez si la taille de votre swap est au moins aussi grande que votre RAM.

Pour ajouter l'option au menu des paramètres, vous pouvez créer un fichier de configuration. Ouvrez une fenêtre de terminal et exécutez cette commande :

sudo nano /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla

Il ouvre nano avec un fichier vide. Copiez les lignes ci-dessous et collez-les dans la fenêtre nano.

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

Ensuite, enregistrez les modifications, fermez nano et redémarrez le système pour que la fonction Hibernation apparaisse dans les "Options d'alimentation".

Référence : Comment mettre mon ordinateur en veille prolongée ? dans la documentation officielle d'Ubuntu 16.04.

J'espère que ça marchera. Cela a fonctionné pour moi après avoir essayé toutes les autres options.

21voto

Anwar Points 72431

Je pense que la réponse à la question de savoir comment activer la mise en veille prolongée pour la version 16.04 est connue de tous, comme décrit dans le manuel de l'utilisateur. Wiki Ubuntu (Voir ci-dessous si vous avez besoin des étapes). Mais les choses qui doivent être vérifiées ne sont pas complètes, je pense. En tout cas, c'est ce que j'ai trouvé.

Points à vérifier

D'après mes propres tests, j'ai trouvé au moins une vérification supplémentaire que vous devriez effectuer. Je ne l'ai trouvé nulle part sur Internet.

Voici quelques vérifications -

  1. Vérifiez que vous n'utilisez pas de btrfs les partitions. . D'après mon test, j'ai découvert que si vous avez btrfs partitions, l'hibernation ne fonctionnera pas. La suppression ou la modification du type de partition en ext4 ne m'a pas aidé. J'avais besoin de retirer le btrfs-tools paquet.

    sudo apt-get purge btrfs-tools

    Vous devriez peut-être vérifier d'autres nouveaux types de partitions qui ne sont pas bien testés. Sans supprimer le paquet, mettre le pilote sur liste noire pourrait aussi fonctionner, mais je ne l'ai pas testé.

  2. Vous devez également vérifier que vous disposez d'une partition swap suffisamment grande pour contenir le contenu de la RAM. Si votre RAM est de 4 Go, la partition d'échange devrait être au moins de 4 Go (vous devriez allouer quelques Mo de plus pour être sûr).

Étapes pour activer l'hibernation

Elle comporte les étapes suivantes

  1. Créer un fichier en tant que root dans /etc/polkit-1/localauthority/50-local.d/enable-hibernate.pkla

    sudo -i nano /etc/polkit-1/localauthority/50-local.d/enable-hibernate.pkla
  2. Mettez ce contenu dans ce fichier

    [Re-enable hibernate by default in upower]
    Identity=unix-user:*
    Action=org.freedesktop.upower.hibernate
    ResultActive=yes
    
    [Re-enable hibernate by default in logind]
    Identity=unix-user:*
    Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
    ResultActive=yes
  3. Enregistrez le fichier en appuyant sur Ctrl - O . Sortir avec Ctrl - X

  4. Redémarrer le polkitd démon

    sudo systemctl restart polkitd.service

Il devrait activer l'hibernation.

8voto

Marc Points 1172

Boot sécurisé

(J'ai demandé à un question similaire demander que l'accent soit mis sur les réponses basées sur systemd, partager ma solution ici pour les personnes qui suivent cette question)

Cette solution provient de Fedora (ils sont passés à systemd il y a un certain temps, il y a donc plus de matériel).

Dans mon cas (installation récente de la 16.04.1 sur une machine qui a toujours supporté l'hibernation), l'appel de l'obsolète sudo pm-hibernate n'a pas semblé faire quoi que ce soit, et l'approche systemd à jour, systemctl hibernate Je reviendrais :

Failed to hibernate system via logind: Sleep verb not supported

Il s'avère que le démarrage sécurisé était le coupable : à l'installation de 16.04, on vous demande ce que vous voulez en faire (ce qui est une nouveauté pour autant que je m'en souvienne) et j'ai gardé l'option ON sans trop y réfléchir.

Sur ma machine avec le démarrage sécurisé activé, cat /sys/power/disk répondu :

 [disabled]

Après un redémarrage et la désactivation du démarrage sécurisé dans les paramètres du BIOS (ceux-ci sont spécifiques à la machine, mais généralement assez simples), j'ai essayé un cat /sys/power/disk et j'ai obtenu :

 [platform] shutdown reboot suspend 

qui est le plus beau. Et en effet, appeler systemctl hibernate résulte en une séquence d'hibernation/dégel réussie.

De plus, après cela, j'ai pu voir que l'hibernation était disponible en tant qu'option à différents endroits de l'interface graphique, sans qu'il soit nécessaire d'utiliser une quelconque polkit pirate. Il semble donc que systemd était en fait de deviner de /sys/power/disk que le système n'a pas été capable d'hiberner.

7voto

SaTa Points 807

En essayant de mettre le système en hibernation (sommeil profond où la RAM est écrite sur le disque), l'erreur suivante a été générée

$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb not supported

Les étapes suivantes permettent de résoudre le problème (testé sur un Thinkpad X1 Carbon 7e génération, Ubuntu 19.10). La plupart d'entre elles sont empruntées à aquí .

  1. Désactivez Secure Boot dans le BIOS.

  2. Réglez "Sleep State" sur Linux dans le BIOS. Cette option était à l'origine nommée "Modern Standby" dans mon BIOS et j'ai dû la désactiver, mais après un nom de BIOS, le nom a été changé en "Sleep State".

  3. Créez un fichier d'échange égal ou supérieur à la RAM. Plusieurs étapes sont impliquées ici qui sont les suivantes.

    a. Éteignez le swap.

    $  sudo swapoff -a

    b. Créez un fichier plus grand ou égal à la RAM. La mienne est de 16GB, donc :

    $ sudo dd if=/dev/zero of=/swapfile bs=1G count=16
    
    16+0 records in
    16+0 records out
    17179869184 bytes (17 GB, 16 GiB) copied, 19.3685 s, 887 MB/s

    c. Définissez les bonnes permissions pour le fichier :

    $ sudo chmod 600 /swapfile

    d. Faites le fichier en tant que swap :

    $ sudo mkswap /swapfile
    
    Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
    no label, UUID=3b2e6f0c-ce12-4a84-9044-d99bfba059ea

    e. Allumez le swap et vérifiez s'il est bien réglé :

    $ sudo swapon /swapfile
    $ cat /proc/swaps
    
    Filename                Type        Size    Used    Priority
    /swapfile                               file        16777212    0   -2

    f. Afin que le swap soit chargé après le redémarrage, nous devons l'ajouter à /etc/fstab . Exécutez donc la commande suivante pour ouvrir le fichier :

    $ sudo gedit /etc/fstab

    Et mettez-le à jour en ajoutant la dernière ligne comme ci-dessous. Notez que j'ai également commenté mon swap original car je n'en ai pas besoin.

    /dev/mapper/vgubuntu-root /               ext4    errors=remount-ro 0       1
    # /boot was on /dev/nvme0n1p2 during installation
    UUID=d265e7c4-1a4f-49c4-af29-fea2543490d7 /boot           ext4    defaults        0       2
    # /boot/efi was on /dev/nvme0n1p1 during installation
    UUID=0004-FB5F  /boot/efi       vfat    umask=0077      0       1
    #/dev/mapper/vgubuntu-swap_1 none            swap    sw              0       0
    /swapfile       none    swap    sw      0       0

    g. Faites un redémarrage et exécutez cette commande pour voir si le swap apparaît :

    cat /proc/swaps
    
    Filename                Type        Size    Used    Priority
    /swapfile                               file        16777212    0   -2
  4. Maintenant, il est temps de mettre à jour le Grub. a. Exécutez cette commande pour ouvrir Grub :

    $ sudoedit /etc/default/grub

    b. Trouvez où root est monté en exécutant la commande suivante.

    $ mount | grep " / "
    
    /dev/mapper/vgubuntu-root on / type ext4 (rw,relatime,errors=remount-ro)

    c. L'esprit est donc monté sur /dev/mapper/vgubuntu-root . Trouvez l'UUID de cet emplacement en exécutant :

    $ sudo blkid
    /dev/mapper/nvme0n1p3_crypt: UUID="AZrE57-dlNc-BiUr-RrTF-SdT2-luVK-vrliNq" TYPE="LVM2_member"
    /dev/mapper/vgubuntu-root: UUID="2331fe68-3e7a-4937-9cfa-74fc7a4b79f6" TYPE="ext4"
    /dev/nvme0n1p1: UUID="0004-FB5F" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="09813156-6b7a-4fc2-b644-a8c6b7d40abf"
    /dev/nvme0n1p2: UUID="d265e7c4-1a4f-49c4-af29-fea2543490d7" TYPE="ext4" PARTUUID="64f5da2f-71d3-4f02-9b1e-3e12d7f6c445"
    /dev/nvme0n1p3: UUID="201acba5-ff20-46ee-9000-34efefef3fbe" TYPE="crypto_LUKS" PARTUUID="16858e70-eb08-4de8-b944-50689cad9d9f"
    /dev/sda1: LABEL="ST64GB" UUID="624AB7B308FE9F38" TYPE="ntfs" PTTYPE="dos"
    /dev/mapper/vgubuntu-swap_1: UUID="af3b29a2-ba6b-44de-89dd-072f4233aaf9" TYPE="swap"

    L'UUID dans ce cas est 2331fe68-3e7a-4937-9cfa-74fc7a4b79f6 . Conservez cet UUID. d. Ensuite, nous devons trouver l'offset du fichier d'échange. Exécutez cette commande :

    $ sudo filefrag -v /swapfile
    
    Filesystem type is: ef53
    File size of /swapfile is 17179869184 (4194304 blocks of 4096 bytes)
    ext:     logical_offset:        physical_offset: length:   expected: flags:
      0:        0..   32767:     835584..    868351:  32768:            
      1:    32768..   49151:     868352..    884735:  16384:            
      2:    49152..   81919:     886784..    919551:  32768:  
      ...

    Nous cherchons l'offset physique du premier bloc. Dans le cas ci-dessus, il s'agit de 835584 . Gardez aussi ce numéro. e. Nous devons maintenant mettre à jour le Grub. Exécutez la commande suivante :

    $ sudoedit /etc/default/grub

    Mise à jour avec le contenu suivant. Nous mettons à jour GRUB_CMDLINE_LINUX_DEFAULT et ajouter GRUB_RECORDFAIL_TIMEOUT=0 .

    # If you change this file, run 'update-grub' afterwards to update
    # /boot/grub/grub.cfg.
    # For full documentation of the options in this file, see:
    #   info -f grub -n 'Simple configuration'
    
    GRUB_DEFAULT=0
    GRUB_TIMEOUT_STYLE=hidden
    GRUB_TIMEOUT=0
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=2331fe68-3e7a-4937-9cfa-74fc7a4b79f6 resume_offset=835584"
    GRUB_CMDLINE_LINUX=""
    
    # Avoiding grub to show up in boot when resuming from hibernation
    GRUB_RECORDFAIL_TIMEOUT=0

    f. Une fois le fichier Grub mis à jour, exécutez cette commande :

    $ sudo update-grub

Ça devrait être ça. Maintenant vous pouvez mettre le système en hibernation en exécutant

$ sudo systemctl hibernate

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X