В этой статье я хочу рассказать, как автоматизировать процесс перевода вашего ноутбука/нетбука из режима питания от сети в автономный режим и обратно, не используя каждый раз что-нибудь на подобии PowerTop и других утилит. Всё, что вам понадобится, это желание продлить время работы от батареи, консоль, текстовый редактор (я рассматриваю в качестве примера Gedit для среды Gnome и Kate для KDE, но вы можете использовать свой). И так, начнём!

Для начала, прошу прочитать эти 2 статьи:

Данные и решения, приведённые в этих инструкциях будут использоваться в данной статье.

Внимание! Я не являюсь автором этих статей. Я лишь пытаюсь предложить один из методов, как можно воспользоваться этими данными.

1 метод (стандартный): Power.sh

В Ubuntu есть скрипт, который выполняется каждый раз, когда вы переключаете режимы питания (подключаете/отключаете сеть). Найти его можно в /etc/acpi/ Мы можем вписать в него инструкцию, которая будет применяться в момент смены режима.

В языке Bash имеется функция «on_ac_power», которая возвращает «true», если сеть подключена и «false» в обратном случае. Воспользуемся этим:

Конструкция №1.
if on_ac_power; then 
# выполняется, если компьютер питается от сети
## НАЧАЛО
 
## КОНЕЦ
else
# выполняется, если компьютер в автономном режиме
## НАЧАЛО
 
## КОНЕЦ
fi 

Надеюсь, вы прочитали ссылки, приведённые выше? Они нам сейчас понадобятся! Теперь откроем наш скрипт power.sh и внесём изменения:

Для Gnome:
sudo gedit /etc/acpi/power.sh 

Для KDE:

sudo kate /etc/acpi/power.sh 

Другие DE:

sudo nano /etc/acpi/power.sh 

Вносим данную конструкцию сразу после строки «#!/bin/sh». Теперь, вносим в наш код команды из статьи «Оптимизация энергопотребления». В качестве примера привожу свой файл /etc/acpi/power.sh:

Содержимое файла /etc/acpi/power.sh
#!/bin/sh
#######################################################
if on_ac_power; then
# для питания от сетевого адаптера
# модифицируйте для своей конфигурации
#################################################
echo 1 > /proc/sys/vm/laptop_mode
echo max_performance > /sys/class/scsi_host/host0/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host1/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host2/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host3/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host4/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host5/link_power_management_policy
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
echo 0 > /sys/module/snd_hda_intel/parameters/power_save 
echo 5 > /proc/sys/vm/dirty_background_ratio 
echo 6000 > /proc/sys/vm/dirty_writeback_centisecs
echo default > /sys/module/pcie_aspm/parameters/policy
#################################################
else
#################################################
# параметры для автономной работы
# модифицируйте для своей конфигурации
#################################################
echo 5 > /proc/sys/vm/laptop_mode
echo min_power > /sys/class/scsi_host/host0/link_power_management_policy
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy
echo min_power > /sys/class/scsi_host/host2/link_power_management_policy
echo min_power > /sys/class/scsi_host/host3/link_power_management_policy
echo min_power > /sys/class/scsi_host/host4/link_power_management_policy
echo min_power > /sys/class/scsi_host/host5/link_power_management_policy
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo powersave > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
echo 10 > /sys/module/snd_hda_intel/parameters/power_save 
echo 1 > /proc/sys/vm/dirty_background_ratio 
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs 
echo powersave > /sys/module/pcie_aspm/parameters/policy
#################################################
fi
#######################################################
 
test -f /usr/share/acpi-support/key-constants || exit 0
. /usr/share/acpi-support/policy-funcs
if [ -z "$*" ] && ( [ `CheckPolicy` = 0 ] || CheckUPowerPolicy ); then
    exit;
fi
pm-powersave $*
Внимание! Данный пример оптимизирован под ноутбук Asus K50ID. Пожалуйста, оптимизируйте его под свою конфигурацию или напишите свой.

Сохраняем изменения в файле. Всё! Теперь вы спокойной можете ожидать от своего ноутбука/нетбука прироста времени работы. В моём случае он составляет окло 20-30 минут.

Плюсы данного метода:

  1. Скрипт системный. Никакого лишнего мусора.

Минусы:

  1. Данный скрипт может не выполняться на некоторых машинах.
  2. Не выполняется при выходе из спящего и ждущего режимов.

2 метод: Switch Mode Power Supply (SMPS)

Этот метод разработан мной. Он является не «стандартным», но имеет некоторые преимущества. В этом методе мы будем использовать демон, который будет загружаться вместе с компьютером, висеть в памяти и проверять через каждые N секунд состояние адаптера. Собственно, сам демон:

Демон «Switch Mode Power Supply»
#!/bin/sh 
# Автор Кровавый 
# http://forum.ubuntu.ru/index.php?action=profile;u=58102
# скрипт распространяется по лицензии GPLver.2
# выходим из текущей консоли 
exec >   /dev/null 
exec 2> /dev/null 
exec <   /dev/null 
 sleep 10;
##################################### 
# запускаем конфигуратор сразу, дабы выставить нужные параметры 
sh /etc/smps/smps_config.sh; 
 
##################################### 
# получаем статус адаптера сейчас 
if on_ac_power; then StateOld="1"; 
else StateOld="0"; 
fi 
 
