суббота, 31 января 2009 г.

pyCaptcha

Intro

Python - язык программирования.
pyCaptcha - библиотка для него, позволяющая без труда делать капчи.
Её код отлично коментирован, но, к сожалению, на этом документация и кончается. Ниже краткий обзор

Примеры сгенерированных картинок

pyCaptcha example pyCaptcha example pyCaptcha example pyCaptcha example pyCaptcha example pyCaptcha example pyCaptcha example pyCaptcha example pyCaptcha example

Сущности

Основными сущностями являются слой и капча
Layer (Captcha.Visual.Base.Layer)
Слой - это нечто, что можно наложить на картинку и получить другую картинку.
Реализованны следующию виды слоёв (в скобках указаны аргументы конструктора):
  • Фоновые (Captcha.Visual.Backgounds.*): SolidColor(color="white"), Grid(size=16, foreground="black"), TiledImage(imageFactory=Pictures.abstract), CroppedImage(imageFactory=Pictures.nature), RandomDots(colors=("white", "black"), dotSize=4, numDots=400)
  • Текстовые (Captcha.Visual.Text.*): TextLayer(text, alignment=None, font=None, fontFactory=None, textColor="black", borderSize=0, borderColor="white")
  • Искажения (Captcha.Visual.Distortions.*): WigglyBlocks(blockSize=16, sigma=0.01, iterations=300) сдвигает случайные блоки, SineWarp(amplitudeRange=(3, 6.5), periodRange=(0.04,0.1))
Captcha
Пакет предоставляет чистую абстракцию капчи - класс Captcha.Base.BaseCaptcha, умеющий исключительно сравнивать решение против правильных ответов. Причём и то, и другое может быть списком и ошибки первого и второго родов можно задать при наследовании (по умолчанию, требуется единственный, правильный ответ).
От него наследует класс Captcha.Visual.Base.ImageCaptcha. Практический интерес представляют методы getLayers, возвращающий список объектов-слоёв, и render, возвращающий PIL-изображение.
Также имеется несколько вспомагательных классов
Captcha.Visual.Base.ImageFactory
Предоставляют случайную картинку из указанной директории. В комплект входят два объекта этого класса: abstract и nature. Передаются в конструкторы слоёв TiledImage и CroppedImage
Captcha.Base.WordList
Читает файл со словами и по методу pick выдаёт случайное. Удобно использовать при генерации вопроса-ответа. Предопределены словари basic_english и basic_english_restricted - второй есть ограничение первого на слова от пяти до восьми символов включительно.
Captcha.Visaul.Text.FontFactory
Принимает список шрифтов, и диапазон допустимых размеров. По методу pick возвращает пару (fileName, size), которую можно передать ImageFont.truetype(). Предопределен объект defaultFontFactory - шрифт vera и размеры от 30 до 40.
Captcha.Base.Factory, Captcha.Base.PersistentFactory
Предоставляют базовые возможности по хранению капч, следят за соблюдением таймаутов

Получение пакета. Пример создания капчи

Последнюю версию можно получить с svn.

$ svn co http://svn.navi.cx/misc/trunk/pycaptcha/
$ find -name .snv -delete
Ниже приведён файл, генерирующий капчи выше, класть в папку pycaptcha

#!/usr/bin/env python

from Captcha.Visual import Text, Backgrounds, Distortions, ImageCaptcha


class PseudoBackGimpy(ImageCaptcha):
    def __init__(self, word, *args, **kwargs):
        self.word = word
        super(PseudoBackGimpy, self).__init__(*args, **kwargs)
    def getLayers(self):
        word = self.word
        return [
            Backgrounds.CroppedImage(),
            Text.TextLayer(word, borderSize=1),
            Distortions.SineWarp(),
            ]


class AngryBackGimpy(ImageCaptcha):
    def __init__(self, word, *args, **kwargs):
        self.word = word
        super(AngryBackGimpy, self).__init__(*args, **kwargs)
    def getLayers(self):
        word = self.word
        return [
            Backgrounds.TiledImage(),
            Backgrounds.RandomDots(),
            Text.TextLayer(word, borderSize=2),
            Distortions.WigglyBlocks(),
            ]
        
class Smoothy(ImageCaptcha):
    def __init__(self, word, *args, **kwargs):
        self.word = word
        super(Smoothy, self).__init__(*args, **kwargs)
    def getLayers(self):
        word = self.word
        return [
            Backgrounds.SolidColor(),
            Backgrounds.Grid(),
            Backgrounds.RandomDots(),
            Text.TextLayer(word, borderSize=3),
            Backgrounds.RandomDots(),
            Distortions.SineWarp(),
            ]

word = 'pyCaptcha'
examples_count = 3
size = (300,100)
klasses = [PseudoBackGimpy, AngryBackGimpy, Smoothy, ]
for klass in klasses:
    for current in range(examples_count):
        captcha = klass(word)
        img = captcha.render(size)
        img.save('_'.join(['out', word, str(klass.__name__), str(current)+".png"]))

понедельник, 23 июня 2008 г.

(на память)

Если после перехода на firefox3 сессии перестали сохраняться, попробуйте зайти в about:config и устанвить значение browser.sessionstore.enabled равным true.

воскресенье, 11 мая 2008 г.

Тараканы в космосе

Обнаружил удивительный баг - если из-под непривилегированного пользователя с русской локалью выполнить sudo screen (а системная локаль - английская), то русский ввод/вывод непредсказуемо глючит. Лечиться - sudo screen -U, либо добавлением соотвествующего "алиаса" в usr/local/bin

среда, 26 марта 2008 г.

Cut для blogspot

Факт: blogger.com не умеет делать cut хоть сколько-нибудь элегантно. Погуглив, нашёл решение от PhoeniX'a, основанное на сворачивании блоков с классом "cut" посредством и динамическом из разворачивании яваскриптов. В нём были две вещи, которые мне не очень нравились. Во-первых, человек без яваскрипта не видел ни кнопку развернуть, ни остатка текста. Ну и чисто из идеалогических соображений, мне не нравилаль необходимость лезть в скрипт, чтоб поменять картинки.

Моя версия работает вообще без картинок, и позволяет указывать текст для ката. Установка почти аналогична установке скрипта-оригинала.

1. Необходимо подключить библиотеку jquery и сам скрипт сворачивания. Также надо добавить стили для кат-блока (класс cut) и блока с кат-надписью (класс cut_toogle_text).

<script type='text/javascript' src='http://jqueryjs.googlecode.com/files/jquery-1.2.1.pack.js'/>
<script type='text/javascript' src='http://4me.net.ru/ln/script4blogger2_noimgs.js'/>
<style>
<b:if cond='data:blog.pageType != "item"'>
BODY.js .cut {display:none;}
<b:else/>
.cut {display: block;}
</b:if>
.cut_toogle_text  {color: #336699; cursor: pointer; display: inline; font-weight: bold;}
.cut_toogle_text:hover  { text-decoration: underline;}
</style>

Внимание, мой скрипт для ката является "живым", так что если вы ссылаетесь на него, и вдруг начнут выскакивать алерты - не пугайтесь ;)

2. Далее, надо сделать так, чтоб при загрузке к BODY добавлялся класс js (чтоб каты сворачивались).

Для этого сразу после тэга BODY добавьте:


<script type='text/javascript'>
   $("BODY").addClass("js");
</script>
3. Теперь сделаем так, чтоб в посте, открытом отдельно, ничего не сворачивалось.

Поставьте галочку на пункте "Расширить шаблоны виджета" и замените строку <data:post.body/> на


<b:if cond='data:blog.pageType != "item"'>
<div expr:id='data:post.id' class='pxpostwrap'>
<data:post.body/>
</div>
<b:else/>
<data:post.body/>
</b:if>
4. Осталось добавить кат-блог

Оберните часть поста, которую надо свернуть, в div блок с классом cut. Если хотите, можете переопределить кат-надпись в атрибуте alt


