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

40

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

Je peux imaginer changer le script pm-suspend pour le faire automatiquement, mais il pourrait y avoir un moyen plus facile à maintenir / à maintenir.

    
posée blueyed 02.06.2012 - 12:38
la source

6 réponses

44

sommeil hybride indirect

Il s’agit de l’ancienne méthode: commencez par suspendre puis réveillez-vous en veille prolongée (15 minutes par défaut). Utilisez ceci avec un noyau Linux avant 3.6, ou si vous aimez que cela n'utilise plus aucune puissance après 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. S'il dit "0", cela devrait marcher:

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

Real hybride suspendant avec Linux 3.6 +

Si vous avez un noyau Linux 3.6, vous pouvez utiliser ce qui suit, qui sera suspendu au disque et à la 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 permet d’écrire toujours l’image sur le disque, puis de la suspendre à la RAM, car les avantages de la reprise seront toujours rapides (tant que la batterie ne s’épuise pas) et que la machine ne se réveillera pas brièvement ( après PM_HIBERNATE_DELAY) pour mettre en veille réelle.

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

réponse donnée blueyed 02.06.2012 - 22:52
la source
27

Ubuntu 16.04 et supérieur

Le solution par blueyed pour un hybride réel suspendu avec Linux 3.6 + travaille pour moi. Je pense que c'est parce qu'Ubuntu 16.04 utilise systemd et n'utilise pas le fichier /etc/pm/config.d/00-use-suspend-hybrid .

Premièrement, testez si la mise en veille prolongée et la mise en veille hybride fonctionnent avec systemd

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

sudo systemctl hibernate

Cela devrait amener votre ordinateur à hiberner. Pour essayer le mode hybride, entrez:

sudo systemctl hybrid-sleep

Si cela fonctionne, rendez-le permanent

  • Les travaux suivants 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 de 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. Le suspend est l'action par défaut. Supprimez # et modifiez suspend en 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.

Note:

  • Outre suspend ou hybrid-sleep , il existe une troisième option, hibernate .
  • Mon ordinateur portable n’a pas de bouton de veille physique. Je n'ai donc pas pu le tester.
  • En cliquant sur Suspend du menu Cog, l'ordinateur met suspension normale pas hybride-sommeil.

Source: lien

J'espère que cela aide

    
réponse donnée user68186 05.06.2016 - 01:01
la source
4

Au 12.04, j'ai remarqué que lorsque la mise en veille prolongée est déclenchée (en utilisant PM_HIBERNATE_DELAY=XX ), les scripts resume / thaw du shell ne désactivent 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 modification des scripts dans /etc/pm/sleep.d/10_grub-common . Suis un novice, donc je n'ai pas essayé de trouver le changement exact malheureusement.

    
réponse donnée bo what 31.10.2012 - 11:12
la source
3

Cette question revient assez souvent dans Google, je pense que ça vaut le coup. La méthode décrite ici est (imo) not suspension hybride. C'est "hiberner après X minutes de suspension". True hybride suspend écrit votre RAM sur le disque, puis passe en mode basse consommation (mode veille). Bien que cela prenne plus de temps, le résumé est instantané alors que la batterie est restée sur la machine, sinon la reprise du 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 nouveaux ordinateurs portables Windows et Mac.

Voici comment activer la suspension hybride real :

  • Suivez la première partie de la première réponse. Cela remplace l'appel "suspend" pour faire un "hybrid_suspend" dans pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Always use suspend_hybrid instead of suspend
    if [ "$METHOD" = "suspend" ]; then
        METHOD=suspend_hybrid
    fi
  • Faites une sauvegarde de / usr / lib / pm-utils / pm-functions
  • Obtenez le correctif ici: lien
    • Ce patch permet la suspension hybride si disponible (c'est-à-dire sur les noyaux 3.6 +)
  • Soit l'appliquer en utilisant "patch -p0" ou le fusionner 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 "disk" > /sys/power/state
+       RET=$?
+       echo -n "$HIBERNATE_MODE_SAVE" > /sys/power/disk
+       return "$RET"
+   }
+fi
+
+# for kernels that support suspend to both (i.e. hybrid suspend)
+# since kernel 3.6
+if [ -z "$SUSPEND_HYBRID_MODULE" ] && \
+   [ -f /sys/power/disk ] && \
+   grep -q disk /sys/power/state && \
+   grep -q suspend /sys/power/disk; then
+   SUSPEND_HYBRID_MODULE="kernel"
+   do_suspend_hybrid()
+   {
+       HIBERNATE_MODE="suspend"
+       do_hibernate
    }
 fi

Sources:

réponse donnée Rohan Dhruva 13.09.2013 - 00:30
la source
1

Il existe une autre solution sans ajouter de fichier dans config.d, en utilisant simplement wakealarm dans / sys / class / rtc / rtc0. Utilisez le code obsolète dans les fonctions pm (/ usr / lib / pm-utils) après les commentaires # depuis que le noyau ne supporte pas directement ..., ('parce que le noyau actuel (après quelque chose 3.6) supporte directement). Rétablissez ce code et placez-le dans la partie do_suspend () au lieu de do_suspend_hybrid (), et utilisez le correctif pour les fonctions pm (jusqu'à ce qu'elles le corrigent).

Code obsolète (suspendre puis mettre en veille lorsque on appelle suspend_hybrid):

# 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

Recommandé. Encore plus facile d’utiliser uswsusp tout en maximisant le bénéfice de s2both, c.-à-d. Placez le code retourné 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 / mise en veille prolongée et le processus inverse affiché dans le texte, même si nous pouvons l’abandonner en appuyant sur la touche Retour arrière. Sans uswsusp, suspend / hibernate apparaît-disparaît, surtout lorsque wakealarm est déclenché et exécute hibernate (s2disk dans uswsusp). Définissez la période de veille avant l’hibernation à l’endroit habituel dans le fichier de fonctions pm.

# 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 les fonctions pm 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  
    
réponse donnée mark 31.10.2013 - 14:14
la source
0

La réponse de user68186 pour Ubuntu 16.04 n’a pas fonctionné pour moi. Cependant, la solution ici fait.

Tout d’abord, assurez-vous que l’hibernation fonctionne. Alors

  

Recherchez et installez dconf Editor dans Ubuntu Software. Puis lancez   et naviguer vers org - & gt; gnome - & gt; Paramètres démon - & gt; plugins - & gt;   pouvoir.

     

Changer la valeur de "lid-close-ac-action" et   "Couvercle-ferme-batterie-action".

Dans mes paramètres d’alimentation, ces options apparaissent en blanc, mais elles fonctionnent comme prévu.

    
réponse donnée qwr 22.01.2017 - 21:01
la source

Lire d'autres questions sur les étiquettes