Bagaimana cara otomatis dari Menangguhkan ke Hibernate?


53

Apakah mungkin untuk membuat Ubuntu masuk ke kondisi Hibernate dari Suspend, alias "Suspend Sedation"?

Yang saya cari adalah ini:
Ketika saya menutup tutupnya, laptop dimasukkan ke Suspend. Kemudian, setelah waktu yang ditentukan sebelumnya (bahkan jika baterai menjadi kuat) jika saya masih tidak menggunakannya, itu harus menempatkan dirinya ke dalam Hibernate untuk menghemat daya baterai.

Sebagai contoh, laptop saya diatur untuk masuk ke Penangguhan setelah saya menutup tutupnya. Jika kemudian saya tidak menggunakannya sepanjang hari, baterainya habis, karena meskipun dalam mode tunda perangkat keras masih mengkonsumsi sejumlah kecil daya, dan baterainya akhirnya habis. Yang saya inginkan adalah dapat memberi tahu Ubuntu bahwa meskipun ditangguhkan, masih perlu masuk ke Hibernate setelah beberapa jam tidak aktif.

Windows dapat melakukannya. Ubuntu dapat diprogram untuk masuk ke mode Siaga atau Hibernate pada waktu, tetapi tidak keduanya.


Dalam penelitian saya, saya menemukan utas Linux Mint yang sama, tetapi "Penangguhan Sedasi" bukanlah istilah resmi Microsoft untuk fitur itu dan sejauh yang saya tahu ditemukan oleh pengguna forum Linux Mint yang menyebutkannya.
ayan4m1

Apakah ada nama yang lebih baik untuk fitur itu?
Sergey Stadnik

Sejauh yang saya tahu, tidak ada nama yang diterima secara universal untuk fitur ini. "Hybrid suspend" digunakan oleh beberapa orang, "suspend sedation" digunakan oleh salah satu pengguna forum Linux Mint, dan saya pernah mendengar "hibernate and suspend" digunakan untuk merujuk pada proses sebelumnya. Microsoft secara resmi menyebutnya sebagai "hybrid sleep," untuk Windows 7 setidaknya.
ayan4m1

2
@ ayan4m1 Saya menyadari ini adalah pertanyaan lama, tapi saya pikir penting untuk mengklarifikasi ini. Tidur Hyrbid tidak sama dengan "Tidur lalu hibernasi setelah waktu yang ditentukan". Tidur hibrida menjadi hibernasi saat daya hilang, melalui baterai habis. Perilaku yang dijelaskan oleh OP tidak memerlukan Tidur Hibrida untuk diaktifkan.
Paul

Jawaban:


20

Di Ubuntu 18.04 itu jauh 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 HibernateDelaySecuntuk mengurangi penundaan untuk 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=suspend-then-hibernate. Maka Anda perlu me-restart layanan systemd-logind (peringatan! Sesi pengguna Anda akan di-restart) dengan perintah berikut:

sudo systemctl restart systemd-logind.service

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


Ini tepat. Menggunakannya di Pop! _OS 18.10 (alias Ubuntu 18.10).
eduncan911

Brilian terima kasih! Apakah sleep.conf juga memengaruhi mode hibernate, atau hanya memengaruhi suspend-then-hibernate?
user2428107

@ user2428107 Anda dapat membaca tentang opsi di manual systutorials.com/docs/linux/man/5-systemd-sleep
PRIHLOP

35

Solusi untuk ini sederhana. Pertama, setelah menangguhkan dan melanjutkan, program pm-menangguhkan mengeksekusi serangkaian skrip di /etc/pm/sleep.ddan /usr/lib/pm-utils/sleep.d. Jadi solusi saya adalah menambahkan skrip yang melakukan hal berikut:

  1. Saat ditangguhkan, catat waktu saat ini dan daftarkan acara bangun menggunakan rtcwake.
  2. Setelah melanjutkan, periksa waktu saat ini terhadap waktu yang direkam dari atas. Jika waktu yang cukup telah berlalu, maka kita mungkin terbangun karena peristiwa timer rtc. Kalau tidak, kami bangun lebih awal karena acara pengguna (seperti membuka layar laptop).
  3. Jika kita bangun karena timer rtc, maka segera mengeluarkan perintah "pm-hibernate" untuk masuk ke hibernasi.

