Я хотел бы использовать гибридный метод приостановки вместо приостановки при закрытии крышки или выборе «Suspend» из меню.
Я могу себе представить, чтобы скрипт pm-suspend делал это автоматически, но может быть более удобный / более простой способ.
Это более старый метод: сначала приостановить, а затем выйти из спящего режима после задержки (по умолчанию 15 минут). Используйте это с ядром Linux до 3.6, или, если хотите, он больше не потребляет питание через 15 минут.
Добавьте файл /etc/pm/config.d/00-use-suspend- гибрид
:
# 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
Вы можете убедиться, что гибридный метод поддерживается в вашей системе, с помощью следующего кода. Если указано «0», все должно работать:
sudo pm-is-supported --suspend-hybrid && echo $?
Если у вас ядро Linux 3.6, вы можете использовать следующее, которое с самого начала приостановит и диск, и оперативную память.
Добавьте файл / etc /pm/config.d/00-use-suspend-hybrid
:[1216 impression Это всегда будет записывать образ на диск, а затем приостанавливать его в ОЗУ, имея преимущества, заключающиеся в том, что возобновление всегда будет быстрым (пока батарея не заканчивается), и что машина не просыпается в течение короткого времени (после PM_HIBERNATE_DELAY) для реального перехода в спящий режим.
Недостатком является то, что процесс занимает больше времени (потому что он всегда переходит в спящий режим на диск), и что ваша батарея может закончиться в долгосрочной перспективе (например, через 12 часов).
В 12.04 я заметил, что при срабатывании спящего режима (с помощью PM_HIBERNATE_DELAY=XX
), сценарии оболочки не сбрасывают переменную grub recordfail. Поэтому grub не осуществляет автозагрузку.
Тайм-аут установлен на -1 и ждет выбора пользователя. Полагаю, это требует некоторого редактирования скриптов в /etc/pm/sleep.d/10_grub-common
. Я новичок, поэтому, к сожалению, не смог разобраться с точным изменением.
Tas jautājums Google tīklā parādās pietiekami bieži, ka, manuprāt, ir vērts sasist. Šeit aprakstītā metode ir (imo) nevis hibrīda suspensija. Tas ir "pārziemojis pēc X minūtes apturēšanas". Patiesa hibrīda apturēšana izraksta jūsu RAM uz diska un pēc tam iet mazjaudas stāvoklī (miega režīmā). Lai gan tas prasa ilgāku laiku, atsākšana notiek uzreiz, kamēr mašīnai ir atstāts akumulators, pretējā gadījumā atsāk no cietā diska. Šo uzvedību lielākā daļa cilvēku zina kā miega miegu un pēc noklusējuma to izmanto jaunākajos Windows un Mac klēpjdatoros.
Lūk, kā iespējot reālā hibrīda apturēšanu:
% cat /etc/pm/config.d/00-use-suspend-hybrid # Always use suspend_hybrid instead of suspend if [ "$METHOD" = "suspend" ]; then METHOD=suspend_hybrid fi
Šī metode man der manam Sony Vaio SVS.
PS: Ja šeit fails tiks izdzēsts, šeit atkārtot plāksteri:
diff --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 @@ if [ -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 + return "$RET" + } +fi + +# for kernels that support suspend to both (i.e. hybrid suspend) +# since kernel 3.6 +if [ -z "$SUSPEND_HYBRID_MODULE" ] && \ + [ -f /sys/power/disk ] && \ + grep -q disk /sys/power/state && \ + grep -q suspend /sys/power/disk; then + SUSPEND_HYBRID_MODULE="kernel" + do_suspend_hybrid() + { + HIBERNATE_MODE="suspend" + do_hibernate } fi
Avoti:
Ответ пользователя 68186 для Ubuntu 16.04 у меня не сработал. Однако решение здесь сработало.
Во-первых, убедитесь, что спящий режим работает. Затем
Найдите и установите редактор dconf в программном обеспечении Ubuntu. Затем запустите его и перейдите в org -> gnome -> settings daemon -> plugins -> мощность.
Измените значение «закрытие крышки переменного тока» и «Lid-close-battery-action».
В моих настройках питания эти параметры отображаются как пустые, но работают должным образом.
В Ubuntu 18.04 это намного проще. В systemd доступен новый режим suspend-then-hibernate. Для начала использования этой функции необходимо создать файл /etc/systemd/sleep.conf со следующим содержимым:
[Sleep]
HibernateDelaySec=3600
Затем вы можете протестировать его командой:
sudo systemctl suspend-then-hibernate
(вы можете отредактировать HibernateDelaySec, чтобы уменьшить задержку до спячки). Если все работает нормально, вы можете изменить действие по закрытию крышки, для этого нужно отредактировать файл /etc/systemd/logind.conf
Вам нужно найти опцию HandleLidSwitch=, прокомментировать ее и поменять на HandleLidSwitch=suspend-then-hibernate. Затем необходимо перезапустить службу логирования (wirning! you user session will be restarted) следующей командой:
systemctl restart systemd-logind.service
Вот и все! Теперь вы можете использовать эту замечательную функцию.
В Ubuntu 18.04 есть новая временная опция. В systemd
доступен новый режим приостановка-затем-гибернация
. Это начнется с режима сна, а затем перейдет в режим гибернации через фиксированное время.
В режиме гибридного спящего режима
часть гибернации вступает в силу только тогда, когда уровень заряда батареи критически низкий и система выключается.
Чтобы начать использовать эту функцию, вам необходимо создать файл /etc/systemd/sleep.conf
со следующим содержимым:
[Sleep]
HibernateDelaySec=3600
Он перейдет из режима сна в режим гибернации после 1 часа сна. Вы можете отредактировать HibernateDelaySec
, чтобы изменить задержку перехода в спящий режим.
Сначала проверьте, работает ли режим ожидания-затем-гибернации с использованием systemd
Откройте терминал, нажав Ctrl + ] Alt + T и введите:
sudo systemctl suspend-then-hibernate
Если работает, сделайте постоянным.
Откройте файл /etc/systemd/logind.conf
с помощью предпочитаемого вами редактора. Чтобы отредактировать этот файл, вам нужно будет задействовать свои административные полномочия с помощью sudo
, gksudo
или pkexec
.
Найдите две строки:
#HandleSuspendKey=suspend
#HandleLidSwitch=suspend
Примечание. Эти строки закомментированы #
перед ними. приостановить
является действием по умолчанию. Удалите #
и измените suspend
на suspend-then-hibernate
в этих двух строках, чтобы они выглядели следующим образом:
HandleSuspendKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate
Сохраните файл. Выйдите из системы и войдите снова или перезапустите службу logind
с помощью команды:
systemctl restart systemd-logind.service
предупреждение! ваш сеанс пользователя будет перезапущен
Источник: Lid Closed Suspend, затем Hibernate
Решение от blueyed для приостановки реального гибрида с Linux 3.6+ у меня не сработало. Я подозреваю, что это потому, что Ubuntu 16.04 использует systemd
и не использует файл /etc/pm/config.d/00-use-suspend-hybrid
.
Сначала протестируйте если спящий режим и гибридный сон работают с использованием systemd
Откройте терминал, нажав Ctrl + Alt + T и введите:
sudo systemctl hibernate
Это должно компьютер в спящий режим. Чтобы попробовать гибридный режим сна, введите:
sudo systemctl hybrid-sleep
Если он работает, сделайте его постоянным.
Откройте файл / etc / systemd / logind.conf
, используя предпочитаемый вами редактор. Чтобы отредактировать этот файл, вам нужно будет вызвать свои административные полномочия с помощью sudo
, gksudo
или pkexec
.
Найдите две строки:
#HandleSuspendKey=suspend
#HandleLidSwitch=suspend
Примечание. Эти строки закомментированы #
перед ними. Приостановить
является действием по умолчанию. Удалите #
и измените suspend
на hybrid-sleep
в этих двух строках, чтобы они выглядели следующим образом:
HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep
Сохраните файл. Выйдите из системы и войдите снова.
Примечание:
приостановить
или гибридный спящий режим
, существует третий вариант, спящий режим
. Приостановить
в меню шестеренки переводит компьютер в
нормальная приостановка, а не гибридный сон. Надеюсь, это поможет
Есть другое решение, не добавляя никаких файлов в config.d, просто используя wakealarm в / sys / class / rtc / rtc0. Используйте устаревший код в pm-функциях (/ usr / lib / pm-utils) после комментариев #, поскольку ядро не поддерживает напрямую ..., (потому что текущее ядро (что-то после 3.6) поддерживает напрямую). Верните этот код и вставьте часть do_suspend () вместо do_suspend_hybrid () и используйте патч для pm-функций (пока они не исправят его).
Устаревший код (приостановить, а затем перейти в спящий режим при вызове suspend_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
Рекомендуемые. Еще проще использовать uswsusp и в то же время максимально использовать преимущества s2both, то есть s2both, когда они приостановлены. Поместите восстановленный код в часть do_suspend () модуля uswsusp (/usr/lib/pm-utils/module.d).
Отмененный код (suspend_hybrid при вызове 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
С uswsusp мы можем видеть прогресс приостановки / гибернации и обратный процесс, отображаемый в тексте, даже если мы можем прервать его, нажав клавишу возврата. Без uswsusp режимы приостановки / гибернации просто появляются-исчезают досадно, особенно когда срабатывает wakealarm и запускается спящий режим (s2disk в uswsusp). Установите период ожидания перед переходом в спящий режим в обычном месте в файле pm-functions.
# variables to handle hibernate after suspend support
PM_HIBERNATE_DELAY=900 # 15 minutes
PM_RTC=/sys/class/rtc/rtc0
Вот мод uswsusp: (помните, этот модуль вызывается из pm-функций, поэтому вставленные переменные одинаковы)
#!/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