При стандартных настройках Linux ноутбук способен проработать от аккумуляторной батареи всего несколько часов. И дело тут даже не в оптимальности настроек, а в желании разработчиков дистрибутива сохранить максимум функциональности ОС, хотя такие вещи, как встроенная веб-камера или Bluetooth, нужны далеко не всегда и далеко не всем. В этой статье я расскажу, как урезать функциональность машины до такой степени, чтобы продлить время ее работы настолько, насколько это возможно.

 

Введение

Современные ноутбуки оснащены большим количеством различных компонентов, включая дополнительную высокопроизводительную видеокарту, звуковой адаптер, веб-камеру, Bluetooth и Wi-Fi-адаптеры, множество USB-портов и других составляющих. Все они, даже при использовании так называемого энергосберегающего режима, переводящего процессор, жесткий диск и дисплей в режим минимального потребления энергии, продолжают исправно работать, а значит, так или иначе сажают батарею.

Задача любого, кто хочет получить по-настоящему «долгоиграющий» ноутбук, — отключить как можно больше компонентов системы, сохранив максимальное количество энергии, а также, по возможности, оптимизировать режим энергосбережения, выставив более агрессивные настройки сохранения энергии для процессора, жесткого диска и других жизненно важных компонентов машины. Всем этим мы сейчас и займемся.

 

Сердце машины

Первое, что мы должны сделать, — это, так сказать, отделить зерна от плевел, то есть разобраться, какие компоненты мы можем отключить вовсе, для каких сможем применить энергосберегающие режимы, а какие должны оставить работать в полную силу. Для этого разделим все составляющие машины на особо важные и второстепенные.

К особо важным относятся, как нетрудно догадаться, процессор, жесткий диск, видеоадаптер, дисплей и клавиатура. Без них использовать ноутбук просто бессмысленно, поэтому отключить их не получится, а вот перевести в менее агрессивный в плане энергии режим вполне возможно. Первое, с чего мы начнем, — это процессор. Любой хоть сколько-нибудь современный проц имеет поддержку энергосберегающего режима, для управления которым можно использовать файловую систему sysfs. Например, следующая команда выведет на экран список поддерживаемых регуляторов производительности:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governor
ondemand performance

Как видно, в моей системе их по умолчанию два, ondemand — стандартный способ регулировки производительности, при котором частота процессора будет резко подпрыгивать в моменты повышенной нагрузки и медленно опускаться при снижении нагрузки. С точки зрения отзывчивости системы и комфорта пользователя это лучший выбор в любой ситуации, поэтому по умолчанию при работе от батарей используется именно эта политика. Однако помимо него есть еще регулятор powersave, распространяемый в составе модуля cpufreq_powersave и постоянно держащий процессор на самой низкой частоте. На общей производительности системы он сказывается не так уж и сильно, зато батарею позволяет сэкономить существенно. Чтобы его активировать, достаточно выполнить две команды:

# modprobe cpufreq_powersave
# for i in /sys/devices/system/cpu/*/cpufreq/scaling_governor; \
do echo powersave > $i; done

Здесь мы использовали цикл, чтобы изменить регулятор сразу на всех ядрах процессора. Теперь попробуем перевести жесткий диск в режим пониженного потребления энергии. Делается это в первую очередь с помощью включения функции энергосбережения SATA-устройств, уменьшения времени активности диска и увеличения тайм-аута на сброс «грязных» буферов на диск. Первое действие можно выполнить с помощью все той же sysfs. Достаточно просто записать значение min_power в управляющий файл всех SATA-портов. Обычно их четыре или даже шесть, поэтому снова пишем цикл:

# for i in /sys/class/scsi_host/*/link_power_management_policy; \
do echo min_power > $i; done

Снизить время активности диска можно, включив так называемый режим ноутбука (Laptop Mode):

# echo 5 > /proc/sys/vm/laptop_mode