Berikut adalah skrip yang melakukan ini. Beri nama 0000rtchibernatedan letakkan di /etc/pm/sleep.ddirektori (0000 itu penting, sehingga skrip dijalankan pertama kali di tunda, dan terakhir pada resume).

#!/bin/bash
# Script name: /etc/pm/sleep.d/0000rtchibernate
# Purpose: Auto hibernates after a period of sleep
# Edit the "autohibernate" variable below to set the number of seconds to sleep.
curtime=$(date +%s)
autohibernate=7200
echo "$curtime $1" >>/tmp/autohibernate.log
if [ "$1" = "suspend" ]
then
    # Suspending.  Record current time, and set a wake up timer.
    echo "$curtime" >/var/run/pm-utils/locks/rtchibernate.lock
    rtcwake -m no -s $autohibernate
fi

if [ "$1" = "resume" ]
then
    # Coming out of sleep
    sustime=$(cat /var/run/pm-utils/locks/rtchibernate.lock)
    rm /var/run/pm-utils/locks/rtchibernate.lock
    # Did we wake up due to the rtc timer above?
    if [ $(($curtime - $sustime)) -ge $autohibernate ]
    then
        # Then hibernate
        rm /var/run/pm-utils/locks/pm-suspend.lock
        /usr/sbin/pm-hibernate
    else
        # Otherwise cancel the rtc timer and wake up normally.
        rtcwake -m no -s 1
    fi
fi

Semoga kode ini muncul di papan pesan ini (ini adalah posting pertama saya di sini).

Edit nilai batas waktu autohibernate=7200di atas, namun Anda harus tidur selama beberapa detik sebelum hibernasi. Nilai saat ini di atas adalah 2 jam. Perhatikan, bahwa laptop Anda AKAN bangun pada saat itu selama beberapa detik, ketika sedang menjalankan fungsi hibernasi.

Jadi jika Anda berencana untuk meletakkan laptop Anda di dalam case, jangan menangguhkan, tetapi hibernasi sebagai gantinya. Kalau tidak, laptop Anda bisa terlalu panas di esp. jika dalam kasus slip pas yang ketat (meskipun hanya akan hidup selama beberapa detik hingga satu menit).

Saya telah menggunakan metode ini selama beberapa hari terakhir, sejauh ini telah berhasil (dan menyelamatkan saya dari baterai mati sore ini). Nikmati.

Untuk distribusi Linux lainnya yang digunakan systemddan versi Ubuntu yang lebih baru ini harus tetap bekerja jika Anda menempatkan script di /usr/lib/systemd/system-sleepbukannya /etc/pm/sleep.d. Juga, ganti /usr/sbin/pm-hibernateperintah dengan systemctl hibernate.


Ini berhasil di sini, tetapi hanya setelah saya chmoded file untuk menambahkan X ke semua orang. Saya seorang pemula yang besar dan butuh 2 hari untuk mencari tahu. Skrip yang sangat bagus dan saya harap ini membantu siapa pun yang mungkin mengalami masalah. Terima kasih.

2
Ini akan membuat paket Ubuntu / Debian yang berguna!
Petr Pudlák

Hanya ingin tahu: apakah ini masih berlaku untuk Ubuntu 13.04? Saya benar-benar membutuhkan solusi ini, tetapi saya tidak ingin mengacaukan laptop istri jika ternyata hal-hal yang rusak pada versi yang lebih baru.
Torben Gundtofte-Bruun

Terima kasih untuk skripnya. Bekerja dengan baik untuk saya di Ubuntu 14.04! Satu peningkatan akan terjadi jika ketika laptop bangun untuk hibernasi, itu bisa memeriksa untuk melihat apakah itu dicolokkan ke daya AC. Jika demikian, saya ingin itu ditangguhkan lagi daripada hibernasi. Memulihkan dari hibernasi membutuhkan waktu lebih lama dan saya tidak benar-benar membutuhkannya untuk hibernasi ketika dicolokkan ...
maddentim

Terima kasih banyak!!!! Script ini adalah sihir yang saya impikan !!
yanpas

