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
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
systemctl
et le faire fonctionner dans des cas difficilesPour 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
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.
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.
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.
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é.
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 -
Vérifiez que vous n'utilisez pas de btrfs les partitions. Sí . 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é.
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).
Elle comporte les étapes suivantes
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
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
Enregistrez le fichier en appuyant sur Ctrl - O . Sortir avec Ctrl - X
Redémarrer le polkitd
démon
sudo systemctl restart polkitd.service
Il devrait activer l'hibernation.
(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.
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í .
Désactivez Secure Boot dans le BIOS.
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".
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
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
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.