Настройки энергосбережения на моем ThinkPad X270

Опубликовано 07.11.2024 в OpenBSD

Не так давно я писал о порадовавшем меня открытии: пробуждение ноута из hibernate в последних версиях OpenBSD стало радовать своей скоростью, если раньше из-за какого-то трудноуловимого бага распаковка сохраненного на диске образа занимала по 7-10 минут, то теперь система восстает из hibernate с радующей душу стремительностью - около минуты.

По этому поводу, наконец-то дошли руки допилить настройки системы до более комфортного использования. Собственно, меня беспокоила пара мелочей:

Дефолтной реакцией на закрытие крышки ноутбука в OpenBSD является погружение в suspend, а на последующее открытие крышки, соответственно, пробуждение из suspend - работает оно безупречно, но в режиме suspend ноутбук все-таки кушает аккумулятор, пусть и понемногу. Раза два у меня приключалось, что ноут выжирал аккумулятор до нуля. Такого, разумеется, не случится, если погружать ноут в hibernate - я для этого прикрутил в polybar специальную кнопку выключения, вписав в ~/.config/polybar/config.ini следующее:

[module/powermenu]
type = custom/menu
label-open = 
label-separator = |
label-close = 
menu-0-0 = zzz
menu-0-0-exec = zzz
menu-0-1 = ZZZ
menu-0-1-exec = ZZZ
menu-0-2 = halt
menu-0-2-exec = doas /sbin/halt -p
menu-0-3 = reboot
menu-0-3-exec = doas /sbin/reboot

Ну и в /etc/doas.conf, соответственно:

permit nopass alexd as root cmd /sbin/reboot
permit nopass alexd as root cmd /sbin/halt args -p

Однако, более удобным мне представляется иметь дефолтной реакцией на закрытие крышки ноутбука погружение в hibernate, а не suspend: просто закрыл крышку и тут же сунул ноут в рюкзак, не думая о том, сколько он там пролежит и хватит ли заряда аккумулятора до следующего включения. В OpenBSD это делается путем добавления в /etc/sysctl.conf строчки:

# 0 - ничего не делать, 1 - suspend, 2 - hibernate
machdep.lidaction=2

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

# 0 - ничего не делать, 1 - power off, 2 - suspend
machdep.pwraction=2

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

Еще нюанс: у меня при подключении и отключении кабеля питания (а ThinkPad X270 умеет заряжаться как от родной "квадратной" зарядки, так и от usb-c, что весьма удобно), яркость подсветки монитора автоматически переключается на максимум. При подключении это удобно, но почему-то ровно такая же реакция и на отключение питания, что мне не особо нравится - каждый раз приходилось снижать. Сделал что-то более двух раз - заскриптуй! Заскриптуй и забудь где (шутка, чтобы не забыть я и пишу это в бложег). Итак, я создал скрипт /etc/apm/powerdown со следующим содержимым (не забываем сделать chmod +x!):

#!/bin/sh

logger "/etc/apm/powerdown: AC adapter unplugged, set backlight to 50%"
/sbin/wsconsctl display.brightness=50

Теперь при отключении питания яркость подсветки, соответственно, снижается до 50%.

Еще нюанс (настроено давно, просто зафиксирую, чтобы не забыть): при критичном разряде аккумулятора (я выбрал уровень 5%) ноутбук хочется автоматически погружать в тот же hibernate, для чего делаем # rcctl set apmd flags -L -Z 5.

Ну и сохраню на память содержимое еще некоторых скриптов:

При погружении в suspend прибьем композитный менеджер picom (где-то читал, что так лучше сделать) и заблокируем экран локером, скрипт /etc/apm/suspend:

#!/bin/sh

/usr/bin/pkill picom
/usr/bin/pkill -USR1 xidle

Аналогично я сделал и для погружения в hibernate, скрипт /etc/apm/hibernate.

А при пробуждении из suspend/hibernate, соответственно, запустим picom обратно, скрипт /etc/apm/resume:

#!/bin/sh

/usr/local/bin/picom --backend glx --vsync --xrender-sync-fence

Вот теперь мой ноутбук работает, на мой вкус, идеально (ну, в части управления энергопотреблением).

Единственное, чего мне еще не хватает в OpenBSD - это режима hybrid sleep (когда система сначала сбрасывает на диск образ, как для hibernate, а потом уходит в suspend - в результате, если при последующем включении аккумулятор живой, система быстро восстанет из suspend, а если аккумулятор уйдет в ноль - система потом проснется из hibernate).

Надеюсь, когда-нибудь и это допилят.