Pm-suspend-hybrid'i pm-suspend yerine varsayılan olarak nasıl kullanırım?


41

Kapağı kapatırken veya menüden "Askıya Al" ı seçerken askıya almak yerine hibrit askıya alma yöntemini kullanmak istiyorum.

Pm-suspend komut dosyasını otomatik olarak yapacak şekilde değiştirmeyi hayal edebiliyorum, ancak daha sürdürülebilir / daha kolay bir yolu olabilir.

Yanıtlar:


44

Dolaylı karma uyku

Bu eski yöntemdir: ilk önce askıya alın ve sonra bir gecikmeden sonra hazırda bekletme moduna alın (varsayılan olarak 15 dakika). Bunu 3.6'dan önce bir Linux çekirdeğiyle kullanın ya da eğer 15 dakika sonra herhangi bir güç kullanmazsanız kullanın.

Dosyayı ekle /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

Hibrid yönteminin sisteminizde aşağıdaki kodla desteklendiğinden emin olmak isteyebilirsiniz. "0" yazıyorsa çalışması gerekir:

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

Linux 3.6+ ile gerçek melezleme

Eğer bir Linux 3.6 çekirdeğiniz varsa, hem diske hem de RAM'e en baştan askıya alınacak olan aşağıdakini kullanabilirsiniz.

Dosyayı ekle /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

Bu, görüntüyü her zaman diske yazar ve daha sonra RAM'i askıya alır, devam etmenin her zaman hızlı olacağı (pil bitmediği sürece) ve makinenin kısa bir süre boyunca uyanmayacağı (PM_HIBERNATE_DELAY) gerçek kış uykusuna yatmak.

Dezavantajı, işlemin daha uzun sürmesi (her zaman diske kış uykusuna yatması nedeniyle) ve pilinizin uzun vadede bitebilmesidir (örneğin 12 saat sonra).


2
'sudo pm-destekli -suspend-hybrid && echo $?' yerine küçük bir not, 'sudo pm-destekli -suspend-hybrid'i kullanın; echo $? ' pm-is-support'nin dönüş değeri için 0, desteklenmiyorsa 1 için değil.
James Caccese,

1
@JamesCaccese: Shellscript dünyasında, 0 "true" anlamına gelir ve başka bir şey "false" anlamına gelir. Komut dosyanız çalışır, ancak orijinal posterin komut dosyası da istenildiği gibi çalışır ve desteklendiğinde '0' basılır ve desteklenmeyen bir şey olmaz. Her zaman desteklenen veya desteklenmeyen bir şey istiyorsanız, 'sudo pm-desteklenir' komutunu kullanın - suspend-hybrid && echo "support" || yankı "desteklenmeyen" '
zanfur

@zanfur - Her iki durumu da yazdırmak için verilen sonraki çözümünüzü sevsem de (ve beklenmedik bir nedenden ötürü pm-destekli olmadığından hiçbir şey beklendiği gibi çalışmaz, bu hata durumuna bilinmeyen şeyler yapar ), James Caccese'nin bahsettiğini takdir ediyorum Bu ihmal, yukarıda belirtilen sebeplerden dolayı.
user66001

Eğer kullanıyorsanız 16.04 bakın bu aşağıda cevabını.
kapad

Benim için tek eksik parça resumetartışma oldu /etc/default/grub.conf. Ayrıca nvidia kullanıcısı olarak ayarlamak zorunda kaldım nomodeset. Benim durumumda grub girişini sonuçlanan Yani geçerli: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". Unutma grub-update. Ve ayrıca bazı modüller kaldırılmış ve bu nedenle /etc/pm/config.d/00-unload_modulessatırlı dosya oluşturulmuş olmalı SUSPEND_MODULES="ath5k r8169"ve sadece 00-use-suspend-hybrid olarak yeniden adlandırıldığından emin olmak için10-use-suspend-hybrid
mauron85

31

Ubuntu 18.04 zamanlanmış bir seçenek

