четверг, 24 ноября 2011 г.

Настройка квот в Dovecot и Postfix с хранением счётчиков и правил в словаре MySQL

Уже третий день подряд мучился с настройкой квот в Dovecot прямо на работающем сервере. Мучился очень аккуратно и имея в запасе бэкапы рабочих конфигураций на начало каждого дня.

Хранение счётчиков квот в MySQL настроил быстро, формирование правил квот по данным из MySQL тоже настроил быстро. Однако после настройки текущие значения счётчиков квот становились отрицательными и со временем только уменьшались. Я сразу подумал, что POP3-сервер обновляет счётчики квот, т.к. его задача лишь забирать почту из ящика, а вот LDA (агент локальной доставки) - не обновляет, т.к. именно он кладёт почту в ящики и должен увеличивать значения счётчиков.

В конечном итоге оказалось, что вместо LDA delivery из Dovecot по-прежнему используется LDA virtual из Postfix. Произошло это потому что действие настройки virtual_transport = dovecot перекрывается настройкой transport_maps = mysql:/etc/postfix/sql/transport.cf, где для тестируемого домена был настроен транспорт virtual. Здесь можно поблагодарить Вьетце Венема за отличную документацию - это я прочитал прямо в man 5 postconf. Dovecot практически не документирован, а вики-страницы с Howto по настройке различных фишек Dovecot за документацию я не считаю.

После исправления значения транспорта в базе данных возникло ещё несколько проблем:
1. В настройках LDA Dovecot не был указан параметр postmaster_address,
2. Не был настроен сокет /var/run/dovecot/auth-master,
3. Имена каталогов, в которые LDA delivery из Dovecot складывал почту, были строчными, а имена существующих каталогов почтовых ящиков, в которые складывал почту LDA virtual из Postfix, содержали символы в разном регистре.

Проблемы решались следующим образом:
1. Указан параметр postmaster_address,
2. Прописана секция master в секции socket listen из секции auth default,
3.1. Добавлены буквы L в настройке mail_location, которые указывают принудительно использовать нижний регистр для каталогов почтовых ящиков.
3.2. Использована команда rename 'y/A-Z/a-z/' * для того, чтобы переименовать каталоги почтовых ящиков. Некоторые каталоги, из которых уже успели попробовать забрать почту, пришлось обрабатывать вручную - нужно было перенести письма из старых каталогов в новые, а старые затем удалить.

Итоговые конфигурационные файлы Dovecot помещаю сюда, чтобы в следующий раз не наступать на те же грабли:
protocols = pop3
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/var/mail/virtual/%Ld/%Ln
first_valid_uid = 999
first_valid_gid = 999

dict {
  quotadict = mysql:/etc/dovecot/dovecot-dict-mysql.conf
}
plugin {
  quota = dict:user::proxy::quotadict
  # Квота по умолчанию - объём ящика 1 гигабайт,
  # не более 1000 писем в ящике
  # Эта квота заменяется квотой, найденной в БД
  quota_rule = *:storage=1G:messages=1000
}
protocol pop3 {
  mail_plugins = quota
  mail_executable = /etc/dovecot/pop-update-lastlog.sh
}
protocol lda {
  # Ящик администратора почтовой системы
  postmaster_address = postadmin@domain.tld
  mail_plugins = quota
}

# Домен по умолчанию для пользователей, пытающихся
# аутентифицироваться в Dovecot без указания домена
auth_default_realm = domain.tld

auth default {
  mechanisms = plain login
  passdb sql {
    args = /etc/dovecot/dovecot-mysql.conf
  }
  userdb sql {
    args = /etc/dovecot/dovecot-mysql.conf
  }
  socket listen {
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
    master {
      path = /var/run/dovecot/auth-master
      mode = 0660
      user = vmail
      group = vmail
    }
  }
}
Уже знакомый скрипт /etc/dovecot/pop-before-smtp.sh для аутентификации POP before SMTP:
#!/bin/sh

mysql -uuser -ppassword -h127.0.0.1 mail <<END
UPDATE users SET lasttime = NOW(), lastip='$IP' WHERE login = '$USER';
END
exec /usr/lib/dovecot/pop3 "$@"
Файл настроек для хранения счётчиков квот в БД MySQL /etc/dovecot/dovecot-dict-mysq.conf:
connect = host=127.0.0.1 dbname=mail user=user password=password
map {
  pattern = priv/quota/storage
  table = users
  username_field = login
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = users
  username_field = login
  value_field = messages
}
Файл настроек для проверки учётных данных пользователя и его квот по таблице в БД MySQL /etc/dovecot/dovecot-mysql.conf:
driver = mysql
connect = host=127.0.0.1 dbname=mail user=user password=password
default_pass_scheme = CRYPT
password_query = SELECT password \
                 FROM users \
                 WHERE login = '%u'