12

Untuk menjelaskan bagaimana ini bekerja (ini mirip dengan Windows) dengan kata-kata sederhana: mesin tidak bangun dari standby ketika baterai hampir habis untuk dapat menyimpan status mesin ke partisi swap, ia segera menyimpan semuanya ke partisi swap pada siaga, dan ketika baterai habis, itu akan pulih dari itu dengan memuat negara dari partisi swap (seperti yang akan dilakukan jika Anda hibernasi).

AFAIK linux akan / harus menggunakan hybrid standby / hibernate alih-alih standby "normal" jika ia tahu itu berfungsi untuk perangkat keras Anda. Mungkin juga ini dinonaktifkan saat ini karena terlalu banyak bug atau sesuatu ...;)

Jika Anda suka bereksperimen, mungkin Anda bisa melihat apakah Anda bisa mendapatkan hasil yang baik dengan pm-suspend-hybrid .

Jika yang berikut mengatakan Anda beruntung, maka secara teori penangguhan hibrida didukung di sistem Anda:

pm-is-supported --suspend-hybrid && echo "you're lucky"

1
Satu tanda kutip dalam perintah shell Anda bisa menyesatkan dan membingungkan ... tolong hindarilah.
ayan4m1

1
Bah, itulah yang terjadi ketika Anda mengedit baris perintah yang tertanam di dalam teks lain, tanpa memikirkannya sebagai baris perintah ... Terima kasih & diperbaiki.
JanC

Tidak masalah, ya mengerti tentang ruang kepala yang berbeda untuk dua proses.
ayan4m1

6

Anda mungkin tertarik dengan s2both . Ini disediakan oleh paket uswsuspdi Ubuntu 10.10. Ini disk ke disk, tetapi bukannya mematikan sistem, malah meletakkannya di S3, yang merupakan mode daya yang biasanya terkait dengan opsi "Tangguhkan" di Ubuntu. pm-suspend-hybrid adalah alat lain yang dimaksudkan untuk melakukan hal yang sama.

Untuk menjadikan ini otomatis pada tutup tutup, lihat panduan berikut yang memungkinkan Anda untuk menjalankan skrip sewenang-wenang ketika acara tutup ditangkap:

http://ubuntuforums.org/showthread.php?t=1076486

Jika Anda memiliki ThinkPad, halaman manual untuk tpctlmembuat referensi ke argumen --pm-sedation-hibernate-from-suspend-timer,, yang tampaknya menyediakan fitur yang Anda cari. Saya akan memperingatkan Anda agar tidak mencoba ini pada perangkat keras non-ThinkPad.

Sebagai referensi, saya melihat halaman manual untuk hibernate.conf ; tampaknya tidak memiliki opsi yang relevan tetapi mungkin layak dibaca kedua.


5

Ubuntu 16.04 - dari suspend / sleep menjadi hibernate setelah waktu yang ditentukan sebelumnya

Tampaknya pada Ubuntu 16.04 hal-hal sedikit berbeda, jadi langkah yang saya ambil untuk membuatnya bekerja adalah:

  1. Pastikan hibernate berfungsi seperti yang diharapkan saat berjalan

    systemctl hibernate
    
  2. Salin suspend.targetfile asli :

    sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
    

    Kemudian edit file /etc/systemd/system/suspend.targetdan tambahkan baris:

    Requires=delayed-hibernation.service
    

    ke [Unit]bagian file itu.

  3. Buat file /etc/systemd/system/delayed-hibernation.servicedengan konten berikut:

[Satuan]
Deskripsi = Pemicu hibernasi tertunda
Before = suspend.target
Konflik = hibernate.target hybrid-suspend.target
StopWhenUnneeded = true

[Layanan]
Ketik = oneshot
RemainAfterExit = ya
ExecStart = / usr / local / bin / penundaan-hibernation.sh pra menangguhkan
ExecStop = / usr / local / bin / menunda-hibernation.sh posting ditangguhkan

[Pasang]
WantedBy = sleep.target
  1. Buat file konfigurasi /etc/delayed-hibernation.confuntuk skrip dengan konten berikut:
# File konfigurasi untuk skrip 'tertunda-hibernasi.sh'

# Tentukan waktu dalam detik untuk dihabiskan dalam mode tidur sebelum komputer hibernasi
TIMEOUT = 1200 # dalam detik, berikan 20 menit
  1. Buat skrip yang benar-benar akan melakukan kerja keras.

    Buat file /usr/local/bin/delayed-hibernation.shdengan konten:

#! / bin / bash
# Nama skrip: menunda-hibernation.sh
# Tujuan: Auto hibernate setelah periode tidur
# Edit variabel `TIMEOUT` dalam file` $ hibernation_conf` untuk mengatur jumlah detik untuk tidur.

hibernation_lock = '/ var / run / penundaan-hibernation.lock'
hibernation_fail = '/ var / run / penundaan-hibernation.fail'
hibernation_conf = '/ etc / penundaan-hibernation.conf'

# Memeriksa file konfigurasi
jika [! -f $ hibernation_conf]; kemudian
    echo "File konfigurasi tidak ada ('$ hibernation_conf'), batal."
    keluar 1
fi
hibernation_timeout = $ (grep "^ [^ #]" $ hibernation_conf | grep "TIMEOUT =" | awk -F '=' '{print $ 2}' | awk -F '#' '{print $ 1}' | tr -d '[[\ t]]')
jika ["$ hibernation_timeout" = ""]; kemudian
    gema "Parameter 'TIMEOUT' yang hilang dari file konfigurasi ('$ hibernation_conf'), batal."
    keluar 1
Elif [[! "$ hibernation_timeout" = ~ ^ [0-9] + $]]; kemudian
    echo "Parameter 'TIMEOUT' salah ('$ hibernation_timeout') dalam file konfigurasi ('$ hibernation_conf'), diharapkan beberapa detik, dibatalkan."
    keluar 1
fi

# Memproses parameter yang diberikan
jika ["$ 2" = "menangguhkan"]; kemudian
    curtime = $ (tanggal +% s)
    if ["$ 1" = "pre"]; kemudian
        if [-f $ hibernation_fail]; kemudian
            echo "Gagal hibernasi terdeteksi, melewatkan pengaturan waktu bangun RTC."
        lain
            echo "Tangguhkan terdeteksi. Waktu perekaman, atur timer RTC"
            echo "$ curtime"> $ hibernation_lock
            rtcwake -m no -s $ hibernation_timeout
        fi
    elif ["$ 1" = "posting"]; kemudian
        if [-f $ hibernation_fail]; kemudian
            rm $ hibernation_fail
        fi
        if [-f $ hibernation_lock]; kemudian
            berkelanjutan = $ (cat $ hibernation_lock)
            rm $ hibernation_lock
            if [$ (($ curtime - $ sustime)) -ge $ hibernation_timeout]; kemudian
                echo "Resume otomatis terdeteksi dari suspend. Hibernasi ..."
                hibernate systemctl
                jika [$? -ne 0]; kemudian
                    echo "Hibernasi otomatis gagal. Mencoba untuk menunda saja."
                    sentuh $ hibernation_fail
                    systemctl menangguhkan
                    jika [$? -ne 0]; kemudian
                        echo "Hibernasi otomatis dan menangguhkan failover gagal. Tidak ada lagi yang bisa dicoba."
                    fi
                fi
            lain
                echo "Manual melanjutkan dari penangguhan terdeteksi. Menghapus waktu RTC"
                rtcwake -m nonaktifkan
            fi
        lain
            echo "File '$ hibernation_lock' tidak ditemukan, tidak ada hubungannya"
        fi
    lain
        echo "Parameter pertama yang tidak dikenal: '$ 1', diharapkan 'pre' atau 'post'
    fi
lain
    echo "Script ini dimaksudkan untuk dijalankan oleh systemctl menunda-hibernation.service (parameter kedua yang diharapkan: 'tunda')"
fi
  1. Jadikan skrip dapat dieksekusi:
chmod 755 /usr/local/bin/delayed-hibernation.sh

Butuh cukup banyak sampai saya menulis skrip ini berdasarkan balasan lain di utas ini, hal-hal yang saya temukan di internet seperti https://bbs.archlinux.org/viewtopic.php?pid=1554259

