Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #67, ИЮЛЬ 2004 г.

Мобильные юниксы vol. 2

Anton Karpov

Xakep, номер #067, стр. 067-082-2


# acpiconf –s 3

Помимо этого, есть скрипт rc.suspend, выполняющий операции для "чистого" засыпания. В него ты можешь прописать выгрузку модулей, которые мешают засыпанию и подвешивают систему при возвращении в рабочий режим.

Наконец, если и Suspend to RAM не работает, то есть последний шанс уложить демона в кровать (я имею в виду sleep state, никакой пошлости). Говоря об отсутствии во FreeBSD возможности Suspend to disc, я немного слукавил. Дело в том, что некоторые ноутбуки имеют поддержку Suspend to disc на уровне BIOS. Для таких ноутов существуют специальные тулзы (у каждого вендора – свои), которые форматируют один раздел жесткого диска специальным образом, чтобы BIOS знал его геометрию и вся информация из оперативки дампилась туда. Как правило, такие ноуты поставляются с уже преформатированным разделом. Данная технология в аннотации к FreeBSD называется s4bios. Поддерживает ли ее твой ноут, можно узнать по значению sysctl-переменной hw.acpi.s4bios. Если напротив этого параметра стоит единичка – поздравляю, твой ноут практически гарантированно умеет засыпать под FreeBSD. Так как данная технология возлагает все тонкости работы на BIOS, вмешательство операционки требуется минимальное, и, судя по сообщениям в списках рассылки, все обладатели ноутов с фичей s4bios не имели проблем с суспендом.

ACPI Actions и FreeBSD

Во фряхе нет такого удобного демона, как acpid. Впрочем, freebsd-folks по этому поводу особо не комплексуют, у них есть своя альтернатива – devd. Демон, реагирующий на изменения состояния устройств и позволяющий запускать проги в ответ на различные события ядра, научился отрабатывать acpi-events. Включаем devd при загрузке:

# vi /etc/rc.conf

devd_enable="YES"

Перезагрузки не потребуется благодаря новой системе управляющих скриптов rc-NG, позаимствованной у NetBSD, запускать и останавливать службы теперь проще простого:

# /etc/rc.d/devd start

Конфигурационный файл /etc/devd/conf, как говорят в таких случаях, self-explanatory. Он состоит из секций "система – подсистема – действие", например, чтобы регулировать яркость все того же несчастного монитора в зависимости от источника питания, нам нужно написать:

# vi /etc/devd/conf

notify 10 {

match "system" "ACPI";

match "subsystem" "ACAD"

action "/root/scripts/acpid.sh";

};

Здесь система – ACPI, подсистема – питание, и как только в ней фиксируется изменение состояния (например, воткнули шнурок в розетку), запускается специальный скрипт следующего содержания.

# vi /root/scripts/acpid.sh

#!/bin/sh

STATE=`sysctl hw.acpi.acline | awk '{print $2}'`

SB="/usr/local/bin/setbrightness"

logger -t AC state changes at `date +'%Y%m%d %H:%M:%S'`

online() {

$SB 200

sysctl hw.acpi.cpu.throttle_state=8

}

offline() {

$SB 10

sysctl hw.acpi.cpu.throttle_state=4

}

[ "$STATE" -eq 1 ] && online

[ "$STATE" -eq 0 ] && offline

exit 0

Состояние, аналогичное линуксовому charging/discharging, хранится в sysctl-переменной hw.acpi.acline (1 – в сети, 0 – на батарейках); setbrightness – утилита контроля яркости монитора из пакета sjog; hw.acpi.cpu.throttle_state – состояние засыпания процессора, чем оно меньше, тем чаще проц будет видеть короткие сны, тормозя работу, но и продлевая время работы от аккумулятора.

Назад на стр. 067-082-1  Содержание  Вперед на стр. 067-082-3