user_query = SELECT CONCAT(SUBSTRING_INDEX(login, '@', -1), '/', SUBSTRING_INDEX(login, '@', 1), '/'), \
                    999 AS uid, \
                    999 AS gid, \
                    CONCAT('*:bytes=', max_bytes, ':messages=', max_messages) AS quota_rule \
             FROM users \
             WHERE login = '%u'
В настройки postfix добавлен LDA delivery из Dovecot, в файл /etc/postfix/master.cf добавлены две строчки:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
Столбцы со счётчиками и со значениями квот для пользователей добавлены с помощью четырёх SQL-запросов:
ALTER TABLE users ADD COLUMN bytes bigint default 0;
ALTER TABLE users ADD COLUMN messages integer default 0;
ALTER TABLE users ADD COLUMN max_bytes bigint default 1073741824;
ALTER TABLE users ADD COLUMN max_messages bigint default 1000;
Значения квот по умолчанию можете поменять на свои. Я поставил ограничения в 1 гигабайт на общий объём ящика и не более 1000 писем в одном почтовом ящике.

В таком виде Dovecot не будет принимать от Postfix письма для адресатов, превысивших квоту. Но такие письма будут просто попадать в очередь отложенных писем Postfix. Нужно же, чтобы письмо не занимало дисковое пространство ни в почтовом ящике получателя, ни в очереди отложенных писем, а отклонялось сразу же с соответствующим сообщением отправителю о том, что адресат превысил квоту.

Для этого нужно настроить проверку квот при приёме почты самим Postfix'ом. Для этого воспользуемся правилом check_recipient_access mysql:/etc/postfix/sql/quotas.cf, которое нужно поместить в том числе до правил permit_mynetworks и permit_sasl_authenticated. Если поместить его после этих двух проверок, то квоты получателя просто не будут проверяться, если отправитель аутентифицировался на почтовом сервере или он отправляет почту из доверенной сети.

Файл /etc/postfix/sql/quotas.cf для проверки квоты получателя:
user = user
password = password
dbname = mail
hosts = 127.0.0.1
query = SELECT '452 Mailbox is over quota'
        FROM users
        WHERE login = '%s'
          AND ((bytes >= max_bytes AND max_bytes > 0)
            OR (messages >= max_messages AND max_messages > 0))
О расширенных статусах REJECT я прочитал в man 5 access, а подходящий код статуса подобрал в RFC2821 на этой странице: http://tools.ietf.org/html/rfc2821.

В случае если квота по объёму или по количеству сообщений равна нулю, то этот SQL-запрос такую квоту не проверяет. Таким образом значения 0 в полях max_bytes или max_messages означают, что ограничение по этому параметру не действует.

При попытке отправить письмо на ящик, превысивший квоту, Outlook Express сообщает следующее:
Не удается отправить сообщение, поскольку сервер отказался принять адрес одного из получателей. В письме был указан адрес: 'user@domain.tld'. Тема 'test1', Учетная запись: 'mail', Сервер: 'domain.tld', Протокол: SMTP, Ответ сервера: '452 4.7.1 <user@domain.tld>: Recipient address rejected: Mailbox is over quota', Порт: 25, Защита (SSL): Нет, Ошибка сервера: 452, Код ошибки: 0x800CCC79

четверг, 17 ноября 2011 г.

Обновление времени последнего входа пользователя dovecot и авторизация POP before SMTP

Захотел сделать так, чтобы Dovecot, при подключении пользователя по протоколу POP3, отмечал в базе данных текущее время. Нужно это для того, чтобы определить, какими ящиками давно не пользуются. Нашёл такую вот страницу в wiki Dovecot: http://wiki.dovecot.org/PostLoginScripting.

Для начала нужно узнать текущее значение mail_executable. Для этого воспользуемся командой:
# dovecot -a | grep mail_executable
У меня это значение равно /usr/lib/dovecot/pop3. Именно это значение мы и заменим, так чтобы наш скрипт вызывался до этой программы, обновлял информацию в базе данных, а затем запускал первоначальную программу.