Versi skrip saya mencoba menangani banyak masalah seperti masuk ke suspend lagi jika hibernate tidak berhasil tetapi jangan bangun lagi setelah waktu yang ditentukan sebelumnya berulang-ulang.

  1. Langkah terakhir saya anggap hanya menjalankan

    sudo systemctl daemon-reload
    sudo systemctl enable delayed-hibernation.service 
    

    untuk memastikan layanan / konfigurasi baru digunakan.

Untuk memeriksa log layanan, Anda dapat menggunakan:

sudo systemctl status tertunda-hibernation.service

atau untuk log lengkap penggunaan layanan:

sudo journalctl -u menunda-hibernation.service

Log normal yang saya dapatkan dari layanan yang berjalan adalah:

miles @ mile-ThinkPad: ~ $ sudo status systemctl menunda-hibernation.service 
● delay-hibernation.service - Pemicu hibernasi tertunda
   Dimuat: dimuat (/etc/systemd/system/delayed-hibernation.service; diaktifkan; vendor preset: diaktifkan)
   Aktif: tidak aktif (mati)

Jun 09 20:35:42 miles-ThinkPad systemd [1]: Memulai pemicu hibernasi Tertunda ...
09 Juni 20:35:42 mil-ThinkPad menunda-hibernation.sh [2933]: Penangguhan terdeteksi. Waktu perekaman, atur timer RTC
09 Jun 20:35:42 mil-ThinkPad menunda-hibernation.sh [2933]: rtcwake: anggap RTC menggunakan UTC ...
09 Jun 20:35:42 miles-ThinkPad delay-hibernation.sh [2933]: rtcwake: wakeup using / dev / rtc0 at Thu 9 Jun 18 18:55:43 2016
Jun 09 20:55:44 miles-ThinkPad systemd [1]: Memulai pemicu hibernasi yang tertunda.
09 Juni 20:55:44 miles-ThinkPad systemd [1]: delay-hibernation.service: Unit tidak diperlukan lagi. Henti.
Jun 09 20:55:44 miles-ThinkPad systemd [1]: Menghentikan pemicu hibernasi yang tertunda ...
09 Juni 20:55:44 mil-ThinkPad menunda-hibernation.sh [3093]: resume otomatis dari penangguhan terdeteksi. Hibernasi ...
09 Jun 20:55:44 miles-ThinkPad systemd [1]: Menghentikan pemicu hibernasi.
miles @ miles-ThinkPad: ~ $ 

Jadi ini dia, saya harap ini sangat membantu seseorang karena saya menghabiskan waktu berhari-hari untuk mencari kombinasi yang tepat dari konfigurasi dan versi skrip untuk membuat fitur praktis ini berfungsi.


Terima kasih atas jawabannya, ini masih berfungsi seperti pesona di Ubuntu 18.04. Saya tidak bisa mendapatkan jawaban di atas untuk bekerja, mengeksekusi /bin/systemctl hibernateakan selalu mengembalikan 1 ketika berjalan di skrip systemd, meskipun berfungsi dengan baik pada baris perintah.
eugenhu

4

Kalau-kalau ada yang tidak beres selama pm-hibernatesaya lebih suka meletakkan komputer untuk menunda daripada membiarkannya berjalan. Jadi Anda bisa menggunakan:

   ...
/usr/sbin/pm-hibernate || /usr/sbin/pm-suspend
   ...

3

Berikut adalah versi terbaru dari jawaban Derek Pressnall yang bekerja dengan systemd dan memasukkan saran Eliah Kagan , cukup taruh di /usr/lib/systemd/system-sleep/delayed_hibernation.sh dan buat itu bisa dieksekusi:

#!/bin/bash

hibernation_timeout=1800  #30 minutes

