Comment utiliser pm-suspend-hybrid par défaut au lieu de pm-suspend?

41

J'aimerais utiliser la méthode de suspension hybride au lieu de suspendre lors de la fermeture du couvercle ou de la sélection de "Suspendre" dans le menu.

Je peux imaginer changer le script pm-suspend pour le faire automatiquement, mais il existe peut-être un moyen plus facile à gérer /.

blueyed
la source

Réponses:

44

Sommeil hybride indirect

Il s’agit de la méthode la plus ancienne: d’abord suspendre puis de passer en veille prolongée après un délai (15 minutes par défaut). Utilisez ceci avec un noyau Linux antérieur à 3.6, ou si vous aimez ça, il n’utilise plus aucune énergie au bout de 15 minutes.

Ajouter le fichier /etc/pm/config.d/00-use-suspend-hybrid:

# Always use suspend_hybrid instead of suspend
if [ "$METHOD" = "suspend" ]; then
  METHOD=suspend_hybrid
fi
# The delay after which hibernation gets triggered (default: 900 seconds, 15 minutes):
PM_HIBERNATE_DELAY=900

Vous voudrez peut-être vous assurer que la méthode hybride est prise en charge sur votre système via le code suivant. Si cela dit "0" cela devrait marcher:

sudo pm-is-supported --suspend-hybrid && echo $?

Véritable hybride suspendant avec Linux 3.6+

Si vous avez un noyau Linux 3.6, vous pouvez utiliser ce qui suit, qui suspendra à la fois le disque et la RAM.

Ajouter le fichier /etc/pm/config.d/00-use-suspend-hybrid:

# WORKAROUND: always set the default hibernate mode first (normal mode)
# (not required if you have the patch mentioned by Rohan below (http://askubuntu.com/a/344879/169))
HIBERNATE_MODE=platform

# Always use hibernate instead of suspend, but with "suspend to both"
if [ "$METHOD" = "suspend" ]; then
  METHOD=hibernate
  HIBERNATE_MODE=suspend
fi

# Make sure to use the kernel's method, in case uswsusp is installed etc.
SLEEP_MODULE=kernel

Cela écrit toujours l'image sur le disque, puis est suspendu dans la RAM, ce qui présente l'avantage de permettre une reprise rapide (tant que la batterie ne s'épuise pas) et que la machine ne se réveillera pas rapidement (après PM_HIBERNATE_DELAY). hiberner pour de vrai.

L'inconvénient est que le processus prend plus de temps (car il est toujours en veille prolongée sur disque) et que votre batterie peut s'épuiser à long terme (par exemple, au bout de 12 heures).

blueyed
la source
2
une petite note, au lieu de 'sudo pm-is-supporté - suspendre-hybrid && echo $?', utilisez 'sudo pm-is-supporter - suspendre-hybride; écho $? comme la valeur de retour de pm-is-supported est 0 pour est pris en charge, et 1 pour n'est pas.
James Caccese
1
@JamesCaccese: Dans le monde shellscript, 0 signifie "true" et toute autre chose signifie "false". Votre scriptlet fonctionnera, mais le scriptlet de l’affiche originale fonctionnera également comme prévu, imprimant un «0» sur pris en charge et rien sur non pris en charge. Si vous voulez quelque chose qui dit toujours supporté ou non, essayez 'sudo pm-is-supporté --suspend-hybrid && echo "supporté" || echo "
unsupported
@zanfur - Bien que j'aime votre solution fournie par la suite pour imprimer les deux états (et rien pour une raison inattendue, pm-is-supporté ne s'exécute pas comme prévu, cela ferait des choses inconnues à l'état d'erreur ), j'apprécie que James Caccese mentionne cette mise en garde, pour la raison susmentionnée .
user66001
Si vous utilisez 16.04, voyez cette réponse ci-dessous.
Kapad
La seule pièce manquante pour moi était un resumeargument dans /etc/default/grub.conf. Aussi en tant qu'utilisateur nvidia, je devais définir nomodeset. Ainsi , l' entrée résultant sans tête dans mon cas est la suivante : GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". N'oublie pas grub-update. Et aussi certains modules doivent être déchargés fichier créé /etc/pm/config.d/00-unload_modulesavec ligne SUSPEND_MODULES="ath5k r8169"et juste pour m'assurer que j'ai également renommé 00-use-suspend-hybrid to10-use-suspend-hybrid
mauron85
31