Скрипт /etc/dovecot/pop-update-lastlog.sh, обновляющий информацию в базе данных:
#!/bin/sh

mysql -uuser -ppassword -h127.0.0.1 mail <<END
UPDATE users SET lasttime = NOW(), lastip='$IP' WHERE login = '$USER';
END
exec /usr/lib/dovecot/pop3 "$@"
Установил на него права доступа чтобы простые пользователи не смогли узнать пароль от базы данных и чтобы этот скрипт мог выполняться:
# chmod +x,o= pop-update-lastlog.sh
Затем этот скрипт я прописал в /etc/dovecot.conf:
protocol pop3 {
  mail_executable = /etc/dovecot/pop-update-lastlog.sh
}
Затем добавил пару столбцов в базу данных (структура базы данных - самодельная, не взята от какого-либо веб-интерфейса администрирования):
$ mail -uuser -ppassword mail <<END
ALTER TABLE users ADD COLUMN lasttime datetime DEFAULT '1900-01-01 00:00:00';
ALTER TABLE users ADD COLUMN lastip varchar(32) DEFAULT '0.0.0.0';
END
И перезапустил dovecot:
# /etc/init.d/dovecot restart
В базе данных начали появляться отметки о времени последнего входа и об IP-адресе клиента, с которого входили последний раз.

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

Дополнение от 18 ноября 2011 года. Информацию из таблиц можно использовать для авторизации POP before SMTP в Postfix (перед отправкой почты по SMTP нужно авторизоваться на POP-сервере).

В /etc/postfix/main.cf можно прописать следующее:
mynetworks = 127.0.0.1/8, mysql:/etc/postfix/sql/pop-before-smtp.cf
А в файле /etc/postfix/sql/pop-before-smtp.cf указать запрос и параметры подключения к базе данных:
user = user
password = password
dbname = mail
hosts = 127.0.0.1
query = SELECT DISTINCT lastip
        FROM users
        WHERE lastip = '%s'
          AND ADDTIME(lasttime, '0:1:0') > NOW()
Запрос возвращает IP-адрес только в том случае, если этот IP-адрес аутентифицировался на POP-сервере в течение последней минуты. В случае, если этот IP-адрес в течение последней минуты аутентифицировался на нескольких учётных записях POP-сервера, то возвращается только один IP-адрес.

Не забудьте защитить прописанные в файле пароли доступа к базе данных почтового сервера от обычных пользователей:
# chmod o= pop-before-smtp.cf
Попробовал - POP before SMTP действительно работает. Если с момента последнего подключения к POP серверу прошло не больше минуты, то почта отправляется. Если больше или ровно минута - то почта уже не уходит. Получилось такое вот, на мой взгляд, довольно изящное решение.

пятница, 11 ноября 2011 г.

Перенос Windows XP на другой диск средствами Linux

Для начала хочу предупредить, что это не точная инструкция как и что делать. Это описание ключевых моментов, для правильного применения которых нужно ещё приложить собственную голову. Если вы не уверены в своих силах, то лучше воспользуйтесь специализированными программами (Acronis True Image или Norton Ghost), а не этим способом, который описывает только средства из Linux.

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

У меня стоит загрузчик GRUB2, но почему-то не стояло очень важного компонента - os-prober. Он умеет при подсовывании ему дискового раздела определять, что за операционная система там стоит. Его наличие позволит упростить настройку GRUB2. Также, поскольку мы будем переносить систему Windows XP с раздела NTFS на раздел NTFS, нам потребуется пакет ntfsprogs. Ну и если у вас ещё нет раздела на диске, в который вы хотите перенести Windows, вам могут потребоваться fdisk и/или parted. Полезным может оказаться и модуль ntfs-3g для монтирования NTFS-раздела в режиме записи.
# apt-get install os-prober ntfsprogs hexedit
Останавливаться на создании раздела для Windows я не стану, т.к. это дело тривиальное и, на мой взгляд, не требующее объяснений.