In Ubuntu 18.04 olan yeni zamanlanmış seçeneği vardır. In systemdyeni bir mod availiable suspend-then-hibernate. Bu uyku moduyla başlayacak ve daha sonra sabit bir süre sonra hazırda bekleme moduna geçecektir.

In hybrid-sleeppil sistemi kapanır aşağı kritik düzeyde ve sadece zaman modunda, derin uyku kısmı etkili olur.

Bu işlevi kullanmaya başlamak için bir /etc/systemd/sleep.confsonraki içeriğe sahip bir dosya oluşturmanız gerekir :

[Sleep]
HibernateDelaySec=3600

Bu 1 saatlik uykudan sonra uyku modundan uyku moduna geçecektir. HibernateDelaySecHazırda bekletme gecikmesini değiştirmek için düzenleyebilirsiniz .

İlk önce, askıya al ve sonra hazırda bekletme modunun systemd kullanarak çalışıp çalışmadığını test edin

Ctrl+ Alt+ Tuşlarına basarak bir terminal açın Tve şunu girin:

sudo systemctl suspend-then-hibernate

İşe yararsa kalıcı olur.

  • Kapağı kapattığımda aşağıdakiler çalışıyor .

/etc/systemd/logind.confTercih ettiğiniz düzenleyiciyi kullanarak dosyayı açın . Sen yaparak idari gücünü çağırmak gerekir sudo, gksudoya da pkexecbu dosyayı düzenlemek için.

İki satırı bulun:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Not, Bu satırlar #önünde yorumlanmıştır. suspendVarsayılan eylemdir. Bunları kaldırın #ve bu iki satırda değiştirin suspend, suspend-then-hibernateböylece şöyle görünürler:

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

Dosya 'yı kaydet. Oturumu kapatın ve tekrar oturum açın veya logindhizmeti komutuyla yeniden başlatın :

systemctl restart systemd-logind.service

uyarı! kullanıcı oturumunuz yeniden başlatılacak

Kaynak: Kapak Kapalı Askıya Al, sonra Hazırda Beklet

Ubuntu 16.04 ve üzeri

Solüsyon tarafından blueyed Linux 3.6+ ile askıya Gerçek melez için benim için çalışma yoktu. Bunun nedeni, Ubuntu 16.04'ün systemddosyayı kullanması ve kullanmamasıdır /etc/pm/config.d/00-use-suspend-hybrid.

İlk olarak, hazırda bekletme ve karma uykunun systemd kullanarak çalışıp çalışmadığını test edin

Ctrl+ Alt+ Tuşlarına basarak bir terminal açın Tve şunu girin:

sudo systemctl hibernate

Bu, bilgisayarınızın hazırda bekletme moduna geçmesini sağlamalıdır. Karma uykuyu denemek için, şunu girin:

sudo systemctl hybrid-sleep

İşe yararsa kalıcı olur.

  • Kapağı kapattığımda aşağıdakiler çalışıyor .

/etc/systemd/logind.confTercih ettiğiniz düzenleyiciyi kullanarak dosyayı açın . Sen yaparak idari gücünü çağırmak gerekir sudo, gksudoya da pkexecbu dosyayı düzenlemek için.

İki satırı bulun:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Not, Bu satırlar #önünde yorumlanmıştır. suspendVarsayılan eylemdir. Bunları kaldırın #ve bu iki satırda değiştirin suspend, hybrid-sleepböylece şöyle görünürler:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Dosya 'yı kaydet. Çıkış yapın ve tekrar giriş yapın.

Not:

  • Dışında suspendveya hybrid-sleepüçüncü bir seçenek var hibernate.
  • Dizüstü bilgisayarımın fiziksel bir uyku düğmesi yok. Bu yüzden test edemedim.
  • Tıklandığında Suspenddişli menü koyar normal bilgisayar hibrit uyku değil askıya.

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

Umarım bu yardımcı olur


2
Bu cevabın daha fazla oyuna ihtiyacı var. 16.04'te benim için sorunlar düzeltildi. Teşekkürler.
kapad

Rica ederim. Şimdi 14.04'ten 16.04'e taşındığım için, zamanla yavaşça yeni şeyler yapmanın yeni yolunu buluyorum.
user68186

1
Ayrıca Ubuntu GNOME ile çalışır 16.04.1
HarlemSquirrel

4

12.04'te, hazırda bekletme modunun (kullanıldığında PM_HIBERNATE_DELAY=XX) tetiklendiğinde , kabuk komut dosyalarının özgeçmiş / eritilmesinin grub kayıt hatası değişkenini ayarlamadığını fark ettim . Bu nedenle grub otomatik ateşlenmez.

Zaman aşımı -1 olarak ayarlanır ve kullanıcı seçimini bekler. Bunun için bazı betikleri düzenlemeyi gerektirdiğini tahmin ediyorum /etc/pm/sleep.d/10_grub-common. Acemim, bu yüzden maalesef kesin değişikliği anlayamadım.


1
Muhtemelen bir hata raporuna ve / veya 12.10 + 'da çalışıyorsa test edilmesine değecektir.
saat

Aynı sorunu
12.10'da görüyorum

3

Bu soru Google’da sık sık ortaya çıkmaya başladığını düşünüyorum. Burada tarif edilen yöntem (imo) hibrit süspansiyon değildir . "X dakika askıya alındıktan sonra hazırda bekleme". Gerçek karma askıya alma işlemi RAM'ınızı diske yazar ve daha sonra düşük güç durumuna geçer (uyku modu). Daha uzun sürdüğü halde, makine bataryası bitmişken devam etme anında gerçekleşir, aksi halde sabit diskten devam eder. Bu davranış çoğu insanın hibrid uyku olarak bildiği ve yeni Windows ve Mac dizüstü bilgisayarlarda varsayılan olarak kullandığı şeydir.

İşte gerçek melez askıya almanın nasıl etkinleştirileceği :

  • En üstteki cevabın ilk bölümünü takip edin. Bu, pm-utils içinde bir "hybrid_suspend" yapmak için "askıya alma" çağrısını geçersiz kılar.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Her zaman askıya almak yerine suspend_hybrid kullanın
    eğer ["$ METHOD" = "askıya alma"]; sonra
        YÖNTEM = suspend_hybrid
    fi
  • / Usr / lib / pm-utils / pm-işlevlerinin yedeğini alın
  • Yamayı buradan alın: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Bu yama, mümkünse hibrit askıya alınmasını sağlar (örn., 3.6+ çekirdekleri)
  • Ya 'patch -p0' kullanarak uygulayın ya da başarısız olursa manuel olarak birleştirin

Bu yöntem benim için Sony Vaio SVS'de çalışıyor.

Not: Dosyanın gelecekte silinmesi durumunda, yamanın burada yeniden üretilmesi:

fark - a / pm / pm-functions.in içinde b / pm / pm-functions.in içinde
--- a / pm / pm-fonksiyonlar.in
+++ b / pm / pm-fonksiyonlar.in
@@ -316,8 +316,28 @@ [-z "$ HIBERNATE_MODULE"] && \
    {
        [-n "$ {HIBERNATE_MODE}"]] && \
        grep -qw "$ {HIBERNATE_MODE}" / sys / güç / disk && \
+ HIBERNATE_MODE_SAVE = $ (cat / sys / güç / disk) && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE ## * [}" && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE %%] *}" && \
        echo -n "$ {HIBERNATE_MODE}"> / sys / güç / disk
        echo -n "disk"> / sys / güç / durum
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / güç / disk
+ "$ RET" döndür
+}
+ fi
+
Her ikisine de askıya alma işlemini destekleyen çekirdekler için + # (örn. karma askıya alma)
Çekirdek 3.6'dan beri + #
+ eğer [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / güç / disk] && \
+ grep -q disk / sys / güç / durum ve & \
+ grep -q askıya alın / sys / güç / disk; sonra
+ SUSPEND_HYBRID_MODULE = "çekirdek"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "askıya al"
+ do_hibernate
    }
 fi

Kaynaklar:


