Bagaimana cara menggunakan pm-suspend-hybrid secara default alih-alih pm-suspend?

41

Saya ingin menggunakan metode penangguhan hibrida alih-alih menangguhkan saat menutup tutupnya atau memilih "Tangguhkan" dari menu.

Saya bisa membayangkan mengubah skrip pm-suspend untuk melakukannya secara otomatis, tetapi mungkin ada cara yang lebih mudah dikelola / lebih mudah.

kebiru-biruan
sumber

Jawaban:

44

Tidur hibrida tidak langsung

Ini adalah metode yang lebih lama: tunda dulu dan kemudian bangun untuk hibernate setelah jeda (15 menit secara default). Gunakan ini dengan kernel Linux sebelum 3.6, atau jika Anda suka itu tidak menggunakan daya apa pun setelah 15 menit lagi.

Tambahkan file /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

Anda mungkin ingin memastikan bahwa metode hybrid didukung pada sistem Anda melalui kode berikut. Jika berbunyi "0" itu seharusnya berfungsi:

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

Hibrida nyata ditangguhkan dengan Linux 3.6+

Jika Anda memiliki kernel Linux 3.6, Anda dapat menggunakan yang berikut, yang akan ditangguhkan ke disk dan RAM dari awal.

Tambahkan file /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

Ini akan selalu menulis gambar ke disk dan kemudian menangguhkan ke RAM, memiliki manfaat bahwa melanjutkan kembali akan selalu cepat (selama baterai tidak habis) dan bahwa mesin tidak akan bangun untuk waktu yang singkat (setelah PM_HIBERNATE_DELAY) untuk hibernasi secara nyata.

Kekurangannya adalah prosesnya lebih lama (karena selalu hibernasi ke disk), dan baterai Anda mungkin habis dalam jangka panjang (misalnya setelah 12 jam).

kebiru-biruan
sumber
2
satu catatan kecil, alih-alih 'sudo pm-is-didukung --suspend-hybrid && echo $?', gunakan 'sudo pm-is-didukung --suspend-hybrid; echo $? ' karena nilai balik dari pm-is-didukung adalah 0 untuk didukung, dan 1 untuk tidak.
James Caccese
1
@JamesCaccese: Dalam dunia shellscript, 0 berarti "benar" dan yang lainnya berarti "salah". Scriplet Anda akan berfungsi, tetapi scriptlet poster asli juga akan berfungsi sebagaimana mestinya, dengan mencetak '0' pada yang didukung dan tidak ada pada yang tidak didukung. Jika Anda menginginkan sesuatu yang selalu mengatakan didukung atau tidak didukung, coba 'sudo pm-is-didukung --suspend-hybrid && echo "didukung" || gema "tidak didukung" '
zanfur
@zanfur - Walaupun saya suka solusi Anda yang disediakan berikutnya untuk mencetak kedua negara (dan tidak ada alasan apa pun yang tidak terduga yang didukung pm-didukung tidak berjalan seperti yang diharapkan, itu akan melakukan hal-hal yang tidak diketahui pada keadaan kesalahan ), saya menghargai penyebutan James Caccese tentang peringatan itu, untuk alasan yang disebutkan di atas .
user66001
Jika Anda menggunakan 16,04 lihat jawaban ini di bawah.
kapad
Satu-satunya bagian yang hilang bagi saya adalah resumeargumen dalam /etc/default/grub.conf. Juga sebagai pengguna nvidia yang harus saya atur nomodeset. Jadi dihasilkan entri grub dalam kasus saya adalah: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". Jangan lupa grub-update. Dan juga beberapa modul harus dibongkar sehingga dibuat file /etc/pm/config.d/00-unload_modulesdengan baris SUSPEND_MODULES="ath5k r8169"dan hanya untuk memastikan saya juga mengganti nama 00-use-suspend-hybrid to10-use-suspend-hybrid
mauron85
31

Ubuntu 18,04 opsi berjangka waktu

Di Ubuntu 18.04 telah memiliki opsi berjangka waktu baru. In systemdadalah tersedia mode baru suspend-then-hibernate. Ini akan mulai dengan mode tidur dan kemudian beralih ke mode hibernasi setelah waktu yang tetap.

Dalam hybrid-sleepmode, bagian hibernasi menjadi efektif hanya ketika baterai sangat lemah dan sistem dimatikan.

Untuk mulai menggunakan fungsi ini, Anda perlu membuat file /etc/systemd/sleep.confdengan konten berikutnya:

[Sleep]
HibernateDelaySec=3600

Ini akan berubah dari tidur menjadi hibernasi setelah 1 jam tidur. Anda dapat mengedit HibernateDelaySecuntuk mengubah penundaan ke hibernasi.

Pertama, uji apakah suspend-then-hibernate berfungsi menggunakan systemd

Buka terminal dengan menekan Ctrl+ Alt+ Tdan masukkan:

sudo systemctl suspend-then-hibernate