Первым делом скопируем NTFS-раздел. Делается это командой ntfsclone:
# ntfsclone --overwrite /dev/sdb3 /dev/sda1
/dev/sda1 - это исходный раздел с Windows,
/dev/sdb3 - это целевой раздел, на который мы переносим систему.
БУДЬТЕ ВНИМАТЕЛЬНЫ, ничего не перепутайте! Посмотреть, какие разделы есть на дисках, можно с помощью команды:
# fdisk -l
Если возникают сомнения, смонтируйте разделы и убедитесь в том, что вы точно знаете, с какого на какой раздел нужно перенести систему. У меня таких проблем не было, т.к. диска было всего два, на одном из дисков было аж 6 разделов, а на другом - только 1, поэтому перепутать их было трудно.

После клонирования мы получим раздел в точности повторяющий исходный. Ловушка заключается в том, что загрузчик Windows, располагающийся в начале раздела (NTFS Boot Record), содержит в себе информацию о геометрии диска, положении раздела и о серийном номере этого раздела.

На данном этапе мне помогла статья Relocating Windows to a new Hard Drive, в которой есть ссылка на исходный текст простенькой программы, которая исправляет загрузчик NTFS так, чтобы он узнал о новой геометрии диска. Эту программу я на всякий случай скопировал себе и разместил тут: ntfsreloc.c

Соберём её (для этого может потребоваться установить компилятор языка Си, который у меня уже стоял, т.к. я иногда на нём пишу сам):
$ gcc -o ntfsreloc ntfsreloc.c
Теперь её нужно запустить:
# ntfsreloc -w -p /dev/sdb3
Затем нужно смонтировать диск и исправить в файле boot.ini в корневом каталоге номер раздела, с которого будет грузиться Windows. Раньше у меня это был раздел №1, а теперь - №3.
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(3)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(3)\WINDOWS="Microsoft Windows XP Professional RU" /noexecute=optin /fastdetect
Теперь нужно исправить карту дисков GRUB, которая находится в файле /boot/grub/device.map:
(fd0)   /dev/fd0
(hd0)   /dev/disk/by-id/ata-WDC_WD10EADS-65L5B1_WD-WCAU4A888959
(hd1)   /dev/disk/by-id/ata-ST34313A_6CR0J30R
Диском (hd0) должен быть тот, на который мы переносим систему. Или можно исправить номер диска в файле boot.ini Windows, так чтобы номер загрузочного диска совпадал с номером диска в device.map. Полезно также перед этим настроить привязку дисков в /etc/fstab к UUID раздела или к метке раздела, чтобы в случае путаницы с номерами дисков Linux всё-таки загрузился. Практически во всех современных системах Linux это уже так, т.к. с заменой драйвера IDE на унифицированный драйвер дисков, номер, под которым определится диск, стал непредсказуем.

Дальше нужно обновить конфигурацию GRUB2:
# update-grub
И можно перезагружаться. При первой загрузке нам потребуются оба диска, т.к. в реестре Windows сохранилась привязка к идентификатору прежнего диска. После загрузки системы запускаем regedit и редактируем раздел HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices. В нём нужно поменять буквы дисков C и того, который по содержимому идентичен диску C. У меня это были диски C и D. Сделал я это в три приёма:
C -> Z
D -> C
Z -> D
После этого завершаем работу, отключаем старый диск и пробуем загрузиться снова. Если всё было сделано правильно, система загрузится с нового диска.

Я таким образом смог отключить противно свистящий старый диск, на котором у меня стоял Windows XP. Сама эта заметка является, по сути, продолжением предыдущей: Настройка fancontrol - демона управления вентиляторами компьютера.

Желаю вам удачного переноса Windows!

P.S. 21 декабря 2013 года. Вместо программы ntfsreloc можно воспользоваться программой partclone.ntfsfixboot из пакета partclone. В этом случае вместо команды
# ntfsreloc -w -p /dev/sdb3
можно воспользоваться командой
# partclone.ntfsfixboot -w /dev/sdb3

Настройка fancontrol - демона управления вентиляторами компьютера

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

Шум хоть и стал меньше, меня он всё равно не устроил. Компьютер и, соответственно, корпус у меня 2006 года, поэтому что-либо совсем уж тихое найти было сложновато. Опытным путём было выяснено, что больше всего шума даёт корпусной вентилятор (для этого достаточно на секунду остановить все вентиляторы поочерёдно пальцем или другим подходящим предметом). Поскольку на вентиляторе имелся не только стандартный 3-контактный разъём, но и разъём Molex, нашлось простое решение - перекинуть контакты, так чтобы снизилось питающее вентилятор напряжение. Подробнее это можно увидеть в разделе "Подключение вентиляторов" из статьи "Конструируем систему охлаждения компьютера". Жёлтый провод я всё-же воткнул в 3-контактный разъём на положенное место, дабы следить за скоростью вращения вентилятора, о чем будет написано чуть ниже.