Ubuntu 18.04 une option chronométrée

Dans Ubuntu 18.04 a une nouvelle option chronométré. En systemdest disponible un nouveau mode suspend-then-hibernate. Cela commencera par le mode veille, puis passera au mode hibernation après un temps déterminé.

Dans ce hybrid-sleepmode, la partie en veille prolongée n’est efficace que lorsque la batterie est extrêmement faible et que le système s’arrête.

Pour commencer à utiliser cette fonction, vous devez créer un fichier /etc/systemd/sleep.confavec le contenu suivant:

[Sleep]
HibernateDelaySec=3600

Cela passera du sommeil à l'hibernation après 1 heure de sommeil. Vous pouvez modifier HibernateDelaySecpour modifier le délai en veille prolongée.

Tout d’abord, teste si suspend-then-hibernate fonctionne avec systemd

Ouvrez un terminal en appuyant sur Ctrl+ Alt+ Tet entrez:

sudo systemctl suspend-then-hibernate

Si cela fonctionne, rendez-le permanent.

  • Ce qui suit fonctionne lorsque je ferme le couvercle .

Ouvrez le fichier en /etc/systemd/logind.confutilisant votre éditeur préféré. Vous aurez besoin d'invoquer votre pouvoir administratif par sudo, gksudoou pkexecpour modifier ce fichier.

Trouvez les deux lignes:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Remarque: Ces lignes sont commentées #devant. Le suspendest l'action par défaut. Supprimez le #et changez suspenden suspend-then-hibernatedans ces deux lignes pour qu'elles ressemblent à ceci:

HandleSuspendKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate

Enregistrez le fichier. Déconnectez-vous et reconnectez-vous ou redémarrez le logindservice à l'aide de la commande suivante:

systemctl restart systemd-logind.service

Attention! votre session utilisateur sera redémarrée

Source: Couvercle fermé Suspendre puis Hiberner

Ubuntu 16.04 et plus

La solution de blueyed pour Real hybride suspendant avec Linux 3.6+ ne fonctionnait pas pour moi. J'imagine que c'est parce qu'Ubuntu 16.04 utilise systemdet n'utilise pas le fichier /etc/pm/config.d/00-use-suspend-hybrid.

Tout d’abord, teste si hibernate et hybrid-sleep fonctionne avec systemd

Ouvrez un terminal en appuyant sur Ctrl+ Alt+ Tet entrez:

sudo systemctl hibernate

Cela devrait mettre votre ordinateur en veille prolongée. Pour essayer de sommeil hybride, entrez:

sudo systemctl hybrid-sleep

Si cela fonctionne, rendez-le permanent.

  • Ce qui suit fonctionne lorsque je ferme le couvercle .

Ouvrez le fichier en /etc/systemd/logind.confutilisant votre éditeur préféré. Vous aurez besoin d'invoquer votre pouvoir administratif par sudo, gksudoou pkexecpour modifier ce fichier.

Trouvez les deux lignes:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Remarque: Ces lignes sont commentées #devant. Le suspendest l'action par défaut. Supprimez le #et changez suspenden hybrid-sleepdans ces deux lignes pour qu'elles ressemblent à ceci:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Enregistrez le fichier. Déconnectez-vous et reconnectez-vous.

Remarque:

  • Autre que suspendou hybrid-sleepil y a une troisième option, hibernate.
  • Mon ordinateur portable n'a pas de bouton de veille physique. Donc je ne pouvais pas le tester.
  • En cliquant sur Suspenddans le menu cog, l'ordinateur passe en suspension normale et non en veille hybride.

Source: https://superuser.com/questions/719447/how-to-use-systemd-hybrid-sleep-instead-of-suspend-under-gnome-in-linux

J'espère que ça aide

utilisateur68186
la source
2
Cette réponse nécessite plus de votes positifs. Correction des problèmes pour moi dans 16.04. Merci.
Kapad
Je vous en prie. Maintenant que je suis passé de 14.04 à 16.04, je suis en train de trouver la nouvelle façon de faire systématique, lentement au fil du temps.
user68186
1
Fonctionne également avec Ubuntu GNOME 16.04.1
HarlemSquirrel
4

En 12.04, j’ai remarqué que lorsqu’une mise en veille prolongée est déclenchée (avec PM_HIBERNATE_DELAY=XX), les scripts de reprise / décongélation ne désaffectent pas la variable grub recordfail. Par conséquent, grub ne démarre pas automatiquement.