Jika berhasil membuatnya permanen.

  • Berikut ini berfungsi ketika saya menutup tutupnya .

Buka file /etc/systemd/logind.confmenggunakan editor pilihan Anda. Anda perlu meminta kekuatan administratif Anda dengan sudo, gksudoatau pkexecmengedit file ini.

Temukan dua baris:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Catatan, Baris-baris ini dikomentari #di depannya. Ini suspendadalah tindakan default. Hapus #dan ubah suspendke suspend-then-hibernatedalam dua baris ini sehingga terlihat seperti ini:

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

Simpan file. Logout dan log in atau restart logindlayanan dengan perintah:

systemctl restart systemd-logind.service

peringatan! sesi pengguna Anda akan dimulai kembali

Sumber: Tutup Ditutup, Tangguhkan lalu Hibernasi

Ubuntu 16.04 dan lebih tinggi

The solusi oleh blueyed untuk hybrid Estat menangguhkan dengan Linux 3.6+ tidak bekerja untuk saya. Saya menduga ini karena Ubuntu 16.04 menggunakan systemddan tidak menggunakan file /etc/pm/config.d/00-use-suspend-hybrid.

Pertama, uji apakah hibernate dan hybrid-sleep berfungsi menggunakan systemd

Buka terminal dengan menekan Ctrl+ Alt+ Tdan masukkan:

sudo systemctl hibernate

Ini akan membuat komputer Anda hibernasi. Untuk mencoba tidur hibrida, masukkan:

sudo systemctl hybrid-sleep

Jika berhasil membuatnya permanen.

  • Berikut ini berfungsi ketika saya menutup tutupnya .

Buka file /etc/systemd/logind.confmenggunakan editor pilihan Anda. Anda perlu meminta kekuatan administratif Anda dengan sudo, gksudoatau pkexecmengedit file ini.

Temukan dua baris:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Catatan, Baris-baris ini dikomentari #di depannya. Ini suspendadalah tindakan default. Hapus #dan ubah suspendke hybrid-sleepdalam dua baris ini sehingga terlihat seperti ini:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Simpan file. Logout dan log in kembali.

catatan:

  • Selain suspendatau hybrid-sleepada opsi ketiga hibernate,.
  • Laptop saya tidak memiliki tombol tidur fisik. Jadi saya tidak bisa mengujinya.
  • Mengklik pada Suspenddari menu cog menempatkan komputer untuk menunda normal tidak hibrida-tidur.

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

saya harap ini membantu

pengguna68186
sumber
2
Jawaban ini perlu lebih banyak upvotes. Memperbaiki masalah untuk saya di 16.04. Terima kasih.
kapad
Sama sama. Sekarang saya telah pindah dari 14,04 ke 16,04, saya menemukan cara systemd baru dalam melakukan sesuatu, perlahan seiring waktu.
user68186
1
Juga bekerja dengan Ubuntu GNOME 16.04.1
HarlemSquirrel
4

Dalam 12.04 saya perhatikan bahwa ketika hibernasi dipicu (menggunakan PM_HIBERNATE_DELAY=XX), resume / mencairkan skrip shell tidak menghapus variabel grub recordfail. Karenanya grub tidak melakukan autoboot.

Waktu habis diatur ke -1 dan menunggu pilihan pengguna. Saya menduga ini memerlukan beberapa pengeditan skrip di /etc/pm/sleep.d/10_grub-common. Saya seorang pemula jadi saya belum mencoba-coba mencari tahu perubahan yang tepat sayangnya.

bo apa
sumber
1
Mungkin layak laporan bug dan / atau pengujian jika berfungsi pada 12.10+.
blueyed
Saya melihat masalah yang sama di 12.10
MDCore
3

Pertanyaan ini cukup sering muncul di Google sehingga saya pikir ini layak untuk ditabrak. Metode yang dijelaskan di sini adalah (imo) bukan penangguhan hibrid. Ini "hibernasi setelah X menit ditangguhkan". True hybrid suspend menulis RAM Anda ke disk dan kemudian pergi dalam kondisi daya rendah (mode tidur). Sementara itu membutuhkan waktu lebih lama, resume adalah instan ketika mesin memiliki baterai yang tersisa, jika tidak dilanjutkan dari hard disk. Perilaku ini adalah apa yang kebanyakan orang tahu sebagai tidur hibrida, dan digunakan secara default di laptop Windows dan Mac yang lebih baru.

Berikut cara mengaktifkan penangguhan hibrid nyata :

  • Ikuti bagian pertama dari jawaban teratas. Ini mengesampingkan "menangguhkan" panggilan untuk melakukan "hybrid_suspend" di pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Selalu gunakan suspend_hybrid daripada suspend
    jika ["$ METHOD" = "menangguhkan"]; kemudian
        METHOD = suspend_hybrid
    fi
  • Buat cadangan dari fungsi / usr / lib / pm-utils / pm
  • Dapatkan tambalan dari sini: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Patch ini memungkinkan penangguhan hibrid jika tersedia (mis. Pada kernel 3.6+)
  • Baik menerapkannya menggunakan 'patch -p0' atau menggabungkannya secara manual jika itu gagal