<div class="cut" alt="Здесь будет cut">
Этот текст будет свёрнут.
</div>

Ну и напоследок, пример использования и текст текущей версии скрипта


/*
Published under GNU GPL2
Author Leonid "PhoeniX" Ponomarev
Edited by Vah aka Anton Bakhtin 
*/
$(document).ready(initCut);

var cut_settings={'more_text': 'Читать далее...', 'less_text': 'Свернуть'};

function initCut()
{
 $("div.pxpostwrap div.cut").each(function(){
  var alt=$(this).attr('alt');
  if (!alt) alt=cut_settings['more_text'];
  pc=$("P", this).size(); var pc_string="абзацев";
  if (pc%10==1) pc_string="абзац";
  if (pc%10==2 || pc%10==3 || pc%10==4) pc_string="абзаца";
  alt=alt + " (" +pc + " " + pc_string + ")";
  $(this).after("<div class=\"cut_toogle_text\" alt=\"" + alt + "\">" + alt + "</div>");
 });
 $("div.cut_toogle_text").toggle(
  function(){
   $(this).text("Загрузка...").prev().fadeIn("slow",
    function(){$(this).next().text(cut_settings['less_text']);}
   );
  },
  function(){
    $(this).prev().fadeOut("fast");
    $(this).text($(this).attr("alt"));
  }
 );
}

среда, 5 марта 2008 г.

sk1 ebuild

В январском (русском) номере LinuxFormat была статья о чудо векторном редакторе sk1, умеющим с лёгкостью открывать ai. Это надо было попробовать. Однако команда eix sk1 выдала (sic!): "No matches found."

Что ж, не можешь - поможем, не хочешь - заставим.

Сайт проекта также не предлагал варианта, для Gentoo, поэтому пришлось писать ebuild.

Итак, инструкция по применению.

1. Создать локальный overlay

Например, создадим его в папке /usr/local/portage, и добавим к списку известных portage


# mkdir -p /usr/local/portage
# echo "PORTDIR_OVERLAY=\"/usr/local/portage/ \${PORTDIR_OVERLAY}\"" >> /etc/make.conf
2. Положить туда ebuild sk1

# cd /usr/local/portage/
# wget http://4me.net.ru/ln/sk.tar.gz
# tar -xvzf sk.tar.gz
# rm sk.tar.gz
3. Размаскирование необходимых пакетов

sK1 требует tk и tcl ветки 8.5, которые жёстко маскированы. Кроме того маскрирован (на всяких случай) и сам sk1. На момент написания поста, в портежах были только версии 8.5.1, поэтому в примере расмаскируются именно они.


# echo -e "=dev-lang/tcl-8.5.1\n=dev-lang/tk-8.5.1\nmedia-gfx/sK1" >> /etc/portage/package.keywords
# echo -e "=dev-lang/tcl-8.5.1\n=dev-lang/tk-8.5.1" >> /etc/portage/package.unmask  
4. Добавление use флагов

Для корректной работы программы также необходимо, чтобы python был собран с USE-флагом tk, а media-libs/lcms с флагом python. Если это не так - добавьте их в make.conf или package.use и пересоберите пакеты:


# echo "dev-lang/python tk" >> /etc/portage/package.use
# echo "media-libs/lcms python" >> /etc/portage/package.use
# emerge -Nuva dev-lang/python media-libs/lcms
5. Установка sK1

# emerge -av sK1

Вот, собственно, и все. Чтобы запустить редактор, наберите sk1.

Критика и сообщения о корявости ebuild'а - приветствуются!

четверг, 28 февраля 2008 г.

Виртуальные apache домены автоматом

Есть у меня привычка, для каждого сайта создавать отдельный локальный "домен". И было это легко делать в винде, ибо там есть денвер. Он на лету генерировал apache-кофиги и прописывал хосты в hosts в зависимости от структуры каталогов.

Например, из следующего дерева каталогов получаются домены dom1, www.dom1, sub1.dom1, sub2.dom1, another.dom, www.another.dom, причём dom1=www.dom1, another.dom=www.another.dom

dom1/
  sub1/
  sub2/
  www/
another.dom/
  www/

Чтобы сделать такое же в линуксе, я написал маленький скрипт. Чтобы использовать его, необходимо произвести нексолько простых операций


# echo 'Include /etc/apache2/vhosts.d/autogenerated/*.conf' > /etc/apache2/vhosts.d/autogenerated.conf
# mkdir /etc/apache2/vhosts.d/autogenerated
# touch /usr/local/sbin/host_generator && chmod +x /usr/local/sbin/host_generator

Файл /usr/local/sbin/host_generator приведен ниже.

Перед стартом, проверьте свой /etc/hosts и запишите домены, отвечающие узлу 127.0.0.1 в DEFAULT_LOCALHOSTS. Также поправьте APACHE_HOME_DIR, если путь к файлам сервера отличается от "/var/www/".

По умолчанию, скрипт рассматривает все подкаталоги как поддомены. Это поведение можно изменить редактированием файлов ACCEPTED_HOSTS и FORBIDDEN_HOSTS. По умолчанию FORBIDDEN_HOSTS пуст, а ACCEPTED_HOSTS содерижит единственную всё-разрешающую запись: */* . Взять скрипт отдельным файлом можно здесь

/usr/local/sbin/host_generator

#!/bin/bash

###### НАЧАЛО КОНФИГУРАЦИИ
# Будут добавленны все разрешённые, не запрещённые хосты
ACCEPTED_HOSTS="/root/.hag_accepted.conf"
FORBIDDEN_HOSTS="/root/.hag_forbidden.conf"
APACHE_HOME_DIR="/var/www/"
APACHE_CONFS_DIR="/etc/apache2/vhosts.d/autogenerated/"
DEFAULT_LOCALHOSTS="localhost"
BE_VERBOSE=false
###### КОНЕЦ КОНФИГУРАЦИИ



if [ "$UID" -ne 0 ]
then 
 echo "Superuser rights is required"
 exit 2
fi

genApacheConf(){
 if [[ "$2" = "www" ]]
 then 
  full_domain=$1
 else
  full_domain=$2.$1
 fi 
 host_root="${APACHE_HOME_DIR}$1/$2"
 echo -e "# Host $1/$2 :"
 echo -e "<VirtualHost *:80>"
 echo -e "\tServerName \"$full_domain\""
 echo -e "\tServerAlias \"$full_domain\" \"www.$full_domain\""
 echo -e "\tDocumentRoot \"${host_root}\""

 echo -e "\t<Directory \"${host_root}\">"
 echo -e "\t\tOptions Indexes FollowSymLinks"
 echo -e "\t\tAllowOverride All"
 echo -e "\t\tOrder allow,deny"
 echo -e "\t\tAllow from all"
 echo -e "\t</Directory>"
 echo "</VirtualHost>"
 echo
}


# Очищение $APACHE_CONFS_DIR
find "${APACHE_CONFS_DIR}" -mindepth 1 -exec rm -v \{\} > /dev/null \; || { echo "(EE) При очистке ${APACHE_CONFS_DIR} произошла ошибка"; exit 1; }


# Читаем настройки
if [ ! -e $ACCEPTED_HOSTS ]
then
 [ $BE_VERBOSE = true ] && echo "Создаётся файл '$ACCEPTED_HOSTS'"
 echo '*/*' > $ACCEPTED_HOSTS || { echo "(EE) Невозможно создать $ACCEPTED_HOSTS"; exit 1; }
fi
if [ ! -e $FORBIDDEN_HOSTS ]
then
 [ $BE_VERBOSE = true ] && echo "Создаётся файл '$FORBIDDEN_HOSTS'"
 touch $FORBIDDEN_HOSTS || { echo "(EE) Невозможно создать $FORBIDDEN_HOSTS"; exit 1; }
fi


