В начало → Управление питанием компьютера → Подготовка |
Перед детальным обсуждением настройки Управления Питанием для отдельных устройств, стоит убедиться, что следующие требования выполнены. После проверки установок BIOS, стоит включить некоторые опции в ядре (если коротко, то это – ACPI, режимы спячки и регулирование частоты ЦП). Так как сохранение энергии в большинстве случаев влечёт потери производительности, то его стоит применять только при работе от батарей. Для этого разграничения очень полезен отдельный уровень запуска (runlevel) battery.
Для начала стоит взглянуть на настройки управления питанием в BIOS. Наилучшее решение – совмещать возможности BIOS и операционной системы. Но чтобы быть уверенными, что BIOS не будет конфликтовать с операционной системой, лучше пока отключить бОльшую часть его настроек по управлению питанием. Не забудьте перепроверить настройки BIOS после конфигурации чего-либо ещё.
Убедитесь, что acpi USE-флаг установлен в вашем /etc/make.conf
. Так же в вашей системе могут быть уместны флаги apm
, lm_sensors
, nforce2
, nvidia
, pmu
. Подробно об этих флагах смотрите в /usr/portage/profiles/use*.desc
. Если вы забыли выставить один из этих флагов, вы можете перекомпилировать необходимые пакеты командой emerge --deep --update --newuse world, подробности в man emerge.
Работа над поддержкой ACPI (Advanced Configuration and Power Interface) в ядре всё ещё не закончена. Используя последнее ядро, вы получаете самую свежую её версию.
В портэжах (portage) содержится несколько версий ядра. Я бы рекомендовал использовать gentoo-sources или suspend2-sources. Последнее содержит патчи для программной остановки 2 (Software Suspend 2), смотрите главу о режимах спячки для более подробной информации. Во время конфигурации ядра включите хотя бы эти опции:
Листинг 1. Минимальные настройки ядра для Управления Питанием (приведено для ядра 2.6.23)
Power Management Options ---> [*] Power Management Support [ ] Software Suspend ACPI( Advanced Configuration and Power Interface ) Support ---> --- ACPI Support (Advanced Configuration and Power Interface) Support [*] Deprecated /proc/acpi files [*] Deprecated /proc/acpi/event support [ ] Sleep States [ ] /proc/acpi/sleep (deprecated) [*] AC Adapter [*] Battery <M> Button <M> Video <M> Fan < > Dock <M> Processor <M> Thermal Zone < > ASUS/Medion Laptop Extras < > IBM ThinkPad Laptop Extras < > Toshiba Laptop Extras (0) Disable ACPI for systems before Jan 1st this year [ ] Debug Statements [*] Power Management Timer Support < > ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL) < > Smart Battery System (EXPERIMENTAL) CPU Frequency Scaling ---> [*] CPU Frequency scaling [ ] Enable CPUfreq debugging < > CPU frequency translation statistics [ ] CPU frequency translation statistics details Default CPUFreq governor (userspace) <*> 'performance' governor <*> 'powersave' governor <*> 'ondemand' cpufreq policy governor <*> 'conservative' cpufreq governor <*> CPU frequency table helpers <M> ACPI Processor P-States driver <*> CPUFreq driver for your processor
Примечание переводчика: поддержка '/proc/acpi' и '/proc/acpi/event' в ядре 2.6.23 была помечена не рекомендуемой (deprecated), в связи с изменением acpi-интерфейса (подробнее см. на kernel.org), но она необходима для acpid, который пока "не приспособился" к /sys интерфейсу.
Решите для себя, хотите ли вы включать программную остановку и состояния спячки (см. ниже). Если у вас ноутбук ASUS, Medion, IBM Thinkpad или Toshiba, но активируйте соответствующий пункт.
Ядро должно знать, как включить изменение частоты процессора. Так как разные типы ЦП имеют разные интерфейсы, стоит выбрать правильный драйвер для процессора. Будьте осторожны – включение, например, Intel Pentium 4 clock modulation на Pentium M приведёт странному поведению системы. Обратитесь к документации по ядру, если вы не знаете, что выбрать.
Скомпилируйте полученное поддерживающее ACPI ядро; убедитесь, что необходимые модули подгружаются при старте системы. Далее запустите emerge sys-power/acpid, чтобы получить acpi-демона. Он сообщает вам о событиях (event) таких, как переключение с питания от сети на батарею или закрытие крышки ноутбука. Убедившись, что модули запущены (если вы не скомпилировали их как часть ядра), запустите acpid командой /etc/init.d/acpid start. Выполните rc-update add acpid default, чтобы демон автоматически запускался при старте системы. Вы скоро узнаете, как использовать его.
Листинг 2. Установка acpid
#
emerge sys-power/acpid
#
/etc/init.d/acpid start
#
rc-update add acpid default
Политики (policy) по умолчанию будут включать Управление Питанием, только когда это необходимо, т.е. при работе от батареи. Чтобы сделать переключение между питанием от сети и питанием от батарей более удобным, создайте уровень запуска battery, который будет содержать все скрипты запускающие и останавливающие управление питанием.
Примечание: Вы можете пропустить эту секцию, если вы не хотите создавать ещё один уровень запуска. В последующих секции предполагается, что уровень запуска battery существует.
Вот и всё! Новоиспечённый уровень запуска battery содержит всё, что есть в defaults, но автоматического переключения между ними нет. Пора изменить это.
Типичные ACPI-события – это закрытие крышки, изменение источника питания и нажатие клавиши засыпания. Для нас важно события изменения источника питания – именно из-за него будут переключаться уровни запуска. Маленький скрипт позаботится об этом.
Для начала, вам нужен скрипт, который меняет уровень запуска на defaults или battery в зависимости от источника энергии. Скрипт использует команду on_ac_power из sys-power/powermgmt-base – убедитесь, что он установлен на вашей системе.
Теперь вы может определить источник питания, запустив on_ac_power && echo AC available || echo Running on batteries в консоли. Скрипт ниже отвечает за переключение уровней. Сохраните его как /etc/acpi/actions/pmg_switch_runlevel.sh.
Листинг 5. /etc/acpi/actions/pmg_switch_runlevel.sh
#!/bin/bash # BEGIN configuration RUNLEVEL_AC="default" RUNLEVEL_BATTERY="battery" # END configuration if [ ! -d "/etc/runlevels/${RUNLEVEL_AC}" ] then logger "${0}: Runlevel ${RUNLEVEL_AC} does not exist. Aborting." exit 1 fi if [ ! -d "/etc/runlevels/${RUNLEVEL_BATTERY}" ] then logger "${0}: Runlevel ${RUNLEVEL_BATTERY} does not exist. Aborting." exit 1 fi if on_ac_power then if [[ "$(</var/lib/init.d/softlevel)" != "${RUNLEVEL_AC}" ]] then logger "Switching to ${RUNLEVEL_AC} runlevel" /sbin/rc ${RUNLEVEL_AC} fi elif [[ "$(</var/lib/init.d/softlevel)" != "${RUNLEVEL_BATTERY}" ]] then logger "Switching to ${RUNLEVEL_BATTERY} runlevel" /sbin/rc ${RUNLEVEL_BATTERY} fi
Не забудьте сделать скрипт исполняемым, запустив chmod +x /etc/acpi/actions/pmg_switch_runlevel.sh. Последнее, что осталось сделать, – это вызов скрипта всякий раз, когда изменяется источник питания. Это можно сделать, перехватывая ACPI-события посредством acpid. Главное – знать, какое событие генерируется при изменении источника питания. События называются ac_adapter и battery на большинстве ноутбуков, но могут быть другими на вашем.
Листинг 6. Определение ACPI-событий для изменение источника питания
#
tail -f /var/log/messages | grep "received event"
Запустите команду выше и отключите ноутбук от питания. Затем снова подключите его. Вы должны увидеть что-то такое:
Листинг 7. Определение ACPI-событий для изменения источника питания
[Tue Sep 20 17:39:06 2015] received event "ac_adapter AC 00000080 00000000" [Tue Sep 20 17:39:06 2015] received event "battery BAT0 00000080 00000001"
Интересующая часть – строки, заключенные в кавычки, после received event. Они должны совпадать с теми, что используются в файле ниже. Не беспокойтесь, если ваша система выдает много событий или всегда одни и те же. Пока хоть какое-нибудь событие генерируется, переключение уровней будет работать.
Листинг 8. /etc/acpi/events/pmg_ac_adapter
# Замените "ac_adapter" ниже на реальное событие вашем ноутбуке # Например, ac_adapter.* будет соответствовать ac_adapter AC 00000080 00000000 event=ac_adapter.* action=/etc/acpi/actions/pmg_switch_runlevel.sh %e
Листинг 9. /etc/acpi/events/pmg_battery
# Замените "battery" ниже на реальное событие вашем ноутбуке # Например, battery.* будет соотвествовать battery AC 00000080 00000001 event=battery.* action=/etc/acpi/actions/pmg_switch_runlevel.sh %e
Наконец, acpid должен быть перезапущен, чтобы изменения вступили в силу.
Вы можете проверить работоспособность скриптов, отсоединив кабель питания и вставив его вновь, – в syslog должны появляться сообщения "Switching to AC mode" или "Switching to battery mode". Обратитесь к устранению неполадок, если скрипт некорректно распознаёт источник питания.
Из-за природы механизма событий, ваш ноутбук будет загружаться в уровень запуска default не зависимо от источника питания.
Это просто замечательно, если мы подключены к сети, но если нет, то нам хотелось бы загружаться в уровень запуска battery.
Одно из решений – это добавить ещё один пункт в менеджер загрузки, с параметром softlevel=battery
, но не сложно просто забыть его выбрать. Лучший путь – поставить ACPI-событие в конец процесса загрузки и позволить скрипту
pmg_switch_runlevel.sh
решать, какое изменение уровня необходимо. Откройте /etc/conf.d/local.start
в вашем любимом редакторе и добавьте следующие строки:
Листинг 11. Изменение уровня запуска во время загрузки
# Эмулируем acpi событие, чтобы переключить уровень запуска, если работаем от батареи /etc/acpi/actions/pmg_switch_runlevel.sh "battery/battery"
Подготовив систему таким образом, вы можете активировать политики управления питанием для отдельных устройств.
В начало → Управление питанием компьютера → Подготовка |