Гибридный режим сна/гибернации заключается в том, что если в режиме сна содержимое оперативки «замораживается» и подпитывается от сети, а при гибернации оно записывается на хард и подпитки от сети не требует, то в гибридном режиме оба процесса происходят одновременно. Таким образом гибридный режим обеспечивает моментальное восстановление работы при выходе из сна, но также страхует от сброса состояния при неожиданном отключении электроэнергии.
В линуксе есть как минимум два варианта использовать сон и гибернацию, скажем так, в смешанном режиме. Я решал эту задачу на ноутбуке c Debian (без какого-либо окружения рабочего стола, так что готовых кнопочек не нашлось).
Начну с простого
Гибридный режим
Сам по себе вызывается командой
systemctl hybrid-sleep
На ноутбуке как правило хочется вызывать этот режим при закрытии крышки, для этого нужно отредактировать файл «/etc/systemd/logind.conf», изменив в секции «Login» параметр «HandleLidSwitch» с дефолтного «suspend» на «hybrid-sleep»
- [Login]
- #HandleLidSwitch=suspend
- HandleLidSwitch=hybrid-sleep
после этого нужно перезагрузить систему, или сервис systemd-logind (это перезапустит текущий сеанс пользователя, так что не забудьте сохранить все важное). Теперь при закрытии крышки будет активироваться гибридный режим.
Далее более сложный, но небезынтересный вариант.
Сон с отложенным переходом в гибернацию
Второй вариант смешанного режима заключается в том, что сначала система уходит в простой сон, но если сон подзатянулся, то происходит кратковременное пробуждение и переход в полноценную гибернацию. Это может иметь смысл для ноутбука, если есть потребность экономить энергию батареи во время продолжительной неактивности.
Для этого создаем файл /etc/systemd/system/suspend-sedation.service
- [Unit]
- Description=Hibernate after suspend
- Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
- Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1574125#p1574125
- Documentation=https://wiki.archlinux.org/index.php/Power_management
- Documentation=http://forums.debian.net/viewtopic.php?f=5&t=129088
- Documentation=https://wiki.debian.org/SystemdSuspendSedation
- Conflicts=hibernate.target hybrid-sleep.target
- Before=sleep.target
- StopWhenUnneeded=true
- [Service]
- Type=oneshot
- RemainAfterExit=yes
- Environment="ALARM_SEC=10800"
- Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
- ExecStart=/usr/sbin/rtcwake --seconds $ALARM_SEC --auto --mode no
- ExecStop=/bin/sh -c '\
- ALARM=$(cat $WAKEALARM); \
- NOW=$(date +%%s); \
- if [ -z "$ALARM" ] || [ "$NOW" -ge "$ALARM" ]; then \
- echo "suspend-sedation: Woke up - no alarm set. Hibernating..."; \
- sleep 10; \
- systemctl hibernate; \
- else \
- echo "suspend-sedation: Woke up before alarm - normal wakeup."; \
- /usr/sbin/rtcwake --auto --mode disable; \
- fi \
- '
- [Install]
- WantedBy=sleep.target
и включаем его
systemctl enable suspend-sedation
Теперь, через 10800 секунд (3 часа) после перехода в сон, комп сам проснется и переведет себя в режим гибернации.
Решение подсмотрено в интернете и отличается дополнительной строкой с командой «sleep 10;». Добавлена она потому, что установленный у меня syncthing крашился при моментальном переходе от сна к гибернации (лично я это связываю с работой сети, которая кратковременно нарушается и восстанавливается при выходе из спячки, но это не точно).