if [ "$2" = "suspend" ]; then
    curtime=$(date +%s)
    if [ "$1" = "pre" ]; then
        echo -e "[($curtime) $@]\nExecuting pre-suspend hook..." >> /tmp/delayed_hibernation.log
        echo "$curtime" > /var/run/delayed_hibernation.lock
        rtcwake -m no -s $hibernation_timeout
    elif [ "$1" = "post" ]; then
        echo -e "[($curtime) $@]\nExecuting post-suspend hook..." >> /tmp/delayed_hibernation.log
        sustime=$(cat /var/run/delayed_hibernation.lock)
        if [ $(($curtime - $sustime)) -ge $hibernation_timeout ]; then
            echo -e "Automatic resume detected, hibernating.\n" >> /tmp/delayed_hibernation.log
            systemctl hibernate || systemctl suspend
        else
            echo -e "Manual resume detected, clearing RTC alarm.\n" >> /tmp/delayed_hibernation.log
            rtcwake -m no -s 1
        fi
        rm /var/run/delayed_hibernation.lock
    fi
fi

Ini bekerja dengan baik selama beberapa bulan pada tanggal 15,10 tetapi sesuatu tentang 16,04 mencegahnya melakukan hibernasi meskipun skrip masih berjalan.
Sean

@Sean sudahkah Anda mencoba solusinya di utas ini ?
Niccolò Maggioni

Terima kasih telah mengarahkan saya ke arah yang benar. Saya membuat layanan systemd (/etc/systemd/system/delayed-hibernation.service) yang mereferensikan skrip di atas kemudian memodifikasi /etc/systemd/system/suspend.target untuk membutuhkan layanan hibernation.service yang tertunda.
Sean

2

Ini resep saya (mengujinya pada dua notebook Ubuntu 16.04):

Letakkan skrip ini di mana pun Anda suka (saya taruh di root, /syspend.sh) dan buat itu bisa dieksekusi ( chmod +x /suspend.sh)

TIMELOG=/tmp/autohibernate.log
ALARM=$(tail -n 1 $TIMELOG)
SLEEPTIME=5000 #edit this line to change timer, e.g. 2 hours "$((2*60*60))"
if [[ $1 == "resume" ]]
then
    if [[ $(date +%s) -ge $(( $ALARM + $SLEEPTIME )) ]]
    then
        echo "hibernate triggered $(date +%H:%M:%S)">>$TIMELOG
        systemctl hibernate 2>> $TIMELOG
    else
        echo "normal wakeup $(date +%H:%M:%S)">>$TIMELOG
    fi
elif [[ $1 == "suspend" ]]
then
    echo "$(date +%s)" >> $TIMELOG
    rtcwake -m no -s $SLEEPTIME
fi

Kemudian membuat sasaran systemd: # touch /etc/systemd/system/suspend-to-sleep.target Paste konten ini:

#/etc/systemd/system/suspend-to-hibernate.service
[Unit]
Description=Delayed hibernation trigger
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash /suspend.sh suspend
ExecStop=/bin/bash /suspend.sh wakeup

[Install]
WantedBy=sleep.target
RequiredBy=suspend.target

Kemudian aktifkan # systemctl enable suspend-to-sleep.target.

Saya telah menghadapi masalah pada salah satu notebook: penutup tutup tidak memicu target ini. Ini disebabkan oleh xfce4-power-manager. Ada dua cara untuk mengatasi masalah ini. Yang pertama adalah mengedit /etc/systemd/logind.conffile dan mengganti HandleLidSwitch=ignoredengan HandleLidSwitch=suspend. Tetapi ini akan bersifat sistem, jadi saya hanya menambahkan symlink ke skrip saya# ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate


1

Solusi lain yang lebih umum dapat Anda gunakan hybrid-sleep(seperti Mac OS). Jika komputer Anda mendukung hibernasi, Anda dapat menggunakan fitur ini:

systemctl hybrid-sleep

Perintah itu harus menangguhkan dan mengirim ke disk (hibernasi) komputer. Setelah beberapa waktu komputer akan mati (saat dinyalakan, ia akan menggunakan file hibernasi untuk bangun).

ps: Saya tahu itu bukan apa yang diposting OP, tapi cukup dekat


0

Jangan lupa chmod + x file itu, membuatnya bisa dieksekusi.

Ada solusi lain tanpa rtcwake, menggunakan wakealarm di / sys / class / rtc / rtc0. Manfaatkan kode usang di pm-functions (/ usr / lib / pm-utils) setelah komentar # sejak 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 ().

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  
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.