Вторым кандидатом на настройку стал вентилятор процессора. В BIOS я узнал, что моя материнская плата поддерживает функцию PWM - управление скоростью вращения вентилятора в зависимости от показаний температурного датчика. Простейшее трёхскоростное управление я настроил прямо из BIOS, и если оно вас устроит, то нужды настраивать fancontrol в принципе нет. Меня эти три режима не устроили, захотелось более плавного разгона вентилятора по мере нагревания процессора.

Поскольку я пользуюсь Linux (Debian 6), то и настраивать управление будем в нём.

Первым делом, установим пакет для слежения за сенсорами и запустим обнаружение сенсоров:
# apt-get install lm-sensors
# sensors-detect
Отвечаем на все вопросы буквой y. Это важно, т.к. на один из вопросов ответ по умолчанию - n. Без этого пункта у меня не находились сенсоры материнской платы.
Now follows a summary of the probes I have just done.
Just press ENTER to continue: 

Driver `it87':
* ISA bus, address 0x290
Chip `ITE IT8712F Super IO Sensors' (confidence: 9)

Driver `k8temp' (autoloaded):
* Chip `AMD K8 thermal sensors' (confidence: 9)

To load everything that is needed, add this to /etc/modules:
#----cut here----
# Chip drivers
it87
#----cut here----
If you have some drivers built into your kernel, the list above will
contain too many modules. Skip the appropriate ones!
Теперь можно заглянуть в /etc/modules и проверить, появились ли там новые модули, добавленные sensors-detect.

Чтобы не перезагружать систему, загрузим эти модули вручную. У меня был добавлен модуль it87, поэтому я подгружаю его:
# modprobe it87
Теперь можно посмотреть информацию, предоставляемую сенсорами:
$ sensors

k8temp-pci-00c3
Adapter: PCI adapter
Core0 Temp:  +32.0°C                                    

it8712-isa-0290
Adapter: ISA adapter
in0:         +1.07 V  (min =  +0.00 V, max =  +4.08 V)   
in1:         +2.58 V  (min =  +0.00 V, max =  +4.08 V)   
in2:         +3.33 V  (min =  +0.00 V, max =  +4.08 V)   
in3:         +2.21 V  (min =  +0.00 V, max =  +4.08 V)   
in4:         +3.02 V  (min =  +0.00 V, max =  +4.08 V)   
in5:         +1.76 V  (min =  +0.00 V, max =  +4.08 V)   
in6:         +2.00 V  (min =  +0.00 V, max =  +4.08 V)   
in7:         +2.35 V  (min =  +0.00 V, max =  +4.08 V)   
Vbat:        +4.08 V
fan1:          0 RPM  (min =    0 RPM, div = 8)
fan3:       1670 RPM  (min =    0 RPM, div = 8)
temp1:       +25.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
temp2:       +29.0°C  (low  = +127.0°C, high = +60.0°C)  sensor = thermistor
temp3:       +70.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
cpu0_vid:   +1.100 V
У меня есть сенсоры температуры на процессоре и на материнской плате (не знаю, в каких именно местах).

Теперь установим пакет для управления скоростью вращения вентиляторов.
# apt-get install fancontrol
И запустим программу для автоматизированной настройки fancontrol:
# pwmconfig
Программа сразу после запуска сообщает информацию об обнаруженных ею сенсорах температуры, устройствах управления вентиляторами и сенсорах скорости вращения вентиляторов:
Found the following devices:
hwmon0/device is k8temp
hwmon1/device is it8712

Found the following PWM controls:
hwmon1/device/pwm1
hwmon1/device/pwm2
hwmon1/device/pwm3

Giving the fans some time to reach full speed...
Found the following fan sensors:
hwmon1/device/fan1_input     current speed: 2556 RPM
hwmon1/device/fan3_input     current speed: 1654 RPM
Лучше всего сразу куда-нибудь скопировать эту информацию, чтобы понимать, что за устройства программа имеет в виду, когда спрашивает вас о чём-то. Например, для меня было важно, что hwmon0/device - это процессор, а hwmon1/device - это материнская плата.

Дальше программа по очереди пытается остановить каждый из вентиляторов и пытается по сенсорам вращения вентиляторов установить соответствие между устройством управления скоростью вращения вентилятора и связанным с ним сенсором.