Metode ini berfungsi untuk saya di Sony Vaio SVS saya.

PS: Mereproduksi tambalan di sini jika file dihapus di masa depan:

beda --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 @@ jika [-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
+ pengembalian "$ RET"
+}
+ fi
+
+ # untuk kernel yang mendukung penangguhan untuk keduanya (mis. penangguhan hibrid)
+ # sejak kernel 3.6
+ jika [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q disk / sys / power / state && \
+ grep -q menangguhkan / sys / power / disk; kemudian
+ SUSPEND_HYBRID_MODULE = "kernel"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "menangguhkan"
+ do_hibernate
    }
 fi

Sumber:

Rohan Dhruva
sumber
1
Anda benar tentang penangguhan hibrid. Saya baru-baru ini mengubah cuplikan saya sendiri. Anda bisa mendapatkan (cukup) hasil yang sama dengan menggunakan METHOD = hibernate dan HIBERNATE_MODE = menangguhkan. Saya mengatur HIBERNATE_MODE = platform di bagian atas file, alih-alih menyimpan dan memulihkan versi sebelumnya (apa yang dilakukan patch). Saya akan memperbarui jawaban saya di atas.
blueyed
Itu tampak hebat, terima kasih untuk hasil editnya, @blueyed
Rohan Dhruva
1

Ada solusi lain tanpa menambahkan file apa pun di config.d, hanya menggunakan wakealarm di / sys / class / rtc / rtc0. Manfaatkan kode usang di pm-functions (/ usr / lib / pm-utils) setelah komentar # karena kernel tidak secara langsung mendukung ..., (karena kernel saat ini (setelah 3,6 sesuatu) tidak langsung mendukung). Kembalikan kode itu dan masukkan bagian do_suspend () alih-alih do_suspend_hybrid (), dan gunakan patch untuk fungsi-pm (sampai mereka memperbaikinya).

Kode usang (menangguhkan lalu hibernasi ketika suspend_hybrid dipanggil):

# 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

Direkomendasikan. Lebih mudah menggunakan uswsusp sementara pada saat yang sama memaksimalkan manfaat s2both yaitu s2both saat ditangguhkan. Masukkan kode yang dikembalikan ke do_suspend () bagian dari modul uswsusp (/usr/lib/pm-utils/module.d).

Kode yang dikembalikan (suspend_hybrid saat suspend dipanggil):

        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      

Dengan uswsusp, kita dapat melihat progres suspend / hibernate dan proses sebaliknya ditampilkan dalam teks, bahkan kita dapat membatalkannya dengan menekan backspace. Tanpa uswsusp, suspend / hibernate hanya muncul-menghilang secara mengganggu, terutama ketika wakealarm dipicu dan menjalankan hibernate (s2disk di uswsusp). Atur periode tidur sebelum hibernasi di tempat biasa di file pm-functions.

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

Inilah mod uswsusp: (ingat, modul ini dipanggil dari pm-functions sehingga variabel yang dimasukkan adalah sama)

#!/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  
menandai
sumber
0

Jawaban oleh user68186 untuk Ubuntu 16.04 tidak berhasil untuk saya. Namun, solusinya di sini .

Pertama, pastikan hibernasi berfungsi. Kemudian

Cari dan instal Editor dconf di Perangkat Lunak Ubuntu. Kemudian jalankan dan arahkan ke org -> gnome -> daemon pengaturan -> plugins -> power.

Ubah nilai "tutup-tutup-aksi-aksi" dan "tutup-tutup-tindakan-baterai".

Dalam pengaturan daya saya, opsi ini muncul sebagai kosong, tetapi mereka berfungsi sebagaimana mestinya.

qwr
sumber
0

Di Ubuntu 18.04 lebih mudah. Dalam systemd tersedia mode baru suspend-then-hibernate . Untuk mulai menggunakan fungsi ini, Anda perlu membuat file /etc/systemd/sleep.conf dengan konten berikutnya:

[Sleep]
HibernateDelaySec=3600

Kemudian Anda dapat mengujinya dengan perintah:

sudo systemctl suspend-then-hibernate

(Anda dapat mengedit HibernateDelaySec untuk mengurangi penundaan menjadi hibernasi). Jika semua berfungsi dengan baik Anda dapat mengubah Tutup Tutup Tindakan, untuk melakukannya Anda perlu mengedit file /etc/systemd/logind.conf

Anda perlu menemukan opsi HandleLidSwitch = , batalkan komentar dan ubah ke HandleLidSwitch = menangguhkan-lalu-hibernasi . Maka Anda perlu me-restart layanan logind (wirning! Sesi pengguna Anda akan direstart) dengan perintah berikut:

systemctl restart systemd-logind.service

Itu saja! Sekarang Anda dapat menggunakan fungsi yang bagus ini.

PRIHLOP
sumber