четверг, 2 февраля 2017 г.

Настройка suspend to hibernate в Debian Jessie

Ранее я уже писал про экономию заряда батареи ноутбука при использовании suspend to ram (S3). Такой режим называется suspend to hibernate и заключается в автоматическом переходе из S3 (suspend to ram) в S4 (suspend to disk) если пользователь не продолжит работу в течении заданного периода времени.

Прошлое решение базировалось на pm-utils, но с переходом jessie на systemd это перестало работать (#745848). До недавнего времени я пользовался jessie + sysv init и эта проблема меня не касалась, но последнее время все чаще сталкиваюсь с systemd и решил дать ему шанс на домашней системе. Наибольшей проблемой после перехода на systemd стал отвалившийся suspend-to-hibernate.

В wiki archlinux есть вариант для systemd. Пришлось немного доработать их вариант, чтобы он начал работать в debian jessie.

[Unit]
Description=Delayed hibernation trigger
Documentation=https://wiki.archlinux.org/index.php/Power_management
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
Environment="SLEEPLENGTH=+2hours"
ExecStart=-/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM'
ExecStop=-/bin/sh -c '\
  alarm=$(cat $WAKEALARM); \
  now=$(date +%%s); \
  if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
     echo "hibernate triggered"; \
     systemctl hibernate; \
  else \
     echo "normal wakeup"; \
  fi; \
  echo 0 > $WAKEALARM; \
'

[Install]
WantedBy=sleep.target

Этот сервис нужно сохранить в файле /etc/systemd/system/suspend-to-hibernate.service и добавить в suspend.target зависимость на suspend-to-hibernate.service. В противном случае suspend.target не будет дожидаться выполнения suspend-to-hibernate.service.

sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
echo Requires=suspend-to-hibernate.service | sudo tee -a /etc/systemd/system/suspend.target
sudo systemctl enable suspend-to-hibernate.service
sudo systemctl daemon-reload

В будущем планирую интегрировать поддержку systemd в мой laptop-utils и собрать для него пакет.