У меня было обнаружено только одно соответствие:
Testing pwm control hwmon1/device/pwm1 ...
hwmon1/device/fan1_input ... speed was 2556 now 0
It appears that fan hwmon1/device/fan1_input
is controlled by pwm hwmon1/device/pwm1
После этого программа предложила составить таблицу соответствия между значениями управляющего байта (от 0 до 255) и скоростью вращения вентилятора:
Would you like to generate a detailed correlation (y)?
Я ответил утвердительно.
PWM 255 FAN 2596
PWM 240 FAN 2596
PWM 225 FAN 2556
PWM 210 FAN 2556
PWM 195 FAN 2556
PWM 180 FAN 2556
PWM 165 FAN 2596
PWM 150 FAN 2556
PWM 135 FAN 2556
PWM 120 FAN 2596
PWM 105 FAN 2596
PWM 90 FAN 2596
PWM 75 FAN 2556
PWM 60 FAN 2556
PWM 45 FAN 2445
PWM 30 FAN 2280
PWM 28 FAN 2250
PWM 26 FAN 2191
PWM 24 FAN 2163
PWM 22 FAN 2109
PWM 20 FAN 2057
PWM 18 FAN 1985
PWM 16 FAN 1917
PWM 14 FAN 1834
PWM 12 FAN 1721
PWM 10 FAN 1622
PWM 8 FAN 1493
PWM 6 FAN 1339
PWM 4 FAN 1171
PWM 2 FAN 964
PWM 0 FAN 0
Fan Stopped at PWM = 0
Программа не обнаружила, каким из вентиляторов управляло устройство hwmon1/device/pwm2 и спросила меня, слышал или видел ли я, что какой-то из вентиляторов во время теста останавливался.
Did you see/hear a fan stopping during the above test (n)?
Я этого не видел и не заметил уменьшения шума, поэтому ответил n.

То же самое произошло и с устройством hwmon1/device/pwm3. Я также ответил n.

Затем программа говорит о том, что программа fancontrol может следить за температурой устройств, управляя скоростью вращения вентиляторов. pwmconfig предлагает мне настроить fancontrol. Я соглашаюсь.
The fancontrol script can automatically respond to temperature changes
of your system by changing fanspeeds.
Do you want to set up its configuration file now (y)?
Задаёт вопрос о том, где должен находиться файл конфигурации fancontrol. Можно нажать enter и тем самым согласиться на предложенный файл, а можно ввести другое имя файла.
What should be the path to your fancontrol config file (/etc/fancontrol)?
Дальше программа предлагает настроить устройство управления только одним из вентиляторов, для которого установлено соответствие канала управления и сенсора скорости вращения.
Select fan output to configure, or other action:
1) hwmon1/device/pwm1  3) Just quit       5) Show configuration
2) Change INTERVAL     4) Save and quit
Пункт 2 позволяет настроить периодичность проверки температуры и коррекции скорости вращения.

Пункт 3 позволяет просто выйти.

Пункт 4 - сохранить настройки и выйти.

Пункт 5 - показать конфигурацию.

Выбираем пункт 1, чтобы указать, какой из сенсоров температуры следует использовать для управления вентилятором. У меня таких сенсоров 4, я выбираю первый из них, который соответствует сенсору температуры на процессоре.
Select a temperature sensor as source for hwmon1/device/pwm1:
1) hwmon0/device/temp1_input
2) hwmon1/device/temp1_input
3) hwmon1/device/temp2_input
4) hwmon1/device/temp3_input
5) None (Do not affect this PWM output)
select (1-n):
Остальные сенсоры - это сенсоры температуры на материнской плате. Их положение мне неизвестно, да и управлять больше у меня нечем, кроме как скоростью вращения вентилятора на процессоре. Есть ещё корпусной вентилятор, но он, судя по тестам pwmconfig, фактически не управляется.

Дальше нужно ответить на несколько простых вопросов. Нам понадобится составленная выше таблица зависимости скорости вращения вентилятора от значения управляющего сигнала и немного здравого смысла. Судя по таблице, вентилятор работает на максимальной скорости уже при значении сигнала управления 105. Останавливается он при значении 2, а запускается при значении 4 (это я смог узнать только пробуя разные значения этого параметра в конфигурации fancontrol).