Режим ноутбука перенастраивает подсистему управления памятью и файловыми системами таким образом, чтобы отсрочить сброс данных или чтение с диска на как можно больший период. В частности, в результате его включения задержка сброса измененных страниц памяти на диск будет увеличена с 30 секунд до 10 минут, а механизм предварительного чтения с диска будет захватывать больше данных за раз. Также будет применено несколько других твиков. Чтобы еще больше разгрузить диск, добавим несколько других настроек:

# echo 90 > /proc/sys/vm/dirty_ratio
# echo 1 > /proc/sys/vm/dirty_background_ratio
# echo 60000 > /proc/sys/vm/dirty_writeback_centisecs

Первая команда здесь устанавливает максимальный размер памяти для хранения «грязных» данных процессов, прежде чем процесс будет вынужден сбросить их на диск. Вторая — минимальное количество памяти для хранения «грязных» данных. Значения обоих параметров указываются в процентах и задают своего рода окно для хранения «грязных» данных. Соответственно, чем шире будет это окно, тем реже ОС станет будить диск для записи. Третья команда устанавливает задержку между проверками на наличие «грязных» данных, равную 600 секундам (60 000 сантисекунд).

Еще один очень важный момент — это отключение принудительной записи журнальных файлов на диск. По умолчанию syslog делает sync при каждой записи в журнал, чтобы не потерять данные в случае сбоя системы, но это поведение можно отключить, если указать знак минуса перед именем журнального файла в /etc/syslog.conf. Например:

auth.*;authpriv.* -/var/log/auth.log

Теперь видеоадаптер. С ним особых хитростей нет, энергосбережение работает само по себе на уровне железа. Но если ноутбук оснащен двумя адаптерами одновременно: низкопроизводительным Intel, встроенным в материнку, и дискретным полноценным адаптером, — начинаются проблемы. Linux поддерживает такие конфигурации, начиная с ядра версии 2.6.34, однако многие дистрибутивы просто не используют возможность обесточить производительную видеокарту при отключении питания от ноутбука. Тем не менее решить эту проблему можно с помощью одной простой команды:

# echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

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

# echo powersave > /sys/module/pcie_aspm/parameters/policy

Проблема с яркостью дисплея решается еще проще. Можно снизить яркость до нужного уровня либо с помощью клавиш управления ноутбука (они обычно исправно работают), либо путем записи в один из файлов sysfs. Для этого сначала выясняем максимальную яркость дисплея:

$ cat /sys/class/backlight/*/max_brightness
15

А затем записываем в файл brightness того же каталога значение между 0 и полученным максимумом. Например:

# echo 4 > /sys/class/backlight/*/brightness

На этом разборки с жизненно важными компонентами машины можно считать завершенными.

 

Отсекаем лишнее

Кроме основных компонентов системы, ноутбук обычно оснащен адаптером Ethernet, модулями Wi-Fi и Bluetooth, несколькими USB-портами, CD-приводом, веб-камерой и, конечно же, звуковой картой. Все это можно по возможности либо отключить вообще, либо настроить на агрессивное сохранение энергии. Первые на очереди Wi-Fi, Ethernet и Bluetooth-адаптеры. Начнем с Wi-Fi. Его можно либо вообще выключить, например, если ты собираешься в дорогу, где по пути нет беспроводной связи, либо перевести в режим сбережения энергии, при котором адаптер будет на время засыпать, просыпаясь для отправки и получения накопившихся пакетов. Первая операция осуществляется с помощью такой команды:

# for i in `find /sys -name rf_kill` ;\
do echo 1 > $i ; done

Включаем энергосберегающий режим Wi-Fi-адаптера
Включаем энергосберегающий режим Wi-Fi-адаптера

Вторая — такой:

# iwconfig eth0 power on

Имей в виду, что режим энергосбережения требует поддержки со стороны точки доступа, она должна уметь накапливать пришедшие пакеты и удерживать их до очередного пробуждения адаптера. Так что если предполагается работа в сети допотопных беспроводных роутеров, лучше его даже не активировать. С Ethernet никаких проблем быть не должно, при отсутствии несущей адаптер находится в состоянии простоя, фактически не потребляя энергии, а вот Bluetooth будет расходовать ресурсы батареи, постоянно ожидая появления в сети нового устройства. Отключить его можно так:

# hciconfig hci0 down
# rmmod hci_usb

Также мы можем отключить питание на USB-портах. Совсем отключать, разумеется, бессмысленно, поэтому просто активируем режим энергосбережения, который будет обесточивать порты в случае, если в них ничего не воткнуто:

# for i in /sys/bus/usb/devices/*/power/autosuspend; \
do echo 1 > $i; done
# for i in /sys/bus/usb/devices/*/power/level; \
do echo auto > $i; done

Первая команда запускает автоотключение портов, вторая задействует автоматическую регулировку подачи энергии. Что касается CD-ROM, то сам по себе он энергию не потребляет, по крайней мере пока в нем нет диска, а вот на то, чтобы определить, есть ли диск, уходят процессорные ресурсы, а значит, и часть батареи. К счастью, эту функцию можно отключить с помощью udisks (замена устаревшему HAL для дисковых накопителей):

# udisks --inhibit-polling /dev/sr0

Правда, после этого диски придется монтировать вручную. Камера в дороге не особенно нужна, поэтому ее также можно деактивировать (экономия получится совсем небольшой, но мы же хотим выжать из батареи действительно все):

# modprobe -r uvcvideo

Звук также можно отключить, но это не имеет смысла, так как современные HD-кодеки Intel (установлены почти везде) умеют самоотключаться во время простоя, эффективно экономя энергию. По умолчанию этот режим также почему-то не активирован (возможно, из-за треска звука при переключении между режимами), но его можно легко активировать с помощью sysfs:

# echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller
# echo 1 > /sys/module/snd_hda_intel/parameters/power_save

Первая команда включает управление энергосбережением, вторая — активирует его.

 

Автоматическая активация опций энергосбережения

Все эти команды не обязательно вводить вручную, так как инструменты работы с ACPI в Linux позволяют определить список действий, которые будут выполнены во время отключения ноутбука от розетки или повторного подключения к электросети. Действия в виде обычных Linux-команд прописываются в файл /etc/acpi/handler.sh. В разных дистрибутивах его содержимое может сильно отличаться, поэтому вместо рассказа о том, как его редактировать, я просто приведу универсальную версию файла, которая подойдет почти к любому дистрибутиву.

Редактируем /etc/acpi/handler.sh
Редактируем /etc/acpi/handler.sh

Итак, файл handler.sh представляет собой обычный скрипт, который автоматически запускается ядром Linux в моменты, когда состояние питания ноутбука/ПК изменяется. Это могут быть такие случаи, как нажатие кнопки питания, отключение кабеля питания, закрытие крышки и даже нажатие кнопок управления громкостью. Чтобы скрипт понимал, в каком из этих случаев его вызывают, ему передается параметр, описывающий событие, например button/power, button/sleep, ac_adapter и так далее. Задача скрипта: выполнить определенный набор команд в каждом из приведенных случаев, либо просто пропустить событие (например, нет особого смысла обрабатывать нажатие клавиши питания, так как ядро и стартовые скрипты выполнят всю необходимую работу). Моя версия скрипта:

# vi /etc/acpi/handler.sh

#!/bin/sh