1
Hibrit askıya alma konusunda haklısın. Kısa bir süre önce snippet'imi kendim değiştirdim. METHOD = hibernate ve HIBERNATE_MODE = suspend komutunu kullanarak (oldukça) aynı sonucu alabilirsiniz. HIBERNATE_MODE = bir önceki sürümü (yamanın ne yaptığı) kaydetmek ve geri yüklemek yerine dosyanın üstündeki platform ayarını yapıyorum. Cevabımı yukarıda güncelleyeceğim.
blueyed

Harika görünüyor, düzenleme için teşekkürler, @blueyed
Rohan Dhruva

1

Config.d dosyasına herhangi bir dosya eklemeden başka bir çözüm var, sadece / sys / class / rtc / rtc0 dizininde wakealarm kullanıyor. Çekirdeklerin doğrudan desteklemediği için #since / / usr / lib / pm-utils pm işlevlerinde (/ usr / lib / pm-utils) eski kodu kullanın. Bu kodu geri alın ve do_suspend_hybrid () yerine do_suspend () bölümüne koyun ve pm-işlevleri için yamayı kullanın ('düzeltilinceye kadar).

Eski kod (suspend_hybrid çağrıldığında askıya alın ve sonra hazırda bekletme):

# 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

Önerilen. Uswsusp kullanmak daha da kolayken, aynı zamanda s2both'un yani s2both'un askıya alınma şeklindeki faydasını maksimuma çıkarır. Döndürülen kodu, uswsusp modülünün do_suspend () bölümüne (/usr/lib/pm-utils/module.d) koyun.

Geri döndürülen kod (askıya alma çağrıldığında askıya alınma zamanı)

        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      

Uswsusp ile, askıya alma / hazırda bekletme işleminin ilerlemesini ve metinde görüntülenen ters işlemi görebiliriz, hatta geri tuşuna basarak iptal edebiliriz. Uswsusp olmadan, askıya alma / hazırda bekletme modu, özellikle wakealarm tetiklendiğinde ve hazırda bekletme modunu çalıştırdığında (uswsusp'ta s2disk) can sıkıcı bir şekilde görünür. Uykuya dalmadan önce uyku süresini, pm-Fonksiyonları dosyasındaki normal bir yerde ayarlayın.

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

Uswsusp kipi: (unutma, bu modül pm-işlevlerinden çağrılır, böylece eklenen değişkenler aynıdır)

#!/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  

0

User68186 tarafından Ubuntu 16.04 için verilen cevap işe yaramadı. Ancak, burada çözüm yaptı.

İlk olarak, hazırda bekletme modunun çalıştığından emin olun. Sonra

Dconf Editör'ü arayın ve Ubuntu Yazılımında kurun. Sonra başlatın ve org -> gnome -> settings daemon -> plugins -> power'a gidin.

“Kapak-kapanma-ac eylemi” ve “kapak-kapanma-akü işlemi” değerini değiştirin.

Güç ayarlarımda bu seçenekler boş görünüyor, ancak istenildiği gibi çalışıyorlar.


0

In Ubuntu 18.04 çok daha easer. Gelen systemd yeni mod availiable askıya-o-hazırda bekleme . Bu işlevi kullanmaya başlamak için sonraki içeriğe sahip bir /etc/systemd/sleep.conf dosyası oluşturmanız gerekir :

[Sleep]
HibernateDelaySec=3600

Sonra komutla test edebilirsiniz:

sudo systemctl suspend-then-hibernate

(Hazırda bekletme süresini azaltmak için HibernateDelaySec'i düzenleyebilirsiniz). Her şey yolunda giderse , Lid Close Action özelliğini değiştirebilirsiniz, bunun için /etc/systemd/logind.conf dosyasını düzenlemeniz gerekir.

Seçenek HandleLidSwitch = 'u bulmanız , yorumunu kaldırmanız ve HandleLidSwitch = suspend-then-hibernate olarak değiştirmeniz gerekir . Ardından bir sonraki komutla logind servisini yeniden başlatmanız gerekir (wirning! Kullanıcı oturumunuz yeniden başlatılır):

systemctl restart systemd-logind.service

Bu kadar! Şimdi bu güzel işlevi kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.