Timeout est défini sur -1 et attend la sélection de l'utilisateur. Je suppose que cela nécessite une édition de scripts dans /etc/pm/sleep.d/10_grub-common. Je suis novice, donc je n'ai pas essayé de trouver le changement exact, malheureusement.

bo quoi
la source
1
Cela vaudra probablement un rapport de bogue et / ou un test si cela fonctionne dans 12.10+.
blueyed
Je vois le même problème dans 12.10
MDCore
3

Cette question revient assez souvent dans Google pour que je pense qu'il vaut la peine de la remplacer. La méthode décrite ici est (imo) pas hybride suspendre. Il est "hiberner après X minutes en suspension". La vraie suspension hybride écrit votre RAM sur le disque, puis passe en mode basse consommation (mode veille). Bien que cela prenne plus de temps, la reprise est instantanée tant qu'il reste de la batterie sur la machine, sinon elle reprend son disque dur. Ce comportement est ce que la plupart des gens connaissent sous le nom de veille hybride et utilisé par défaut dans les ordinateurs portables Windows et Mac les plus récents.

Voici comment activer la suspension hybride réelle :

  • Suivez la première partie de la première réponse. Ceci annule l'appel "suspend" pour faire un "hybrid_suspend" dans pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Toujours utiliser suspend_hybrid au lieu de suspendre
    if ["$ METHOD" = "suspendre"]; puis
        METHOD = suspension_hybride
    Fi
  • Faites une sauvegarde de / usr / lib / pm-utils / pm-functions
  • Obtenez le correctif à partir d’ici: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Ce correctif permet la suspension hybride si disponible (c'est-à-dire sur les noyaux 3.6+)
  • Appliquez-le à l'aide de 'patch -p0' ou fusionnez-le manuellement en cas d'échec.

Cette méthode fonctionne pour moi sur mon Sony Vaio SVS.

PS: Reproduire le correctif ici au cas où le fichier serait supprimé ultérieurement:

diff --git a / pm / pm-functions.in b / pm / pm-functions.in
--- a / pm / pm-functions.in
+++ b / pm / pm-functions.in
@@ -316,8 +316,28 @@ if [-z "$ HIBERNATE_MODULE"] && \
    {
        [-n "$ {HIBERNATE_MODE}"] && \
        grep -qw "$ {HIBERNATE_MODE}" / sys / power / disk && \
+ HIBERNATE_MODE_SAVE = $ (cat / sys / power / disk) && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE ## * [}" && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE %%] *}" && \
        echo -n "$ {HIBERNATE_MODE}"> / sys / power / disk
        echo -n "disque"> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ retourne "$ RET"
+}
+ fi
+
+ # pour les noyaux prenant en charge la suspension à la fois (suspension hybride)
+ # depuis le noyau 3.6
+ si [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q disque / sys / alimentation / état && \
+ grep -q suspend / sys / power / disk; puis
+ SUSPEND_HYBRID_MODULE = "noyau"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "suspendre"
+ do_hibernate
    }
 Fi

Sources:

Rohan Dhruva
la source
1
Vous avez raison à propos de hybride-suspendre. J'ai récemment changé mon extrait moi-même. Vous pouvez obtenir (tout à fait) le même résultat en utilisant METHOD = hibernate et HIBERNATE_MODE = suspend. Je mets HIBERNATE_MODE = platform en haut du fichier, au lieu de sauvegarder et de restaurer la version précédente (ce que fait le correctif). Je mettrai à jour ma réponse ci-dessus.
blueyed
Ça a l'air génial, merci pour le montage, @blueyed
Rohan Dhruva
1

Il existe une autre solution sans ajouter de fichier dans config.d, en utilisant simplement wakealarm dans / sys / class / rtc / rtc0. Utilisez du code obsolète dans pm-functions (/ usr / lib / pm-utils) après les commentaires # depuis que le noyau ne supporte pas directement ..., (car le noyau actuel (quelque chose après la version 3.6) le supporte directement). Retournez ce code et insérez la partie do_suspend () à la place de do_suspend_hybrid () et utilisez le correctif pour pm-functions (jusqu'à ce qu'ils le résolvent).

Code obsolète (suspendre puis hiberner lorsque susp_hybrid est appelé):

# since the kernel does not directly support hybrid sleep, we do
# something else -- suspend and schedule an alarm to go into
# hibernate if we have slept long enough.
# Only do this if we do not need to do any special video hackery on resume
# from hibernate, though.
if [ -z "$SUSPEND_HYBRID_MODULE" -a -w "$PM_RTC/wakealarm" ] && \
    check_suspend && check_hibernate && ! is_set $HIBERNATE_RESUME_POST_VIDEO; \
    then
    SUSPEND_HYBRID_MODULE="kernel"
    do_suspend_hybrid() {
    WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
    echo >"$PM_RTC/wakealarm"
    echo $WAKETIME > "$PM_RTC/wakealarm"
    if do_suspend; then
        NOW=$(cat "$PM_RTC/since_epoch")
        if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then
        log "Woken by RTC alarm, hibernating."
        # if hibernate fails for any reason, go back to suspend.
        do_hibernate || do_suspend
        else
        echo > "$PM_RTC/wakealarm"
        fi
    else
        # if we cannot suspend, just try to hibernate.
        do_hibernate
    fi
    }
fi

Conseillé. Encore plus facile à utiliser uswsusp tout en maximisant les avantages de s2both, c’est-à-dire s2both lorsqu’il est suspendu. Placez le code inversé dans la partie do_suspend () du module uswsusp (/usr/lib/pm-utils/module.d).

Code inversé (suspend_hybrid lorsque la suspension est appelée):

        WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
        echo >"$PM_RTC/wakealarm"
        echo $WAKETIME > "$PM_RTC/wakealarm"
        if do_suspend_hybrid; then
            NOW=$(cat "$PM_RTC/since_epoch")
            if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
            log "Woken by RTC alarm, hibernating."
            # if hibernate fails for any reason, go back to suspend_hybrid.
            do_hibernate || do_suspend_hybrid
            else
            echo > "$PM_RTC/wakealarm"
            fi
        else
            # when do_suspend is being called, convert to suspend_hybrid.
            do_suspend_hybrid
        fi      

Avec uswsusp, nous pouvons voir l’avancement de la suspension / hibernation et le processus inverse affichés en texte, même si nous pouvons l’abandonner en appuyant sur la touche retour arrière. Sans uswsusp, suspendre / hibernate semble juste disparaître de manière ennuyeuse, surtout lorsque wakealarm est déclenché et exécuter hibernate (s2disk in uswsusp). Définissez la période de sommeil avant l'hibernation à l'emplacement habituel du fichier pm-functions.

# variables to handle hibernate after suspend support
PM_HIBERNATE_DELAY=900  # 15 minutes
PM_RTC=/sys/class/rtc/rtc0

Voici le mod uswsusp: (rappelez-vous, ce module est appelé depuis pm-functions, donc les variables insérées sont les mêmes)

#!/bin/sh

# disable processing of 90chvt and 99video.
# s2ram and s2disk handle all this stuff internally.
uswsusp_hooks()
{
    disablehook 99video "disabled by uswsusp"
}

# Since we disabled 99video, we need to take responsibility for proper
# quirk handling.  s2ram handles all common video quirks internally,
# so all we have to do is translate the HAL standard options to s2ram options.
uswsusp_get_quirks()
{
    OPTS=""
    ACPI_SLEEP=0
    for opt in $PM_CMDLINE; do
        case "${opt##--quirk-}" in # just quirks, please
            dpms-on)       ;; # no-op
            dpms-suspend)      ;; # no-op
            radeon-off)        OPTS="$OPTS --radeontool" ;;
            reset-brightness)  ;; # no-op
            s3-bios)       ACPI_SLEEP=$(($ACPI_SLEEP + 1)) ;;
            s3-mode)       ACPI_SLEEP=$(($ACPI_SLEEP + 2)) ;;
            vbe-post)      OPTS="$OPTS --vbe_post" ;;
            vbemode-restore)   OPTS="$OPTS --vbe_mode" ;;
            vbestate-restore)  OPTS="$OPTS --vbe_save" ;;
            vga-mode-3)        ;; # no-op
            save-pci)          OPTS="$OPTS --pci_save" ;;
            none)          QUIRK_NONE="true" ;;
            *) continue ;;
        esac
    done
    [ $ACPI_SLEEP -ne 0 ] && OPTS="$OPTS --acpi_sleep $ACPI_SLEEP"
    # if we were told to ignore quirks, do so.
    # This is arguably not the best way to do things, but...
    [ "$QUIRK_NONE" = "true" ] && OPTS=""
}

