Linux: Come sibernazione dopo un periodo di sonno

Una delle funzionalità di Windows che mi manca in Linux è la seguente: nelle windows chiude il coperchio del notebook e il sistema sospende la RAM, dopo un po '(configurabile) il computer si sveglia automaticamente e procede alla sospensione sul disco. So che in linux esiste la modalità suspend2both ma che funziona sospendendo al disco appena prima di esaurire la batteria che è quello che sto cercando di evitare.

EDIT: risposta più dettagliata trovata dopo la ricerca con i dati di risposta

https://askubuntu.com/questions/12383/how-to-go-automatically-from-suspend-into-hibernate

EDIT2: Questi sono i passi che ho seguito usando Ubuntu 11.04 su un MSI Wind U100.

In primo luogo: ho installato tuxonice perché l'ibernazione non funzionava sul mio netbook. Come effetto collaterale i processi di ibernazione e di risveglio sono abbastanza veloci e molto stabili. Lo svantaggio unico è che il display in modalità hibernate / resume è in modalità text. Il modo più semplice per installare tuxonice è aggiungendo il corrispondente ppa: https://launchpad.net/~tuxonice/+archive/ppa

    Una volta che si lavora in ibernazione questo script fa tutta la magia

    #!/bin/bash # Script name: /etc/pm/sleep.d/00rtchibernate # 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 

    Modificando il valore autohibernato si modifica il tempo di sonno dopo il quale la macchina si sveglierà e va immediatamente in ibernazione

    NOTA: Potrebbe essere necessario installare rtcwake, già installato ma non riesco a ricordare se ho installato il pacchetto stesso.

    Per altre distros come CentOS o Fedor o Redhat che usa systemd . Dobbiamo cambiare la posizione dello script invece di collocarla in /etc/pm/sleep.d/ posizionarla in /usr/lib/systemd/system-sleep/ come 0000rtchibernate.sh usare chmod +x per renderlo eseguibile.

    Infine, sono necessarie anche alcune modifiche nello script per renderlo compatibile con systemd . Per semplicità, sto dando il completo scritto redatto

     #!/bin/bash # Script name: /usr/lib/systemd/system-sleep/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=3600 #number is second lock=/tmp/rtchibernate.lock echo "$curtime $1" >>/tmp/autohibernate.log if [ "$1" = "pre" ] then # Suspending. Record current time, and set a wake up timer. echo "$curtime" > $lock rtcwake -m no -s $autohibernate fi if [ "$1" = "post" ] then # Coming out of sleep sustime=`cat $lock` rm $lock # Did we wake up due to the rtc timer above? if [ $(($curtime - $sustime)) -ge $autohibernate ] then # Then hibernate systemctl hibernate else # Otherwise cancel the rtc timer and wake up normally. rtcwake -m no -s 1 fi fi 

    La variabile autohibernate è in secondi cambiare come sembra fit.I spero di aver aiutato

    Immagino che cosa volete è qualcosa di simile a http://www.linuxcertif.com/man/8/rtcwake/ che potrebbe essere utilizzato al posto del programma predefinito S2R (AKA sleep). Questo potrebbe quindi risvegliare la macchina se è stato addormentato per più di (dire) 20 minuti e innescare un ibernato.

    Non dimenticare di chmod +x quel file, rendendolo eseguibile.

    C'è un'altra soluzione senza rtcwake , usando wakealarm in /sys/class/rtc/rtc0 . Utilizzare codice obsoleto nelle funzioni pm ( /usr/lib/pm-utils ) dopo i commenti # dopo che il kernel non support direttamente …, (cos perch il kernel corrente (dopo 3.6 qualcosa) support direttamente. Ripristinare questo codice e mettere in do_suspend() parte invece di do_suspend_hybrid() .

    Codice obsoleto (sospende poi sospensione quando si chiama sospensione_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 

    Consigliato. Ancora più facile da usare uswsusp mentre nello stesso tempo massimizzare il vantaggio di s2both cioè s2both when suspend . Inserire il codice restituito in do_suspend() parte del module uswsusp ( /usr/lib/pm-utils/module.d ).

    Codice ripristinato (sospensione_signa quando viene chiamata sospensione):

     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 

    Con uswsusp , possiamo vedere il progresso della sospensione / ibernazione e il process inverso visualizzato in text, anche possiamo abortire premendo il backspace. Senza uswsusp , sospensione / ibernazione appaiono appena, spariscono fastidiosamente, specialmente quando viene triggersto il wakealarm ed eseguire hibernate ( s2disk in uswsusp). Impostare il periodo di sonno prima di sbernare nel solito posto sul file delle pm-functions .

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

    Ecco il mod uswsusp : (ricorda, questo module è chiamato da pm-functions quindi le variables inserite sono le stesse)

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