LINUX.ORG.RU

Debian+uswsusp+Hybrid Suspend задержка

 


1

2

Дорогие Лоровцы, может быть мой вопрос и баян, но гугл молчит как рыба :(
Вопрос такой - как настроить гибридный сон с задержкой? Хотелось бы использовать для этого uswsusp, поскольку он умеет сжимать образ ОЗУ перед списыванием на мой не очень быстрый ЖД.
Под гибридным сном с задержкой понимается:
команда на сон
--------------
suspend to RAM (сразу же)
--------------
hibernate (через полчаса)
--------------

Спасибо заранее за помощь :)

Система - Debian Testing AMD64, swap раздел - имеется
Железо - ноутбук CLEVO W350ST (Intel Core i7 4700MQ, Intel HD Graphics 4600, Nvidia GTX765M, 8gb RAM

Посмотрите, как сделан pm-suspend-hybrid. Средствами только ядра он не работает, так что авторы скрипта сделали его симуляцию через rtcwake.

AITap ★★★★★
()
Ответ на: комментарий от Dron

и куда вы предлагаете это дописывать? sleep к suspend отношения не имеет же - будить из спячки не может, видимо вы невнимательно прочитали мой пост :(

madarexxx
() автор топика
Ответ на: комментарий от madarexxx

pm-hibernate это bash скрипт /usr/sbin/pm-hibernate и я намекнул на то чтобы добавить туда задержку 30 минут sleep 1800.

Хотя хрен его знает что подразумевается под словом задержка.

Dron ★★★★★
()
Ответ на: комментарий от Dron

под задержкой подразумевается мгновенное s2ram, полчаса задержки, списывание образа RAM на диск (s2disk).
такой режим работы есть, но как его активировать?


# 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
[\pre]

madarexxx
() автор топика
Ответ на: комментарий от madarexxx

Самый тупой способ - удалить uswsusp и запустить pm-suspend-hybrid. Если хотите использовать uswsusp, возьмите определение функции do_suspend_hybrid() выше, замените в нём вызовы do_suspend и do_hibernate на s2disk и s2ram, определите переменные NOW и PM_HIBERNATE_DELAY, функцию log() (man logger) и сохраните в отдельный скрипт.

AITap ★★★★★
()
Ответ на: комментарий от AITap

удаление uswsusp ни грамма не помогает - точно также списывает на диск раму сразу после запуска pm-suspend-hybrid.
значит придётся танцевать с бубном на pm-suspend

madarexxx
() автор топика
Ответ на: комментарий от AITap

pm-suspend-hybrid delay pm_hibernation_delay suspend delay

для потомков и гугла: pm-suspend-hybrid delay pm_hibernation_delay suspend delay

получилось обеспечить задержку как и планировалось - вот такой костыль получился (может быть кому поможет организовать удобную и надёжную спячку на ноутбуке с медленным ХД):

#!/bin/bash
PM_HIBERNATE_DELAY=1800  # 30 minutes
PM_RTC=/sys/class/rtc/rtc0

PM_LOGFILE="/var/log/super_sleep.log"
log()
{
        is_set "$LOGGING" || return 0;
        local fmt='%s\n'
        [ "$1" = "-n" ] && { fmt='%s'; shift; }
        printf "$fmt" "$*"
}



WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
        echo >"$PM_RTC/wakealarm"
        echo $WAKETIME > "$PM_RTC/wakealarm"
        if s2ram; 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.
                s2disk || s2ram
            else
                echo > "$PM_RTC/wakealarm"
            fi
        else
            # if we cannot suspend, just try to hibernate.
            s2disk
        fi

madarexxx
() автор топика
Ответ на: комментарий от AITap

не могу отредактировать сообщение, поэтому дописываю постскриптум:
п.с. спасибо большое за информацию, даже с моими минимальными познаниями в баше, получилось реализовать желаемое :)

madarexxx
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.