# Since we disabled 99video, we also need to handle displaying
# help info for the quirks we handle.
uswsusp_help()
{
    echo  # first echo makes it look nicer.
    echo "s2ram video quirk handler options:"
    echo
    echo "  --quirk-radeon-off"
    echo "  --quirk-s3-bios"
    echo "  --quirk-s3-mode"
    echo "  --quirk-vbe-post"
    echo "  --quirk-vbemode-restore"
    echo "  --quirk-vbestate-restore"
    echo "  --quirk-save-pci"
    echo "  --quirk-none"
}

# This idiom is used for all sleep methods.  Only declare the actual
# do_ method if:
# 1: some other sleep module has not already done so, and
# 2: this sleep method can actually work on this system.
#
# For suspend, if SUSPEND_MODULE is set then something else has already
# implemented do_suspend.  We could just check to see of do_suspend was
# already declared using command_exists, but using a dedicated environment
# variable makes it easier to debug when we have to know what sleep module
# ended up claiming ownership of a given sleep method.
if [ -z "$SUSPEND_MODULE" ] && command_exists s2ram && \
    ( grep -q mem /sys/power/state || \
        ( [ -c /dev/pmu ] && check_suspend_pmu; ); ); then
    SUSPEND_MODULE="uswsusp"
    do_suspend()
    {
        WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
        echo >"$PM_RTC/wakealarm"
        echo $WAKETIME > "$PM_RTC/wakealarm"
        if do_suspend_hybrid; then
            NOW=$(cat "$PM_RTC/since_epoch")
            if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
            log "Woken by RTC alarm, hibernating."
            # if hibernate fails for any reason, go back to suspend_hybrid.
            do_hibernate || do_suspend_hybrid
            else
            echo > "$PM_RTC/wakealarm"
            fi
        else
            # when do_suspend is being called, convert to suspend_hybrid.
            do_suspend_hybrid
        fi      
    }
fi

if [ -z "$HIBERNATE_MODULE" ] && \
    [ -f /sys/power/disk ] && \
    grep -q disk /sys/power/state && \
    [ -c /dev/snapshot ] &&
    command_exists s2disk; then
    HIBERNATE_MODULE="uswsusp"
    do_hibernate()
    {
        s2disk
    }
fi

if [ -z "$SUSPEND_HYBRID_MODULE" ] && 
    grep -q mem /sys/power/state && \
    command_exists s2both && \
    check_hibernate; then
    SUSPEND_HYBRID_MODULE="uswsusp"
    do_suspend_hybrid()
    {   
        uswsusp_get_quirks
        s2both --force $OPTS 
    }
    if [ "$METHOD" = "suspend_hybrid" ]; then
        add_before_hooks uswsusp_hooks
        add_module_help uswsusp_help
    fi
fi  
marque
la source
0

La réponse de user68186 pour Ubuntu 16.04 ne fonctionnait pas pour moi. Cependant, la solution ici a fait.

Tout d'abord, assurez-vous que l'hibernation fonctionne. ensuite

Recherchez et installez dconf Editor dans Ubuntu Software. Ensuite, lancez-le et accédez à org -> gnome -> démon de configuration -> plugins -> power.

Modifiez la valeur de “lid-close-ac-action” et “lid-close-battery-action”.

Dans mes paramètres d’alimentation, ces options sont vides, mais elles fonctionnent comme prévu.

qwr
la source
0

Dans Ubuntu 18.04, c'est beaucoup plus facile. Dans systemd est disponible un nouveau mode suspend-then-hibernate . Pour commencer à utiliser cette fonction, vous devez créer un fichier /etc/systemd/sleep.conf avec le contenu suivant:

[Sleep]
HibernateDelaySec=3600

Ensuite, vous pouvez le tester avec la commande suivante:

sudo systemctl suspend-then-hibernate

(vous pouvez modifier HibernateDelaySec pour réduire le délai de mise en veille prolongée). Si tout fonctionne correctement, vous pouvez modifier l'action Fermer le couvercle. Pour ce faire, vous devez modifier le fichier /etc/systemd/logind.conf.

Vous devez rechercher l'option HandleLidSwitch = , la décommenter et la remplacer par HandleLidSwitch = suspend-then-hibernate . Ensuite, vous devez redémarrer le service logind (la connexion sera établie!), À l’aide de la commande suivante:

systemctl restart systemd-logind.service

C'est tout! Maintenant, vous pouvez utiliser cette fonction intéressante.

PRIHLOP
la source