Как я выбирал предельные температуры? Очень просто - температура воздуха дома сейчас около 30 градусов Цельсия (на системнике висит магнит с термометром). Не вижу смысла насиловать кулер, заставляя его охлаждать процессор простым обдувом комнатным воздухом до 30 градусов или ниже - это просто невозможно. Накидываю 5 градусов и считаю такую температуру процессора нормальной. Пока температруа процессора ниже 35 градусов, включать охлаждение особого смысла нет. Включать его на полную мощность следует только при той температуре, при которой BIOS начнёт предупреждать о перегреве звуковым сигналом. У меня это 60 градусов Цельсия. Пока не достигнута эта температура, разгоняем вентилятор плавно, не в полную силу.

Enter the low temperature (degree C)
below which the fan should spin at minimum speed (20): 35
Указать самую высокую температуру, выше которой вентилятор должен включаться на полную мощность.
Enter the high temperature (degree C)
over which the fan should spin at maximum speed (60): 60
Минимальное значение канала управления, при котором вентилятор останавливается.
Enter the minimum PWM value (0-255)
at which the fan STOPS spinning (press t to test) (100): 2
Минимальное значение канала управления, при котором вентилятор начинает вращаться.
Enter the minimum PWM value (4-255)
at which the fan STARTS spinning (press t to test) (150): 4
Значение канала управления, если температура ниже минимальной.
Enter the PWM value (0-4) to use when the temperature
is below the low temperature limit (0): 0
Значение канала управления, если температура выше максимальной.
Enter the PWM value (4-255) to use when the temperature
is over the high temperature limit (255): 105
Теперь можно посмотреть конфигурацию (пункт 5) или сохранить изменения и закончить настройку (пункт 4). Можно снова ответить на вопросы, выбрав канал управления из списка.

Все эти настройки вносятся в файл /etc/fancontrol, где их можно отредактировать вручную:
# Configuration file generated by pwmconfig, changes will be lost
INTERVAL=5
DEVPATH=hwmon0=devices/pci0000:00/0000:00:18.3 hwmon1=devices/platform/it87.656
DEVNAME=hwmon0=k8temp hwmon1=it8712
FCTEMPS= hwmon1/device/pwm1=hwmon0/device/temp1_input
FCFANS= hwmon1/device/pwm1=hwmon1/device/fan1_input
MINTEMP= hwmon1/device/pwm1=35
MAXTEMP= hwmon1/device/pwm1=60
MINSTART= hwmon1/device/pwm1=4
MINSTOP= hwmon1/device/pwm1=2
MAXPWM=hwmon1/device/pwm1=105
Осталось только запустить службу fancontrol и вентиляторы будут управляться автоматически:
# /etc/init.d/fancontrol start
Самое главное, что нужно от pwmconfig - это установить соответствие между сенсорами скорости вращения вентилятора, температуры и каналом управления скоростью вращения вентилятора. Остальное можно настраивать уже простым редактированием файла /etc/fancontrol с последующим перезапуском демона fancontrol. Следить за индикаторами можно с помощью команд watch sensors. Именно таким образом я настроил подходящие параметры fancontrol.

С такими настройками я могу редактировать тексты при полностью остановленном вентиляторе. При полной загрузке процессора температура его поднимается до 45 градусов и держится на этом уровне стараниями fancontrol.

Я пользуюсь XFCE и нашёл для него два интересных плагина для более удобного наблюдения за температурой и процессором: xfce4-cpufreq-plugin и xfce4-sensors-plugin.

Установим их вместе с другими рекомендованными пакетами:
# apt-get install xfce4-cpufreq-plugin xfce4-sensors-plugin xsensors hddtemp cpufreq
Дальше их нужно просто добавить в панель и настроить. Всё это делается через меню панели.

Рядом с двумя индикаторами температур (процессора и жёсткого диска) удобно разместился индикатор текущей частоты процессора. Мой процессор умеет вдвое уменьшать свою рабочую частоту, когда он не сильно загружен - с 2 Гигагерц до 1 Гигагерца.

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

После всех этих манипуляций самым громким источником шума стал старенький жёсткий диск Seagate на 4,3 Гигабайта, на котором у меня установлена Windows XP. Во время работы он издаёт раздражающий свист. Осталось перенести Windows XP на менее шумный жёсткий диск WD на 1 Терабайт, где у меня установлена основная система - Debian GNU/Linux 6.0.

Неожиданно, сделать это оказалось непросто. Но об этом - в следующей заметке.