# Определяем тип события
case "$1" in
# Нажата клавиша уменьшения громкости
button/volumedown)
/usr/bin/amixer set PCM 5%-
;;
# Нажата клавиша увеличения громкости
button/volumeup)
/usr/bin/amixer set PCM 5%+
;;
# Есть/нет питания от сети
ac_adapter)
case "$2" in
AC0)
case "$4" in
# Питания от сети нет
00000000)
# команды1
;;
# Питание от сети есть
00000001)
# команды2
;;
esac
;;
esac
;;
# Закрыта крышка —  отправляем ноутбук в сон
button/lid)
grep -q closed /proc/acpi/button/lid/*/state
if [ $? = 0 ]; then
echo -n mem >/sys/power/state
fi
;;
esac

Скрипт обрабатывает всего три события: управление громкостью, наличие питания от сети и закрытие крышки ноутбука. Нам этого будет вполне достаточно. Я намеренно не стал вставлять команды, выполняемые при подключении/отключении кабеля питания, прямо в скрипт. Чтобы удобнее было читать, я приведу их ниже. Итак, «команды1» — питания от сети нет, ноутбук работает от батареи, включаем максимальное энергосбережение:

# Процессор
/sbin/modprobe cpufreq_powersave
for i in /sys/devices/system/cpu/*/cpufreq/scaling_governor;
do echo powersave > $i; done
# Подсистема управления памятью
echo 5 > /proc/sys/vm/laptop_mode
echo 90 > /proc/sys/vm/dirty_ratio
echo 1 > /proc/sys/vm/dirty_background_ratio
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
# Жесткие диски
for i in /sys/class/scsi_host/*/link_power_management_policy;
do echo min_power > $i; done
# Аудио
echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller
echo 1 > /sys/module/snd_hda_intel/parameters/power_save
# USB
for i in /sys/bus/usb/devices/*/power/autosuspend;
do echo 1 > $i; done
for i in /sys/bus/usb/devices/*/power/level;
do echo auto > $i; done
# CD-ROM
/usr/bin/udisks --inhibit-polling /dev/sr0
# Веб-камера
/sbin/modprobe -r uvcvideo
# Bluetooth
/usr/sbin/hciconfig hci0 down
/sbin/rmmod hci_usb
# Wi-Fi
/usr/sbin/iwconfig eth0 power on
# Экран
echo 2 > /sys/class/backlight/*/brightness
# Видеоадаптер
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
echo powersave > /sys/module/pcie_aspm/parameters/policy

Теперь «команды2» — питание от сети есть, энергосбережение можно отключить:

# Процессор
for i in /sys/devices/system/cpu/*/cpufreq/scaling_governor;
do echo ondemand > $i; done
# Подсистема управления памятью
echo 0 > /proc/sys/vm/laptop_mode
echo 10 > /proc/sys/vm/dirty_ratio
echo 5 > /proc/sys/vm/dirty_background_ratio
echo 6000 > /proc/sys/vm/dirty_writeback_centisecs
# Жесткие диски
for i in /sys/class/scsi_host/*/link_power_management_policy;
do echo max_performance > $i; done
...

Как видно, списки команд очень похожи, и второй набор просто приводит систему к первоначальному состоянию. На диске ты найдешь полную версию скрипта, который следует слегка отредактировать, чтобы подогнать под твой ноутбук, — например, убрать строки, касающиеся Bluetooth, если такого адаптера в ноуте нет, или убрать строку, отключающую камеру в том случае, если она нужна в дороге. Теперь сохрани файл, поставь на него бит исполнения и попробуй выдернуть кабель питания — настройки должны вступить в силу незамедлительно.

 

INFO

Для поиска прожорливых приложений и компонентов ядра ты можешь использовать утилиту powertop. С ее помощью также можно активировать многие из приведенных в статье опций энергосбережения.

Список наиболее жадных до энергии процессов в PowerTOP
Список наиболее жадных до энергии процессов в PowerTOP
 

Заключение

Приведенные настройки позволяют продлить жизнь ноутбука от батареи в полтора-два раза в зависимости от условий использования. Применить их к своей системе довольно легко, просто скопировав файл с нашего диска и положив его в каталог /etc/acpi. При этом настройки можно без труда подогнать под свою систему и оставить работать только те компоненты, которые нужны именно тебе. Ни один дистрибутив не позволяет сделать это с помощью стандартных инструментов.

Статистика использования оборудования в PowerTOP
Статистика использования оборудования в PowerTOP

 

Исчерпание ресурсов HDD

Жесткие диски для настольных систем выдерживают всего 40 000–50 000 остановок/запусков, так что при засыпании жесткого диска каждые 10 минут он умрет за 277 дней. Диски ноутбуков выдерживают 300 000 остановок/запусков, поэтому в том же варианте использования они выдержат 2083 дня, или 6 лет.

 

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии