web-dev-qa-db-fra.com

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

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.

41
blueyed

Sommeil hybride indirect

Il s’agit de la méthode la plus ancienne: d’abord suspendre puis de passer en veille prolongée (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.

Ajoutez 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 sur le disque et RAM dès le début.

Ajoutez 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).

44
blueyed

Ubuntu 18.04 une option chronométrée

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

Dans le mode hybrid-sleep, la partie Mise en veille prolongée devient efficace uniquement 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.conf avec le contenu suivant:

[Sleep]
HibernateDelaySec=3600

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

Tout d'abord, vérifiez si susp-then-hibernate fonctionne avec systemd

Ouvrez un terminal en appuyant sur Ctrl+Alt+T et entrez:

Sudo systemctl suspend-then-hibernate

Si cela fonctionne, rendez-le permanent.

  • Ce qui suit fonctionne lorsque je ferme le couvercle .

Ouvrez le fichier /etc/systemd/logind.conf en utilisant votre éditeur préféré. Vous devrez invoquer votre pouvoir administratif avec Sudo, gksudo ou pkexec pour modifier ce fichier.

Trouvez les deux lignes:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Remarque: Ces lignes sont commentées avec # devant elles. suspend est l'action par défaut. Supprimez le # et remplacez suspend par suspend-then-hibernate dans ces deux lignes afin 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 service logind à l'aide de la commande:

systemctl restart systemd-logind.service

avertissement! votre session utilisateur sera redémarrée

Source: Couvercle fermé Suspendre puis Hiberner

Ubuntu 16.04 et plus

Le solution par blueyed pour la suspension hybride réelle avec Linux 3.6 + ne fonctionnait pas pour moi. Je suppose que cela est dû au fait que Ubuntu 16.04 utilise systemd et n’utilise pas le fichier /etc/pm/config.d/00-use-suspend-hybrid.

Tout d'abord, testez si hibernate et hybrid-sleep fonctionnent avec systemd

Ouvrez un terminal en appuyant sur Ctrl+Alt+T et 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 /etc/systemd/logind.conf en utilisant votre éditeur préféré. Vous devrez invoquer votre pouvoir administratif avec Sudo, gksudo ou pkexec pour modifier ce fichier.

Trouvez les deux lignes:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Remarque: Ces lignes sont commentées avec # devant elles. suspend est l'action par défaut. Supprimez le # et remplacez suspend par hybrid-sleep dans ces deux lignes afin qu'elles ressemblent à ceci:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

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

Remarque:

  • Outre suspend ou hybrid-sleep, il existe 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 Suspend dans 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

31
user68186

En 12.04, j’ai remarqué que, lorsque la mise en veille prolongée est déclenchée (à l’aide de PM_HIBERNATE_DELAY=XX), les scripts de reprise/décongélation Shell 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 quelques modifications 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.

4
bo what

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 à la place de suspend 
 si ["$ METHOD" = "suspend" ]; alors 
 METHODE = 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/disque) && [
 + 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
+ retournent "$ RET" 
 +} 
 + fi 
 + 
 + # pour les noyaux prenant en charge la suspension à la fois (suspension hybride) 
 + # depuis le noyau 3.6 
 + if [-z "$ SUSPEND_HYBRID_MODULE"] &&\
 + [-f/sys/power/disk] &&\
 + grep -q disque/sys/power/state &&\
 + grep -q suspend/sys/power/disk; then 
 + SUSPEND_HYBRID_MODULE = "kernel" 
 + do_suspend_hybrid (.____.] + {
 + HIBERNATE_MODE = "suspend" 
 + do_hibernate 
    }
 Fi

Sources:

3
Rohan Dhruva

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 corrigent).

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é. Même plus facile à utiliser, uswsusp tout en maximisant les avantages de s2 à la fois s2 et la suspension 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 la progression de la suspension/veille prolongée 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, suspend/hibernate semble juste disparaître de manière ennuyeuse, en particulier lorsque wakealarm est déclenché et exécuter hibernate (s2disk in uswsusp). Définissez la période de veille 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  
1
mark

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

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

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

Changez 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.

0
qwr

Dans buntu 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 d’hibernation). Si tout fonctionne bien, vous pouvez modifier l'action Fermer le couvercle. Pour ce faire, vous devez modifier le fichier / etc/systemd/logind.conf

Vous devez trouver l’option HandleLidSwitch = , décommentez-la et remplacez-la 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 Nice.

0
PRIHLOP