##################################### 
# запускаем вечный цикл, проверяя, что сейчас и что в файле 
( 
# если необходимо, чтобы на просто SIGTERM не реагировал 
# trap "" TERM 
 
while /bin/true; do 
 
# пауза, да бы не загружать процессор 
sleep 10; 
 
# статус адаптера на данный момент 
if on_ac_power; then StateNow="1"; else  StateNow="0"; fi 
 
# сравниваем с новым 
if [ "$StateNow" != "$StateOld" ]; 
# переписываем состояние и меняем состояние в конфигурационных файлах 
then 
StateOld=$StateNow; 
sh /etc/smps/smps_config.sh; 
fi
done 
) & 
# форкнулись и на этом всё... работа демона завершена

Сам демон будет лежать в каталоге /usr/bin/, а настройки, которые он производит мы положим в /etc/smps/. Во-первых, так мы сможем исключить дублирование в коде демона, во-вторых, облегчим настройку.

Поместим нашего демона в /usr/bin/:

sudo mkdir /usr/bin/smps
Для Gnome:
sudo gedit /usr/bin/smps/smps.sh

Для KDE:

sudo kate /usr/bin/smps/smps.sh

Другие DE:

sudo nano /usr/bin/smps/smps.sh

Вписываем код в открывшееся окно и сохраняем изменения в файле. Теперь сделаем файл исполняемым:

sudo chmod +x /usr/bin/smps/smps.sh

Теперь создадим скрипт, который будет меня значения:

sudo mkdir /etc/smps
Для Gnome:
sudo gedit /etc/smps/smps_config.sh

Для KDE:

sudo kate /etc/smps/smps_config.sh

Другие DE:

sudo nano /etc/smps/smps_config.sh

В открывшееся окно вписываем в качестве первой строки «#!/bin/sh». А дальше конструкцию №1, добавив в неё свой код. У вас должно получиться что-то вроде этого:

Содержимое файла /etc/smps/smps_config.sh
#!/bin/sh
#######################################################
if on_ac_power; then
# для питания от сетевого адаптера
# модифицируйте для своей конфигурации
#################################################
echo 1 > /proc/sys/vm/laptop_mode
echo max_performance > /sys/class/scsi_host/host0/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host1/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host2/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host3/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host4/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host5/link_power_management_policy
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
echo 0 > /sys/module/snd_hda_intel/parameters/power_save 
echo 5 > /proc/sys/vm/dirty_background_ratio 
echo 6000 > /proc/sys/vm/dirty_writeback_centisecs
echo default > /sys/module/pcie_aspm/parameters/policy
#################################################
else
#################################################
# параметры для автономной работы
# модифицируйте для своей конфигурации
#################################################
echo 5 > /proc/sys/vm/laptop_mode
echo min_power > /sys/class/scsi_host/host0/link_power_management_policy
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy
echo min_power > /sys/class/scsi_host/host2/link_power_management_policy
echo min_power > /sys/class/scsi_host/host3/link_power_management_policy
echo min_power > /sys/class/scsi_host/host4/link_power_management_policy
echo min_power > /sys/class/scsi_host/host5/link_power_management_policy
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo powersave > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
echo 10 > /sys/module/snd_hda_intel/parameters/power_save 
echo 1 > /proc/sys/vm/dirty_background_ratio 
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs 
echo powersave > /sys/module/pcie_aspm/parameters/policy
#################################################
fi
Внимание! Данный пример оптимизирован под ноутбук Asus K50ID. Пожалуйста, оптимизируйте его под свою конфигурацию или напишите свой.

Сохраняем изменения и даём права на исполнение:

sudo chmod -x /etc/smps/smps_config.sh

Теперь настроим запуск нашего демона при старте системы:

Для Gnome:
sudo gedit /etc/rc.local

Для KDE:

sudo kate /etc/rc.local

Другие DE:

sudo nano /etc/rc.local

Теперь добавьте перед строкой «exit 0» добавьте следующий код:

sh /usr/bin/smps/smps.sh

Сохраняем изменения в файле и перезагружаем компьютер. При следующей перезагрузке демон «Switch Mode Power Supply» будет запущен автоматически и будет каждые 10 секунд проверять состояние адаптера и, в случае, если оно изменилось с момента последней проверки, изменит параметры системы на установленные вами.

Плюсы данного метода:

  1. Постоянно проверяет состояние, гарантирует изменение режима в 99.9% случаях, в том числе, после выхода из спящего или ждущего режимов.
  2. Выполняется на всех операционных системах, где есть поддержка ACPI и Bash.

Минусы:

  1. Скрипт не системный, а значит займёт лишние ~70 килобайт вашей ОЗУ.

Заключение

И так, мы узнали, как можно автоматизировать процесс переключения между режимами электропитания, не прибегая к вводу команд в терминал при каждом отключении кабеля питания или запуску PowerTop. В моём случае, данные решения помогли облегчить мне жизнь и продлить жизнь моего ноутбука в автономном режиме с 1 часа 40 минут до 2 часов и нескольких минут в режиме сёрфинга по интернету и до 2 часов 30 минут в режиме просмотра HD видео в полно экранном режиме.

Для составления этой статьи использовались следующие ресурсы: