четвер, 17 вересня 2015 р.

FreeBSD на ноутбуке. Живем на батарейке.

Доброго времени суток!
С выходом FreeBSD 10.2 (и, соответственно PC-BSD 10.2) на моем ноутбуке наконец-то вроде все заработало как надо. Определился ethernet (не очень и хотелось) и что самое главное заработали нормально режимы сна и управление подсветкой. Соответственно, я озаботился поиском информации о настройках энергопотребления в FreeBSD. Я думаю не секрет что при дефолтных настройках ноутбук с FreeBSD от батареи на живет. Это просто перемещение от розетки к розетке.
Итак...

Системные режимы сна и крышка ноутбука.

Теория...

Спецификация ACPI (Advanced Configuration and Power Interface) выделяет несколько для нас интересных состояний сна системы :
  • S1 - не глубокий сон, процессор и память получают питание. 
  • S3 - Он же "Suspend to RAM" он же "Ждущий режим" или "Standby" или "Sleep" в Windows, он же "Sleep" в OSX. В этом режиме энергию потребляет практически только оперативная память. Ноутбук обычно переходит в этот режим после закрытия крышки и может в нем оставаться без проблем несколько дней.
  • S4 - Он же "Suspend to disk", он же "Спящий режим" или "Hibernation" в Windows, он же "Safe Sleep" в OSX. Все состояние системы сохраняется на жестком диске. При следующей загрузке возможно полное возобновление работы.
  • S5 - Фактически выключение системы, но физически система все еще получает питание и может быть запущена, например по Wake on Lan. Контекст выполнения не сохраняется. Короче, обычное выключенное состояние.
Подробнее смотрите в википедии

... и практика

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

Интересующие нас настройки режимов сна делаются через sysctl:
  • hw.acpi.supported_sleep_state (ro) - показывает возможные состояния на Вашей системе. (В моем случае hw.acpi.supported_sleep_state: S3 S4 S5)
  • hw.acpi.power_button_state (r/w) - позволяет указать состояние, в которое система перейдет после нажатия на кнопку питания (обычно S5 - выключено). Возможно значение "NONE" - игнорировать нажатие вообще.
  • hw.acpi.sleep_button_state (r/w) - позволяет указать состояние, в которое система перейдет после нажатия на кнопку (или комбинацию кнопок) Sleep (В моем случае это Fn + F2). Обычно hw.acpi.sleep_button_state=S3. Возможно значение "NONE"
  • hw.acpi.lid_switch_state (r/w)/ Позволяет указать состояние после закрытия крышки. По умолчанию (у меня по крайней мере) значение NONE (т.е. не реагировать вообще). Чтобы добиться от ноутбука ожидаемого засыпания на закрытие крышки нужно поставить S3.
Короче говоря, если у Вас вышеперечисленные  sysctl присутствуют, но ноутбук не засыпает, то можно руками поменять их значения (как минимум sysctl hw.acpi.lid_switch_state=S3), а лучше добавить в /etc/sysctl.conf что- то типа:

hw.acpi.lid_switch_state=S3
hw.acpi.sleep_button_state=S3

К стати, можно попробовать на hw.acpi.sleep_button_state поставить S4 и по кнопке "Сон" ложить систему в "Hibernate"

Подсветка экрана

Если значение sysctl hw.acpi.video.lcd0.active единица- поздравляю, на Вашем ноутбуке поддерживается управление подсветкой экрана.
Возможные значения интенсиваности подсветки можно посмотреть в sysctl hw.acpi.video.lcd0.levels (на сколько я понимаю там всегда значения в процентах, т.е от 0 до 100).
Ну и, наконец, для изменения яркости подсветки нужно изменять hw.acpi.video.lcd0.brightness.
Например (в моем случае) достаточно комфортно работать при 40% яркости:

% sudo sysctl hw.acpi.video.lcd0.brightness=40

PS. Имя lcd0 в sysctl намекает нам что возможно существование и lcd1. Но на практике я не видел управления двумя подсветками.

Если у Вас нет вышеупомянутых переменных и видеоадаптер от Intel попробуйте поставить этот пакет (порт): http://www.freshports.org/graphics/intel-backlight/
В описании порта написано как этим пользоваться.

Состояние батареи и потребляемая мощность
Для того чтобы посмотреть информацию о Вашей батарее можно использовать утилиту acpiconf. У нее есть параметр -iХ для просмотра состояния батареи, где "Х"- номер батареи. В общем случае выглядит это где- то так:

% acpiconf -i0
 

Design capacity:        38006 mWh
Last full capacity:     29289 mWh
Technology:             secondary (rechargeable)
Design voltage:         7400 mV
Capacity (warn):        3796 mWh
Capacity (low):         377 mWh
Low/warn granularity:   377 mWh
Warn/full granularity:  377 mWh
Model number:           X202-51
Serial number:          
Type:                   LIon
OEM info:               ASUSTek
State:                  high
Remaining capacity:     99%
Remaining time:         unknown
Present rate:           0 mW
Present voltage:        7400 mV


Единицами измерения могут быть милливатты (милливатт часы) (в моем случае) или миллиамперы (миллиампер часы). Для пересчета милливатт в миллиамперы нужно милливатты поделить на напряжение питания (Present voltage или Design voltage в милливольтах) и умножить на 1000. Т.е. моя батарея имеет заводскую емкость ~5136 mAh (38006/7400*1000).
На что следует обратить внимание.
  • Remaining capacity - процент заряда батареи
  • Remaining time - прогнозируемое оставшееся время работы от батареи. Если подсоединено питание значение будет unknown.
  •  Present rate - текущее энергопотребление. Меняете яркость подсветки, настройки процессора, отключаете беспроводной адаптер и смотрите как уменьшается энергопотребление. Показывает только при питании от батареи.
  • Last full capacity - Емкость при последнем полном заряде. Как я понимаю, сравнив с Design capacity можно посмотреть степень деградации батареи. В моем случае батарейка уже немного устала :(

 Осталось за кадром

Естественно управление питанием (и энергопотреблением) не ограничивается вышеперечисленным. Я не писал как минимум о режимах сна процессора и о изменении его частоты.  Если Вам интересно- почитайте FreeBSD Wiki на эту тему.
 

Немає коментарів:

Дописати коментар