set -f
accepted_hosts=( $(cat $ACCEPTED_HOSTS))
forbidden_hosts=( $(cat $FORBIDDEN_HOSTS) )

found_doms=( )
found_sub_doms=( )
hosts=$(ls $APACHE_HOME_DIR)
hosts_to_attach=""
for host in $hosts
do
 subdoms=$(find ${APACHE_HOME_DIR}${host}/ -maxdepth 1  -mindepth 1 -type d -or -type l | grep -Po "[^/]+$")
 has_accpepted_doms=false
 for sd in ${subdoms[@]}
 do
  accepted=false
  [ $BE_VERBOSE = true ] && echo "-------- $host/$sd"
  for pattern in ${accepted_hosts[@]}
  do
   echo "$host/$sd" | grep -qP "^${pattern//\*/[^/]*}\$"
   if [ $? = 0 ] 
   then
    [ $BE_VERBOSE = true ] && echo "--- Путь '$host/$sd' разрешён правилом $pattern"
    accepted=true
    break
   fi
  done
  if [ $accepted != true ]; then continue; fi;
  forbidden=false
  for pattern in ${forbidden_hosts[@]}
  do
   echo "$host/$sd" | grep -qP "^${pattern//\*/[^/]*}\$"
   if [ $? = 0 ] 
   then
    [ $BE_VERBOSE = true ] && echo "--- Путь '$host/$sd' запрещён правилом $pattern"
    accepted=true
    forbidden=true
    break
   fi
  done
  if [ $forbidden != true ]
  then
   has_accpepted_doms=true
   found_sub_doms=( ${found_sub_doms[@]} "$host/$sd" )
  fi
 done
 if [ $has_accpepted_doms = true ]
 then
  found_doms=( ${found_doms[@]} "$host" )
 fi
done

[ $BE_VERBOSE = true ] && echo
hosts_to_attach=""
for dom in ${found_doms[@]}
do
 [ $BE_VERBOSE = true ] && echo "----> Добавляем домен $dom"
  hosts_to_attach+=" $dom"
 for sd_full in ${found_sub_doms[@]}
 do
  host=${sd_full/\/*/}
  if [ "$host" != "$dom" ]; then continue; fi
  sd=${sd_full/*\//}
  [ $BE_VERBOSE = true ] && echo "----> Добавляем поддомен $sd.$host"
   hosts_to_attach+=" $sd.$host"
   [ $BE_VERBOSE = true ] && echo "------> Записываем apache конфигурацию в файл ${APACHE_CONFS_DIR}${host}_${sd}.conf"
   genApacheConf $host $sd > ${APACHE_CONFS_DIR}${host}_${sd}.conf || { echo "EE ------> Ошибка при записи в ${APACHE_CONFS_DIR}${host}_${sd}.conf!"; exit 1; }
 done
done
[ $BE_VERBOSE = true ] && echo
 
echo "Найдены поддомены ${found_sub_doms[@]}"

[ $BE_VERBOSE = true ] && { echo; echo "> Обновляем /etc/hosts"; }
comment_string="# Autogenerated by $0, don't edit manualy"
resulted_string="${comment_string}\n127.0.0.1 ${DEFAULT_LOCALHOSTS}${hosts_to_attach}\n"
new_hosts=$(awk -v ress="${resulted_string}" -v coms="${comment_string}" 'BEGIN {n=1}; /^127.0.0.1/ {if (n == 1) printf ress; else print "#",$0 ; n = n + 1}; !/^127.0.0.1/ {if ($0!=coms) print};'  /etc/hosts)

{ echo "$new_hosts" > /etc/hosts; } || { echo "(EE) Невозможно записать в /etc/hosts"; exit 1; }

пятница, 8 февраля 2008 г.

Управление питанием компьютера

Перевод статьи Power Management Guide. В статье рассматриваются способы увеличения жизни ноутбука от батареи. Статья ориентирована на Gentoo, но думаю, сделав замену emerge на apt-get install/rpm -Uvh/.. и обладая общими знаниями о runlevels в вашей системе, можно всё написанное перенести и на другие дистрибутивы.

1. Введение

Ёмкость и время жизни батереи ноутбуков были значительно увеличены в последние годы. Тем не менее, современные процессоры потребляют намного больше энергии, чем более старые, и каждое новое поколение ноутбуков комплектуется всё более и более жадными до энергии устройствами. Поэтому Управление Питанием становится даже более важным, чем прежде. Увеличение времени автономной жизни совсем не обязательно влечёт покупку ещё одной батареи - многое можно выжать, применяя граммотные установки Управления Питанием.

Краткий обзор

Пожалуйста, учтите, что данное руководство описывает настройку Управления Питанием только для ноутбуков. Хотя некоторые разделы и могут быть также применимы к серверам, другие - не только не применимы, но могут даже нанести урон. Не стоит делать что-либо без понимания того, что вы делаете.

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

В главе Подготовка говорится о некоторых общих действиях, которые необходимо выполнить перед настройкой отдельных устройств. Это включает настройку BIOS, конфигурацию ядра и некоторые изменения пользовательских настроек. Следующие три главы сфокусированы на устройствах, обычно потребляющих больше всего энергии - процессоре, дисплее и жёстком диске. Каждое из них может быть сконфигурированно независимо. Глава Управление Питанием ЦПУ показывает, как изменять частоту процессора для сохранения максимального количества энегрии, не теряя слишком много в производительности. Несколько способов отучить ваш жёсткий диск работать зазря (тем самым заодно уменьшив шум) можно найти в Управлении Питанием Диска. Некоторые заметки о графических картах, безпроводных сетях и USB завершают раздел об устройствах главой Управелние Питанием Других Устройств. Отделаная глава отведена (довольно не стабильным) состояниям спячки (sleep states). Последний раздел, Устранение неполадок, содержит список самых распространённых проблем.

Покомпонентное распределение энергии

Покомпонентное распределение энергии

Почти каждый элемент может находиться в различных положениях - выключен, спит, ждёт, активен - потребляя различное количество энергии. Наибольшие куску отъедаются экраном, проыессором, чипсетом и жёсткими дисками. Часто устройство может быть переведено в ОС-независимый режим Управления Питнием через биос, но интеллектуальные средства операционной системы, реагирующие на ситуацию, могут принести намного больше.

2. Подготовка

Перед детальным обсуждением настройки Управления Питанием для отдельных устройств, стоит убедиться, что следующие требования выполнены. После проверки установок BIOS, стоит включить некоторые опции в ядре (если коротко, то это - ACPI, режимы спячки и регулирование частоты ЦП). Так как сохранение энергии в большинстве случаев влечёт потери производительности, то его стоит применять только при работе от батарей. Для этого разграничения очень полезен отдельный уровень запуска (runlevel) battery.

BIOS

Для начала стоит взглянуть на настроки Управления Питания в BIOS. Наилучшее решение - совмещать возможности BIOS и операционной системы. Но чтобы быть увереными, что BIOS не будет конфликтовать с операционной ситемой, лучше пока отключить бОльшую часть его настроек по управленю питанием. Не забудьте перепроверить настройки биоса после конфигурации чего-либо ещё.

Настройка USE-флагов

Убедитесь, что 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), смотрите главау о режимах спички за подробностями. Во время конфигурации ядра включите хотя бы эти опции:

Листинг 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.2: Установка acpid
# emerge sys-power/acpid # /etc/init.d/acpid start # rc-update add acpid default

Создание уровня запуска (runlevel) "battery"

Политики (policy) по умолчанию будут включать Управление Питанием, только когда это необходимо, т.е. при работе от батереи. Чтобы сделать переключение между питанием от сети и питанием от батарей более удобным, создайте уровень запуска battery, который будет содержать все скрипты запускающие и останавливающие Управление Питанием.

Примечание: Вы можете пропустить эту секцию, если вы не хотите создавать ещё один уровень запуска. В последующих секции предполагается, что уровень запуска battery существует

Листинг 2.3: Создание уровня запуска battery
# cd /etc/runlevels # cp -a default battery

Вот и всё! Новоиспечённый уровень запуска battery содержит всё, что есть в defaults, но автоматического переключения между ними нет. Пора изменить это.

Реагирование на ACPI-события

Типичные ACPI-события - это закрытие крышки, изменение источника питания и нажатие клавиши засыпания. Для нас важно события изменения источника питания - именно из-за него будут переключаться уровни запуска. Маленький скрипт позаботится об этом.

Для начала, вам нужен скрипт, который меняет уровень запуска на defaults или battery в зависимости от источника энергии. Скрипт использует команду on_ac_power из sys-power/powermgmt-base - убедитесь, что он установлен на вашей системе.

Листинг 2.4: Установка sys-power/powermgmt-base
# emerge powermgmt-base

Теперь вы может определить источник питания, запустив on_ac_power && echo AC available || echo Running on batteries в консоле. Скрипт ниже отвечает за переключение уровней. Сохраните его как /etc/acpi/actions/pmg_switch_runlevel.sh.

Листинг 2.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 на большистве ноутбуков, но могут быть другими на вашем.

Листинг 2.6: Определение ACPI-событий для изменение источника питания
# tail -f /var/log/messages | grep "received event"

Запустите команду выше и отключите ноутбук от питания. Затем снова подключите его. Вы должны увидеть что-то такое:

Листинг 2.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. Они должны совпадать с теми, что используются в файле ниже. Не беспокойтесь, если ваша система выдает много мобытий или всегда одни и те же. Пока хоть какое-нибудь событие генирируется, переключение уровней будет работать.

Листинг 2.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
Листинг 2.9: /etc/acpi/events/pmg_battery
# замените "battery" ниже на реальное событие вашем ноутбуке # Например, battery.* будет соотвествовать battery AC 00000080 00000001 event=battery.* action=/etc/acpi/actions/pmg_switch_runlevel.sh %e

Наконец, acpid должен быть перезапущен, чтобы изменения вступили в силу.

Листинг 2.10: Последний штрих
# /etc/init.d/acpid restart

Вы можете проверить работоспосбность скриптов, отсоеденив кабель питания и вставив его вновь, - в syslog должны появляться сообщения "Switching to AC mode" или "Switching to battery mode". Обратитесь к устранению неполадок, если скрипт некорректно распознаёт источник питания.

Из-за природы механизма событий, ваш ноутбук будет загружаться в уровень запуска default не зависимо от источника питания. Это просто замечательно, если мы подключены к сети, но если нет, то нам хотелось бы загружаться в уровень запуска battery. Одно из решений - это добавить ещё один пункт в менеджер загрузки, с параметром softlevel=battery, но не сложно просто забыть его выбрать. Лучший путь - поставить ACPI-событие в конец процесса заргузки и позволить скрипту pmg_switch_runlevel.sh решать, какое изменение уровня необходимо. Откройте /etc/conf.d/local.start в вашем любимом редакторе и добавьте следующие строки:

Листинг 2.11: Изменение уровня запуска во время загрузки
# Эмулируем acpi событие, чтобы переключить уровень запуска, если работаем от батареи /etc/acpi/actions/pmg_switch_runlevel.sh "battery/battery"

Подготовив систему таким образом, вы можете активировать политики Управления Питания для отдельных устройств.

3. Управление питанием ЦПУ

Мобильные процессоры могут работать на нескольких частотах, а некоторые позволяют даже менять напряжение. Максимальная производительность нужна далеко не всегда, и меняя её можно сохранить немало энергии, причём зачастую без какого-либо понижения производительности

Техническая часть

Частота процессора связана с некоторыми техническими терминами, который могут быть вам незнакомы, поэтому ниже будет дано краткое введение.

Для начала, ядро должно "уметь" менять частоту процессора. Драйвер процессора CPUfreq (CPUfreq processor driver) знает как сделать это на вашем ЦП, поэтому важно указать его правильно в вашем ядре. Скорее всего, вы это уже сделали выше. Также ядро должно знать, какую частоту утанавливать. Это достигается посредством политик (policy), которые состоят из политики CPUfreq (CPUfreq policy) и властелина (governor). Первое - это пара из двух чисел, обозначающих максимальную и минимальную допустимую частоту ЦП, а второе отвечает за то, какую конкретно частоту выбрать. Так, властелин сохранения энергии (powersave governor) всегда выбирает минимальную допустимую частоту, а властелин максимальной произодительностью (performance governor), наоборот, максимальную; властелин пользователя (userspace governor) использует необходимую пользователю (или его приложениям) частоту, читая её из /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed.

Всё это не очень похоже на динамическое изменение частоты (и действительно не ялвяется таковым). Однако динамика может быть получена несколькими способами. Например, "требовательный" властелин (ondemand governor) принимает решение, основываясь на текущей загрузке ЦП. Это же может быть реализовано посредством различных пользовательских инструментов таких, как cpudn, cpufreqd, powernowd и многих других. События ACPI можно использовать для включения или выключения динамического изменения частоты в зависимости от источника питания.

Установка частоты вручную

Уменьшение скорости и напряжение на ЦП даёт двойной выигрыш: с одной стороны, потребляется меньше энергии, а с другой - ваша система греется не так сильно, как на полной мощности. Главный недостаток - очевидная потеря производительности. Уменьшение скорости процессора - обмен производительности на сохранение энергии.

Примечание: Не все ноутбуки поддерживают изменение частоты. Если вы не уверены, посмотрите список поддерживаемых процессоров в секции Устранение неполадок.

Самое время проверить, работает ли изменение частоты процессора. Давайте установим ещё один очень полезный при отладке инструмент: sys-power/cpufrequtils

Листинг 3.1: Проверка частоты ЦП
# emerge cpufrequtils # cpufreq-info
Вывод будет примерно таким:
Листинг 3.2: Пример вывода cpufreq-info
cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006 Report errors and bugs to linux@brodo.de, please. analyzing CPU 0: driver: acpi-cpufreq CPUs which need to switch frequency at the same time: 0 hardware limits: 798 MHz - 2.13 GHz available frequency steps: 2.13 GHz, 1.86 GHz, 1.60 GHz, 1.33 GHz, 1.06 GHz, 798 MHz available cpufreq governors: conservative, ondemand, powersave, userspace, performance current policy: frequency should be within 798 MHz and 2.13 GHz. The governor "conservative" may decide which speed to use within this range. current CPU frequency is 1.60 GHz.

Теперь, поиграйтесь с cpufreq-set, чтобы убедиться в работоспособности переключение частоты. Например, выполните cpufreq-set -g ondemand, чтобы активировать "требовательного" властелина, и проверьте изменение с помощью cpufreq-info. Если не работает как надо, вы можете попробовать найти причину в Устранении неполадок в конце этого руководства.

Автоматическая настройка частоты

Сказанное, конечно, прекрасно, но не очень применино в реальной жизни. Лучше поручить вашей системе автоматически подбирать подходяшую частоту. Есть много способов сделать это. Следующая таблица даёт общее представление о них и поможет вам выбрать необходимый. Их можно не совсем точно разделить на три типа: ядро - для методов нуждающихся только в поддержке ядра, демон - для запускающихся в фоне программ и графический - для программ, которые предоставляют графический интерфейс для простой настройки.

Имя Тип Причины для переключения (Switch decision) Используемые властелины ядры (Kernel governors) Предоставляемые режимы (Further governors) Комментарии
требовательный властелин ('ondemand' governor) Ядро Загрузка ЦП - - Выставляет максимальную частоту при загрузке ЦП и медленно шагает вниз во время простоя ЦП. Дальнейшая настройка через /sys/devices/system/cpu/cpu0/cpufreq/ondemand/. По-прежнему требует пользовательских программ (скриптов), если переключение властелинов или подобное необходимо.
косервативный властелин ('conservative' governor) Ядро Загрузка ЦП - - В отличие от требовательного властельна, консервативный не прыгает до максимальной частоты во время высокой загрузки ЦП, а увеличивает частоту постепенно. Дальнейшая настройка через /sys/devices/system/cpu/cpu0/cpufreq/conservative/. По-прежнему требует пользовательских программ (скриптов), если переключение властелинов или подобное необходимо.
cpudyn Демон Загрузка ЦП Производительность, сохранение энергии Динамические Также поддерживает disk standby. Однако стоит заметить, что laptop-mode в большинстве случаев работает лучше.
cpufreqd Демон Состояние батареи, загрузка ЦП, температура, запущенные программы и др. Все возможные Нет Тонкая (и местами сложная) установка. Расширяем посредством плагинов, таких как отслеживание показаний сенсоров (sensor monitoring) (lm_sensors). Может управлять памятью и ядром некоторых построенных на NVidia графических карт. Cpufreqd не поддерживает SMP, и при желании им можно управлять вручную во время выполнения.
powernowd Демон Загрузка процессора Нет Пассивный, синусоидальный (sine), агрессивный Пожжерживает SMP.
ncpufreqd Демон Температура Нет Производительность, сохранение энергии Переключает властителинов производительности и сохранения энергии. Очень полезен на ноутбуках, страдающих перегревом.
speedfreq Демон Загрузка ЦП Нет Динамический, сохранения энергия, производительность, фиксированной скорости Легко настраивается с помошью приятного клиент-серверного интерфейса. Требуется ядро 2.6. Не поддерживается, сломан и поэтому удален из портежей. Пожалуйста, перейдите на cpufreqd, если вы всё ещё используете эту программу.
gtk-cpuspeedy Графический Нет Нет Нет Gnome-приложение, графический инструмент для ручной установки частоты процессора. Не предоставляет никакой автоматизации.
klaptopdaemon Графический Состояние батареи Все возможные Нет Только для КДЕ, властелин требований для динамического изменения частоты.

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

Что выбрать? Если вы не можете решить, попробуйте cpufreqd.

Листинг 3.3: Установка cpufreqd
# emerge cpufreqd

cpufreqd настраивается редактированием /etc/cpufreqd.conf. Конфиг, предоставляемый по умолчанию, может вас несколько смутить. Рекомендуется заменить его на конфиг, который создал бывший разработчик Gentoo - Henrik Brix Andersen. Учтите, что вам необходим cpufreqd-2.0.0 или более новая версия. Ранние версии используют другой синтаксис конфигурационного файла.

Листинг 3.4: /etc/cpufreqd.conf (cpufreqd-2.0.0 или более новый)
[General] pidfile=/var/run/cpufreqd.pid poll_interval=3 enable_plugins=acpi_ac, acpi_battery enable_remote=1 remote_group=wheel verbosity=5 [/General] [Profile] name=ondemand minfreq=0% maxfreq=100% policy=ondemand [/Profile] [Profile] name=conservative minfreq=0% maxfreq=100% policy=conservative [/Profile] [Profile] name=powersave minfreq=0% maxfreq=100% policy=powersave [/Profile] [Profile] name=performance minfreq=0% maxfreq=100% policy=performance [/Profile] [Rule] name=battery ac=off profile=conservative [/Rule] [Rule] name=battery_low ac=off battery_interval=0-10 profile=powersave [/Rule] [Rule] name=ac ac=on profile=ondemand [/Rule]

Теперь вы можете запустить демон cpufreqd. Добавьте его в уровни запуска default и battery.

Листинг 3.5: Запуск cpufreqd
# rc-update add cpufreqd default battery # rc

Иногда желательно установить политику отличную от той, что выбрал демон. Например, если заряд батареи низок, но вы знаете, что скоро появится питание от сети. В этом случае вы можете перевести cpufreqd в ручной режим с помощью команды cpufreqd-set manual и далее выбрать одну из сконфигурированных политик (они перечислены в cpufreqd-get). Выйти из ручного режима вы можете командой cpufreqd-set dynamic

Предупреждение: Не запускайте одновременно более одной программы, перечисленной выше. Это может привести к конфликтах таких, как постоянное переключение между двумя частотами.

Проверка результата

Осталось только проверить, что ваши новые политики работают правильно. Простой способ сделать это - следить за скоростью ЦП во время работы:

Листинг 3.6: Отслеживание скорости ЦП
# watch grep \"cpu MHz\" /proc/cpuinfo

Если /proc/cpuinfo не обновляется (см. Устранение неполадок), попробуйте sys-apps/x86info:

Листинг 3.7: Альтернативное отслеживание скорочти ЦП
# watch x86info -mhz

В зависимости от ваших настроек, частота должна возрастать при нагрузке, падать в спокойном состоянии, или оставаться на том же уровне. Если вы используете cpufreqd и уровень подробности (verbosity) равен 5 или больше в cpufreqd.conf, то вы можете найти дополнительную информацию о происходящем в syslog.

4. LCD Power Management

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

Настройки засыпания (standby)

В первую очередь необходимо проверить настройки засыпания(standby), остановки(suspend), выключения дисплея. Так как это сильно зависит от вашего оконного менеджера, то вам предстоит делать это самим. Только два замечания: погасить терминал можно командой setterm -blank <количество минут>, setterm -powersave on и setterm -powerdown <количество минут>. Для X.org, необходимо исправить в /etc/X11/xorg.conf следующее (или в /etc/X11/XF86Config для XFree86):

Листинг 4.1: Нвстройка засыпания дисплея в X.org и XFree86
Section "ServerLayout" Identifier [...] [...] Option "BlankTime" "5" # Погасить дисплей через 5 минут (Fake) Option "StandbyTime" "10" # Выключить дисплей через 10 минут (DPMS) Option "SuspendTime" "20" # Полная остановка через 20 минут Option "OffTime" "30" # Выключение через полчаса [...] EndSection [...] Section "Monitor" Identifier [...] Option "DPMS" "true" [...] EndSection

Уменьшение подсветки

Если вы можете управлять яркостью с помощью программы, напишите маленький скриптик, который уменьшает подвсветку и поместите его в ваш уровенб запуска batery. Следующий скрипт должен работать на большинстве ноутбуков IBM Thinkpad и Toshiba. Для ноутбуков IBM необходимо включить соответствуюший пункт в ядре, а владельцы Toshiba могут поставить sys-power/acpitool и пропустить настройку ibm_acpi, описанную ниже.

Предупреждение: Поддержка изменения яркости явлвляется экспериментальной для ibm-acpi, так как работает с оборудованием напрямуб и может серьёзно поредить его. Обратитесь к сайту ibm-acpi за подробностями.

Для поддержки изменения уровня яркости, модуль ibm_acpi должен быть запущен с параметром experimental.

Листинг 4.2: Настройка засыпания дисплея в X.org и XFree86
(Прочтите предупреждение выше, прежде чем делать это) # echo "options ibm_acpi experimental=1" >> /etc/modules.d/ibm_acpi # /sbin/update-modules # echo ibm_acpi >> /etc/modules.autoload.d/kernel-2.6 # modprobe ibm_acpi

Это должно выполниться без ошибок, а также должен появится файл /proc/acpi/ibm/brightness. Скрипт инийиализации будет принимать решение об уровне подсветки в зависимости от источника питания.

Листинг 4.3: /etc/conf.d/lcd-brightness
# См. допустимые значения в /proc/acpi/ibm/brightness # Пожалйста, прочтите /usr/src/linux/Documentation/ibm-acpi.txt # Уровень яркости при питании от сети. По умолчанию - 7. BRIGHTNESS_AC=7 # Уровень яркости при питании от батареи. По умолчанию - 4. BRIGHTNESS_BATTERY=4
Листинг 4.4: /etc/init.d/lcd-brightness
#!/sbin/runscript set_brightness() { if on_ac_power then LEVEL=${BRIGHTNESS_AC:-7} else LEVEL=${BRIGHTNESS_BATTERY:-4} fi if [ -f /proc/acpi/ibm/brightness ] then ebegin "Setting LCD brightness" echo "level ${LEVEL}" > /proc/acpi/ibm/brightness eend $? elif [[ -e /usr/bin/acpitool && -n $(acpitool -T | grep "LCD brightness") ]] then ebegin "Setting LCD brightness" acpitool -l $LEVEL >/dev/null || ewarn "Unable to set lcd brightness" eend $? else ewarn "Setting LCD brightness is not supported." ewarn "For IBM Thinkpads, check that ibm_acpi is loaded into the kernel" ewarn "For Toshiba laptops, you've got to install sys-power/acpitool" fi } start() { set_brightness } stop () { set_brightness }

Далее, убедитесь, что уровень яркости меняется автоматически, добавив скрипт в уровень запуска battery.

Листинг 4.5: Включаем автоматисеское изменение яркости
# chmod +x /etc/init.d/lcd-brightness # rc-update add lcd-brightness battery # rc

Управление питанием диска

Жёсткий диск потребляет меньше энергии во время спящего режима (sleep mode). Поэтому разумно активировать возможности сохранения энергии, когда жёсткий диск не используется некоторое время. Есть два различных способа сделать это. Первый, (laptop-mode) будет сберегать больше всего энергии за счёт предовращения или, по крайней мере, задержки записи на диск. Обратной стороной медали является повышенный риск потери данных при сбое питания или аварии ядра; чтобы уменьшить масштабы возможной аварии, убедитесь, что не запущенно часто пишущих на диск процессов. В качестве альтернативного, второго способа вы можете включить сохранение энергии на диске с помощью hdparm.

Увеличение времени покоя (idle time) - laptop-mode

Последния 2.6-ядра включают одноимённый laptop-mode. Когда он активирован, "грязные" буферы (dirty buffers) пишутся на диск при вызовах чтения (read calls) или после 10 минут (вместо 30 секунд). Это минимизирует время, которое тратится на раскручивание диска.

Листинг 5.1: Автоматический старт laptop-mode
# emerge laptop-mode-tools

Настройки пакета laptop-mode-tools хранятся в файле /etc/laptop-mode/laptop-mode.conf. Отредактируйте его на свой вкус - он отлично документирован. Выполните rc-update add laptop_mode battery, чтобы он запускался автоматически.

Последние версии (1.11 и позже) этого пакета включают полезный инструмент lm-profiler. Он следит за использованием диска и запущенными сетевыми сервисами и предлагает отключить ненужные. Вы можете отключить их как используя встроенную в laptop-mode-tools поддержку уровней запуска (которая будет переопределена /sbin/rc), так и через созданные вами уровни запуска default/battery (рекомендуется).

Листинг 5.2: Пример вывода lm-profiler
# lm-profiler Profiling session started. Time remaining: 600 seconds [4296896.602000] amarokapp Time remaining: 599 seconds [4296897.714000] sort [4296897.970000] mv Time remaining: 598 seconds Time remaining: 597 seconds [4296900.482000] reiserfs/0

После наблюдения за вашей системой в течении 10 минут, lm-profiler выведет список сервисов, которые могли вызвать обращения к диску за этот промежуток времени.

Листинг 5.3: lm-profiler преждагает отключить некотрые сервисы
Program: "atd" Reason: standard recommendation (program may not be running) Init script: /etc/init.d/atd (GUESSED) Do you want to disable this service in battery mode? [y/N]: n

Чтобы отключить atd, как предлагается в примере выше, выполните rc-update del atd battery. Будьте осторожны, не отключите жизенноважные сервисы - lm-profiler частенько выдает не совсем правильные данные. Не отключайте что-либо, если вы полностью не уверены в ненужности сервиса.

Ограничение доступа на запись

Если вы не хотите использовать laptop-mode, вы должны отключить часто пишущие на диск сервисы вручную - syslogd кандидат на выбывание, например. Возможно, вы не хотите выключать его полностью, тогда можно подправить конфиг так, чтобы писались только "необходимые вещи". Cups пишет на диск лишь время о времени, поэтому можно выключить его и включать вручную, когда необходимо.

Листинг 5.4: Выключение cups из уровня запуска battery
# rc-update del cupsd battery

Вы также может изспользовать lm-profiler из laptop-mode-tools (см. выше), чтобы найти неугодные сервисы. Если вы истребили их всех, то можно переходить к настройке hdparm.

hdparm

Вторая возможность - использование hdparm. Пропустите этот шаг, если вы используете laptop-mode. Иначе, откройте /etc/conf.d/hdparm и добавьте следующие строки для ваших жёстких дисков. Этот пример предполагает, что ваш диск именуется hda:

Листинг 5.5: Использование /etc/conf.d/hdparm для засыпания диска
hda_args="-q -S12"

Это включит управление питанием для вашего жесткого диска. Если вы когда-нибудь решите отключить управление питанием, то просто измените значение в /etc/conf.d/hdparm на -q -S0 или выполните hdparm -q -S0 /dev/hda.

Обратитесь к man haparm за другими опциями. Хотя вы всегда можете запускать haparm выручную командой /etc/init.d/hdparm start, намного проще автоматизировать её запуск и остановку. Чтобы сделать это, добавить hdparm в уровень запуска battery.

Листинг 5.6: Автоматизация засыпания диска
rc-update add hdparm battery

Внимание: Будьте осторожны с настройками засыпания/остановки (sleep/spin down) вашего жёсткого диска. Установление слишком низких значений может быстро "износить" ваш диск, что приведёт к потере гарантии. (Прим. пер.: вспомните историю про Ubuntu)

Другие "типы и трики"

Ещё один способ достижения светлой цели снижения энергопотребления состоит в отключении свопа (swap) в режиме питания от батареи. Перед тем, как писать переключатель swapon/swapoff, убедитесь, что у вас достаточно оперативной памяти и своп существенно не используется, иначе вы рискуете приобрести большие проблемы.

Если вы не хотите использовать laptop-mode, то можно уменьжить обращение к диску, монтируя некоторые директории как tmpfs - запись на такие разделы хранится не на диске, а в ОЗУ, и поэтому пропадает после отмонтирования. Зачастую удобно примонтировать /tmp таким образом, так как она в любом случае очищается при каждой перезгрузке. Правда, стоит убедиться, что у вас достаточно памяти и что нет программ (таких, как менеджеры закачек и архиваторы), которым требуется экстримально много места в /tmp. Чтобы сделать это, включите поддержку tmpfs в ядре и добавьте подобную следующей строку в /etc/fstab:

Листинг 5.7: Редактирование /etc/fstab, чтобы сделать /tmp более отрешённым от диска (volatile)
none /tmp tmpfs size=32m 0 0

Предупреждение: Обратите внимание на параметр (32 m), и подстройте его под вашу систему. Если вы не уверены, не пробуйте это вообще - это может сильно уменьшить производительность. Если вы хотите подмонтировать /var/log таким же образом, убедитесь, что файлы сохраняются на диск перед размонтированием. Они необходимы. Не пытайтесь примонтировать /var/tmp таким образом - он используется Portage при сборке пакетов

Управление питанием других устройств

Графические карты

Если у вас стоит карточка ATI с поддержкой PowerPlay (динамическое изменение частоты графического процессора), вы можете активировать эту возможность в X.org. Откройте /etc/X11/xorg.conf и добавьте (или включите) опцию DynamicClocks в секции Устройство (device). Учтите, что это может привести к падению на некоторых системах.

Листинг 6.1: Включение поддержки ATI PowerPlay в X.org
Section "Device" [...] Option "DynamicClocks" "on" EndSection

Управление питанием беспроводных соединений

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

Примечание: В скрипте предполагается, что ваш беспроводной интерфейс - wlan0. Если в вашей системе это не так, что просто замените его на своё.

Добавьте следующую строку в /etc/conf.d/net для автоматического включения управления питанием беспроводной карты:

Листинг 6.2: Автоматизированное управления питанием WLAN
iwconfig_wlan0="power on"

Обратитесь к man iwconfig за деталями и другими опциями такими, как интервалы между пробуждениями или настройки таймаута. Если ваш драйвер и точка доступа поддерживает изменение частоты сигналов, то из этого можно извлечь ещё больше сохранённой энергии.

Управление питанием USB

Есть две проблемы с потреблением энергии USB-устройствами. Во-первых, устройства такие, как USB мыши, цифровые камеры или флэшки потребляют энергию всё время, пока подключены, вы не можете избежать этого (кроме как отключая их, когда в них нет необходимости). Во-вторых, когда USD устройство подключено, контроллер USB хоста время от времени опрашивает шину, что не даёт CPU уйти в спящий режим. Ядро предоставляет экспериментальную опцию для включение приостановления (suspend) для USB устройств подсредством вызова драйвера или одного из файлов power/state в /sys.

Листинг 6.3: Включение поддержки приостановления (suspend) USB в ядре
Device Drivers USB support [*] Support for Host-side USB [*] USB selective suspend/resume and wakeup (EXPERIMENTAL)

7. Состояния спячки: sleep, standby, suspend to disk

Примечание переводчика: данный раздел существенно устарел. Более свежую информацию можно найти на gentoo-wiki.com (EN). Также в русской есть короткий пересказ: gentoo-wiki.com.

ACPI определяет несколько состояний спячки. Основные три из них:

  • S1 aka Standby
  • S3 aka Suspend to RAM aka Sleep
  • S4 aka Suspend to Disk aka Hibernate

Они могут вызываться в моменты, когда компьютер не используется, но выключение не желательно из-за долгой загрузки

Sleep (S3)

Поддержка ACPI для этих состояний спячки помечена экспериментальной, и для этого есть достаточно оснований. Возможно, состояния спячки в APM (Advanced Power Management) несколько более стабильны, но использовать APM и ACPI одновреммено нельзя.

Листинг 7.1: Конфигурация ядра для включений состояний спички
Power Management Options ---> [*] ACPI( Advanced Configuration and Power Interface ) Support ---> [*] Sleep States

Когда ядро настроено, вы можете воспользоваться скриптом hibernate-script, чтобы активировать suspend или sleep. Для начала его надо установить.

Листинг 7.2: Установка hibernate-script
# emerge hibernate-script

Необходимо некоторые настройки в /etc/hibernate. По умолчанию пакет предоставляет несколько конфирационных файлов для каждого состояния спячки. Общие настройки помещены в common.conf; убедитесь, что этот файл правильно сконфигурирован для вашей системы.

Чтобы настроить sleep, отредактируйте sysfs-ram.conf в /etc/hibernate. Опция UseSysfsPowerState mem уже выставлена правильно, но если вы хотите произвести дальнейшие настройки в этом или любом другом состоянии спячки, то не забудьте добавить их в /etc/hibernate/hibernate.conf. Комментарии и названия опций помогут вам разобраться. Если вы используете nfs или сетевые ресурсы самбы (samba shares over the network), то необходимо завершать соответствующие скрипты инициализации, чтобы избежать таймаутов (timeouts).

Примечание: Дополнительную информацию о состояниях спячки см. в man hibernate.conf

Готовы? У вас остался последний шанс сделать бэкап данных прежде, чем заупустить следующую команду. Обратите внимание, что вам возможно потребуется нажать специальную клавишу такую, как Fn, чтобы вернутся из спячки.

Листинг 7.3: Засыпание
# hibernate-ram

Если вы всё ещё читаете, то, видимо, всё работает. Вы можете таким же образом настроить standby (S1), подредактировав sysfs-ram.conf и изменив UseSysfsPowerState mem на UseSysfsPowerState standby. Режимы S3 и S4 более интресны, посколько сохраняют больше энергии.

Hibernate (S4)

Эта секция посвящена hibernation. В этом режиме снимок (snapshot) работающей системы записывается на диск, перед выключением. При включении, снимок загружается и вы можете продолжать работы с момент выключения.

Предупреждение: Не заменяйте устройства не поддерживающие горячую замены во время остановки. Не пытайтесь загрузить снимок на другой машине. Отключите все сетевые ФС и клиенты/серверы самбы перед засыпанием.

Существуют две различных реализации S4. Оригинальная - swsusp, и более новая tuxonice с более приятным интерфейсом (с поддержкой fbsplash). Сравнение их возможностей вы можете найти на домашней странице tuxonice. There used to be Suspend-to-Disk (pmdisk), a fork of swsusp, but it has been merged back.

TuxOnIce пока не включен в основную ветку ядра (mainline kernel), поэтому вам либо надо пропатчить ядро (патчи можно найти на tuxonice.net), либо использовать sys-kernel/tuxonice-sources.

Настройки ядра и для swsusp и для TuxOnIce следующие:

Листинг 7.4: Настройки ядра для hibernate
Power Management Options ---> (hibernate с помощью swsusp) [*] Software Suspend (замените /dev/SWAP на ваш своп-раздел) (/dev/SWAP) Default resume partition (hibernate with TuxOnIce) Enhanced Hibernation (TuxOnIce) --- Image Storage (you need at least one writer) [*] File Writer [*] Swap Writer --- General Options [*] LZF image compression (замените /dev/SWAP на ваш своп-раздел) (swap:/dev/SWAP) Default resume device name [ ] Allow Keep Image Mode

Настройка swsusp много проще. Если вы не вписали имя своп-раздела в настройках ядра, вы должны передать его как параметр в директиве resume=/dev/SWAP. Если загрузка невозможна из-за сломанного образа, воспользуйтесь параметром noresume. Скрипт инициализации hibernate-cleanup чистит (invalidates) образы swsusp во время загрузки.

Листинг 7.5: Чистка образов swsusp во время загрузки
# rc-update add hibernate-cleanup boot

Для активации swsusp, используйте hibernate script, установив UseSysfsPowerState disk в /etc/hibernate/sysfs-disk.

Предупреждение: Сделайте резервную копию данных перед остановкой. Запустите sync, чтобы записать на диск всю кэшированную информацию. Вначале, попробуйте сделать это без иксов, потом в иксах, но не логинясь.

Если вы наталкиваетесь на панику ядра (kernel panic) из-за uhci или подобного, попробуйте скомпилировать поддержку usb модулем и выгрузить модули из памяти перед остановкой. Соответсвуюшуя опция есть в common.conf.

Листинг 7.6: Засыпание посредством swsusp
# nano -w /etc/hibernate/common.conf (Час X - вы сделали резерную копию?) # hibernate

В следующей секции обсуждается установка TunOnIce, включая поддержку fbsplash для симпатичного графического индикатора прогресса во время засыпания и просыпания.

Первая часть конфигурации похожа на настройку swsusp. Если вы не вписали имя своп-раздела в настройках ядра, вы должны передать его как параметр в директиве resume=swap:/dev/SWAP. Если загрузка невозможна из-за сломанного образа, воспользуйтесь параметром noresume. Скрипт инициализации hibernate-cleanup чистит (invalidates) образы TuxOnIce во время загрузки.

Листинг 7.7: Чистка образов TuxOnIce во время загрузки
# rc-update add hibernate-cleanup boot

Теперь, отредактируйте /etc/hibernate/suspend2.conf, включите опцию TuxOnIce. Не включайте fbsplash в common.conf пока.

Листинг 7.8: Засыпание посредством TuxOnIce
# nano -w /etc/hibernate/suspend2.conf (Час X - вы сделали резерную копию?) # hibernate

Настройте fbsplash, если вы не сделали этого ранее. Чтобы задействовать поддержку fbsplash во время засыпания, необходимо поставить пакет sys-apps/tuxonice-userui. Также, вам необхожимо утсановить USE-флаг fbsplash.

Листинг 7.9: Установка tuxonice-userui
# echo "sys-apps/tuxonice-userui fbsplash" >> /etc/portage/package.use (Оно может быть маскрирована ~arch, так что вначале надо добавить его в keywords) # echo "sys-apps/tuxonice-userui" >> /etc/portage/package.keywords # emerge tuxonice-userui

Ебилд попросит вас создать символическую ссылку на тему, которю вы хотите использовать. Например, чтобы использовать тему livecd-2005.1, выполните следующую команду:

Листинг 7.10: Использование темы livecd-2005.1 во время засыпания
# ln -sfn /etc/splash/livecd-2005.1 /etc/splash/suspend2

Если вы не хотите видеть чёрный экран в первой части процесса пробуждения, добавьте tuxoniceui_fbsplash в ваш образ initrd. Если ваш образ initrd называется splash_geninitramfs и он сохранён в /boot/fbsplash-emergence-1024x768, то вам необходимо сделать буквально следующее:

Листинг 7.11: Добавление tuxoniceui_fbsplash в образ initrd.
# mount /boot # mkdir ~/initrd.d # cp /boot/fbsplash-emergence-1024x768 ~/initrd.d/ # cd ~/initrd.d # gunzip -c fbsplash-emergence-1024x768 | cpio -idm --quiet -H newc # rm fbsplash-emergence-1024x768 # cp /usr/sbin/tuxoniceui_fbsplash sbin/ # find . | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/fbsplash-tuxonice-emergence-1024x768

Далее, отрихтуйте ваш grub.conf (или lilo.conf), чтоб при загрузке вашего ядра грузился обрах /boot/fbsplash-tuxonice-emergence-1024x768. Вы теперь можете попробовать холостой прогон, чтоб убедиться, что всё работает правильно.

Листинг 7.12: Тестовый запус fbsplash hibernation
# tuxoniceui_fbsplash -t

Наконец, откройте /etc/hibernate/common.conf и включите подержку fbsplash. Запустите hibernate и наслаждайтесь!

Устранение неполадок

В: Я пытаюсь изменить частоту ЦПУ, но /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor не существует.
О: Убедитесь, что ваш процессор поддерживает изменение частоты и выберите правильный CPUFreq драйвер для вашего процессора. Список процессоров, поддерживающих изменение частоты (ядро 2.6.7): ARM Integrator, ARM-SA1100, ARM-SA1110, AMD Elan - SC400, SC410, AMD mobile K6-2+, AMD mobile K6-3+, AMD mobile Duron, AMD mobile Athlon, AMD Opteron, AMD Athlon 64, Cyrix Media GXm, Intel mobile PIII и Intel mobile PIII-M на определённых чипсетах, Intel Pentium 4, Intel Xeon, Intel Pentium M (Centrino), National Semiconductors Geode GX, Transmeta Crusoe, VIA Cyrix 3 / C3, UltraSPARC-III, SuperH SH-3, SH-4, некоторые "PowerBook" и "iBook2" и различные процессоры на совместимых с ACPI 2.0 системах (только если "ACPI Processor Performance States" доступно через интерфейс ACPI/BIOS).
В: Мой ноутбук поддерживает изменение частоты, но директория /sys/devices/system/cpu/cpu0/cpufreq/ пуста.
Поищите связанные с ACPI ошибки в dmesg | grep ACPI. Попробуйте обновить BIOS, особенно, если обнаружены проблемы в DSDT. Вы также можете попробовать исправить это самостоятельно (что выходит за рамки этого руководства).
В: Мой ноутбук поддерживает изменение частоты, но согласно /proc/cpuinfo частота никогда не изменяется.
О: Возможно, вы включили поддержку симметричной мультипроцессорной обработки (symmetric multiprocessing support) (CONFIG_SMP) в вашем ядре. Попробуйте отключить её, всё должно заработать. Также это может быть багом старях ядер. В таком случае выполните emerge x86info, обновите ваше ядро как требуется и проверьте текущую частоту через x86info -mhz.
В: Я могу изменять частоты, но выбор не так широк, как на другой ОС.
О: Вы можете совместить изменение частоты с "торможением" через ACPI (ACPI throttling), чтобы добиться более низких частот. Но стоит понимать, что это не даст большого прироста в сохранении энергии и создана, по большой части, для температурного регулирования (чтобы ноутбук был холожным и тихим). Вы можете просмотреть текущее состояние "торможения" командой cat /proc/acpi/processor/CPU/throttling и изменить его, выполнив echo -n "0:x" > /proc/acpi/processor/CPU/limit, где x - одно из возможных состояний, перечисленны в /proc/acpi/processor/CPU/throttling.
В: При конфигурировании ядра пункты powersave governor, performance governor и userspace governor есть, а ondemand governor отсутствует. В чём проблема?
О: Пункт ondemand governor появился только в последних версиях ядра. Попробуйте обновить его.
В: Время жизни от батареи стало меньше, чем было.
О: Проверьте настройки BIOS. Возможно, вы забыли заново включить какие-то опции.
В: Моя батарея заряжена, но КДЕ сообщает, что осталось 0%, и тут же выключается.
О: Убедитесь, что поддержка батареи выключена в вашем ядре. Если она скомпилированна модулем, то не забудьте загрузить его.
В: Моя система журналирования (system logger) пишет что-то, типа "logger: ACPI group battery / action battery is not defined".
О: Это сообщение генерирует скрипт /etc/acpi/default.sh, которые прилагается к acpid. Вы можете просто игнорировать его. Если же вы всё-таки хотите его унять, закомментируйте соответсвующую строку в /etc/acpi/default.sh как показано ниже:
Листинг 8.1: Отключение предупреждения о событиях ACPI
*) # logger "ACPI action $action is not defined"
В: У меня Dell Inspiron 51XX, и я не получаю никаких ACPI-событий
О: Скорее всего, это баг ядра. Прочтите это.
В: Я включил DynamicClocks в xorg.conf и теперь X.org рушится / экран остаётся чёрным / мой ноутбук не выключается корректно.
О: Такое бывает на некоторых системах. Вам придётся отключить DynamicClocks.
В: Я хочу использовать TuxOnIce, но он говорит, что моя своп - партиция слишком маленькая. Изменение её размеров - не вариант.
О: Если в вашей системе достаточно свободного места, то вы можете использовать запись в файл, вместо запись в своп. Такой вариант поддерживается hibernate-script. Дополнительную информацию вы можете найти в /usr/src/linux/Documentation/power/tuxonice.txt.
В: Я только купил новую фирмешную батарею, но она кончается за несколько минут. Что я делаю не так?
О: Для начала, следуйте инструкция производителя, как зарядить батарею правильно.
В: Вышенаписанное не помогло, что делать теперь?
О: Некоторые батареи продаются как "новые", но на самом деле уже не новы. Попробуйте следующее:
Листинг 8.2: Запрос сотояния батареи
$ grep capacity /proc/acpi/battery/BAT0/info design capacity: 47520 mWh last full capacity: 41830 mWh
Если "last full capacity" кардинально отличается от design capacity, ваше батарея, скорее всего, неисправна. Попробуйте потребовать гарантию.
В: Моя проблема не перечислена выше. Что мне делать теперь?
О: Не бойтесь связаться со мной, Dennis Nienhüser, напрямую. Также вам, наверняка, помогут на Формах Gentoo. Если вы предпочитается IRC, заходите в канал #gentoo-laptop на irc.freenode.net

Замечания к переводу
Не удалось найти хороший перевод слову governor. Хороший означает, что оно не слишком общо (как, например, драйвер), ну и подходит по смыслу ;) . Поэтому в тексте используется слово властелин, фомально подходящее под условия, но слишком уж не формальное.