Трудно приходится линуксоидам, не имеющим DE, а сидящим исключительно на WM — всё, что в полноценном Desktop Environment ( окружении рабочего стола или как это лучше обозначить на великом и могучем? ) поставляется и работает "из коробки" в WM нужно подбирать и настраивать. Вот и автором сего поста ранее были использованы элементы xfce для таких вещей как управление питанием, регулировка громкости звука и яркости экрана. Но вступило что-то в голову: ведь в моей системе всегда установлены acpi и laptop-mode-tools, так почему бы не обучить их выполнять их же непосредственные обязанности: делать всё то, для чего раньше нужны были xfce4-volumed и xfce4-power-manager?
Для обучения нам понадобятся пакеты laptop-mode-tools
, acpi
,
acpid
. Acpid должен быть запущен.
Уровень яркости экрана
Дописать в /etc/default/grub
строки:
GRUB_CMDLINE_LINUX_DEFAULT="acpi_backlight=vendor resume=/dev/sda5"
Лезем в acpi. Создайте файлы со следующим содержанием.
Для увеличения яркости:
# /etc/acpi/actions/bl_up.sh
#!/bin/sh
bl_device=/sys/class/backlight/intel_backlight/brightness
echo $(($(cat $bl_device)+200)) >$bl_device
Для уменьшения яркости:
# /etc/acpi/actions/bl_down.sh:
#!/bin/sh
bl_device=/sys/class/backlight/intel_backlight/brightness
echo $(($(cat $bl_device)-200)) >$bl_device
В bl_device
замените inel_backlight
на своё значение в
зависимости от используемой видеокарты. Также стоит выяснить
устраивающее вас значение, на основе которого будет увеличиваться или уменьшаться
яркость экрана. У автора это значение = 200.
Как найти подходящее значение? Посмотрите какая цифра стоит сейчас. Если вы ничего ещё не настраивали, она должна отражать максимально допустимое значение:
# cat /sys/class/backlight/intel_backlight/brightness
4882
Теперь поиграйте со значениями, чтобы выбрать нужный шаг:
# echo 1000 > /sys/class/backlight/intel_backlight/brightness
# echo 1010 > /sys/class/backlight/intel_backlight/brightness
# echo 1100 > /sys/class/backlight/intel_backlight/brightness
Посмотрите как будет изменяться яркость экрана при разных значениях, если при добавлении 10 единиц вы практически не чувствуете разницы, добавьте ещё 50-100 единиц. Какой шаг покажется оптимальным, тот и оставьте.
Теперь укажем acpi использовать наши скрипты:
# /etc/acpi/events/bl_up
#
event=video[ /]brightnessup
action=/etc/acpi/actions/bl_up.sh
# /etc/acpi/events/bl_down
#
event=video[ /]brightnessdown
action=/etc/acpi/actions/bl_down.sh
и сделаем эти скрипты исполняемыми:
# chmod +x /etc/acpi/actions/{bl_up.sh,bl_down.sh}
Чтобы автоматически подбирать яркость при работе от аккумулятора или же сети, установим laptop-mode-tools:
# pacman -S laptop-mode-tools
и немного изменим его настройки:
# /etc/laptop-mode/conf.d/lcd-brightness.conf
#
CONTROL_BRIGHTNESS=1
# Commands to execute to set the brightness on your LCD
#
#BATT_BRIGHTNESS_COMMAND="echo [value]"
BATT_BRIGHTNESS_COMMAND="echo 700"
LM_AC_BRIGHTNESS_COMMAND="echo 2000"
NOLM_AC_BRIGHTNESS_COMMAND="echo 3000"
BRIGHTNESS_OUTPUT="/sys/class/backlight/intel_backlight/brightness"
Разумеется, значения 700/2000/3000
и путь /sys/class/backlight/intel_backlight/brightness
должны быть заменены на ваши значения.
Автогибернация при критическом уровне заряда батареи
Достаточно часто бывает такое, что при работе от батареи забываешь посматривать на уровень её заряда, в результате чего получаешь отключение машины при полной разрядке батареи. Внезапное - как хлопок - выключение и все несохранённые данные потеряны. Обидно, не правда ли? Поэтому неплохо было бы позаботиться о своевременных мерах предосторожности.
Для этих целей также будем использовать функционал laptop-mode.
# /etc/laptop-mode/conf.d/auto-hibernate.conf:
#
ENABLE_AUTO_HIBERNATION=1
#
# The hibernation command that is to be executed when auto-hibernation
# is triggered.
#
HIBERNATE_COMMAND=/usr/share/laptop-mode-tools/module-helpers/pm-hibernate
#
# Auto-hibernation battery level threshold, in percentage of the battery's
# total capacity.
#
AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT=4
#
# Enable this to auto-hibernate if the battery reports that its level is
# "critical".
#
AUTO_HIBERNATION_ON_CRITICAL_BATTERY_LEVEL=1
Если вас не устраивают значения по умолчанию, вы также можете изменить их. В случае, если до этого момента у вас не был указан раздел swap, укажите его в grub2, эти настройки уже были даны выше:
# /etc/default/grub
#
GRUB_CMDLINE_LINUX_DEFAULT="acpi_backlight=vendor resume=/dev/sda5"
где /dev/sda5
- ваш swap-раздел
Кроме того, в случае с archlinux следует добавить хук suspend в /etc/mkinitcpio.conf
:
HOOKS="base udev autodetect modconf block filesystems usbinput fsck resume"
и пересобрать initrd:
# mkinitcpio -p linux
Регулировка звука
Для этого снова обратимся к скриптам acpi, как и в случае с управлением яркостью дисплея.
# /etc/acpi/actions/volume_up.sh
#
#!/bin/bash
/usr/bin/amixer set Master 5%+
# /etc/acpi/actions/volume_down.sh
#
#!/bin/bash
/usr/bin/amixer set Master 5%-
# /etc/acpi/events/volume_up
#
event=button[ /]volumeup
action=/etc/acpi/actions/volume_up.sh
# /etc/acpi/events/volume_down
#
event=button[ /]volumedown
action=/etc/acpi/actions/volume_down.sh
Делаем скрипты в actions исполняемыми:
# chmod +x /etc/acpi/actions/{volume_up.sh,volume_down.sh}
Для корректного распознавания мультимедийных клавиш, лучше использовать утилиту xmodmap
.
$ xmodmap -pke > ~/.xmodmap
$ vim .xinitrc:
xmodmap ~/.xmodmap
Acpi и события клавиш
Честно говоря, меня устраивает поведение по-умолчанию, поэтому с пристрастием этот вопрос не рассматривался. При закрытии крышки ноутбука машина переходит в режим гибернации. При нажатии кнопки питания - корректно отключает систему. Оно и хорошо.
Похоже, управление этими событиями тоже берёт на себя laptop-mode-tools
( только пока неясно, в каком модуле/скрипте лежат эти настройки),
поскольку в /etc/acpi/handler.sh
каких-либо действий на события не назначено.
Но таки рассмотрим как настраивать то или иное событие.
Ответственен за эти шаманские действа вышеупомянутый handler.sh
(или default.sh
в зависимости от используемого дистрибутива), где и прописываются
настройки. В случае, если вам хочется использовать не команду, а скрипт, расположите
его в отдельном файле, подобно тому, как выше настраивалось управление яркостью
дисплея и уровнем громкости .
Пример из дефолта:
button/lid)
case "$3" in
close)
logger 'LID closed'
;;
open)
logger 'LID opened'
;;
*)
logger "ACPI action undefined: $3"
;;
esac
;;
button/lid
указывает на управление закрытием/открытием крышки ноутбука,
пока здесь нет ничего интересного.
Пример с воспроизведением звукового файла при закрытии/открытии крышки ноутбука:
button/lid)
case "$3" in
close)
logger 'LID closed'
aplay /home/redvi/.scripts/message.wav
;;
open)
logger 'LID opened'
aplay /home/redvi/.scripts/message.wav
;;
*)
logger "ACPI action undefined: $3"
;;
esac
;;
То есть для настройки события нужно добавить его команду в соответствующее
поле ( здесь после logger 'LID closed'
). Так, действие при открытии крышки
нужно будет вписать после logger 'LID opened'
.
button/power
— события, связанные с кнопкой управления питаниемlogger 'PowerButton pressed'
— когда клавиша нажатаbutton/sleep
— сон, если подобная кнопка/клавиша имеетсяac_adapter
— события, связанные с подключением/отключением адаптера питанияlogger 'AC unpluged'
— когда адаптер отключенlogger 'AC pluged'
— когда адаптер подключенbattery
— батарея ноутбукаbutton/lid
— крышка ноутбука
Для перевода в ждущий/спящий режимы можно использовать скрипты
laptop-mode-tools
из /usr/share/laptop-mode-tools/module-helpers
: pm-hibernate
и pm-suspend
.
Для выключения питания при закрытии крышки достаточно добавить
в /etc/acpi/actions/lm_lid.sh
строку:
[ "$3" = "close" ] && poweroff
Помимо всего вышеописанного мы можем контролировать парковку головок жёсткого диска.
Дабы отключить парковку совсем пропишите в /etc/laptop-mode/laptop-mode.conf
:
BATT_HD_POWERMGMT=254
LM_AC_HD_POWERMGMT=254
NOLM_AC_HD_POWERMGMT=254
Пожалуй, на этом стоит остановиться и дать читателю возможность самостоятельно поэкспериментировать с настройками энергосбережения и событий acpi.