Автор Тема: Управление шумным вентилятором  (Прочитано 7259 раз)

Оффлайн zah

  • Давно тут
  • **
  • Сообщений: 140
  • ^_^
   Всем привет!

Подскажите в каком файле лежат текущие настройки скорости вентиляторов у серверов?

Поставил sensors, через /sys/class/hwmon/hwmon1/device/pwm1 не реагирует на изменения.

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
Re: Управление шумным вентилятором
« Ответ #1 : 18.02.2020 15:47:39 »
А этим разве управляет ОС, а не BIOS? Кто, кроме производителя оборудования, может знать допустимые режимы? А управление из ОС - это хак какой-то. Может и возможный, но вряд ли верный.

Оффлайн zah

  • Давно тут
  • **
  • Сообщений: 140
  • ^_^
Re: Управление шумным вентилятором
« Ответ #2 : 18.02.2020 16:30:19 »
А этим разве управляет ОС, а не BIOS? Кто, кроме производителя оборудования, может знать допустимые режимы? А управление из ОС - это хак какой-то. Может и возможный, но вряд ли верный.

Насколько я знаю в ядре можно управлять оборотами

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Управление шумным вентилятором
« Ответ #3 : 19.02.2020 09:39:16 »
Настройка шума и терморежимов у меня на десктопе начинается ещё до установки системы.
Сначала в BIOS включается PWM. Вентилятор должен его поддерживать.

Затем идём в тонкие настройки BIOS:
Особенность процессоров Intel в том, что Vcore по-умолчанию у них завышено. Делается это для того, чтобы любой процессор Intel работал стабильно.
Сначала дефолтный Vcore сбрасывается до 1.0V. После чего идёт тест-прогон, сутки-двое-трое. Доступ к файловым содержащим важную информацию запрещён.
Если система ведёт себя стабильно, Vcore понижается и всё повторяется снова. И это повторяется до самого минимального напряжения при котором система ведёт себя стабильно.
Вообще все процессоры Intel со сброшенным Vcore до минимума, у меня вели себя стабильно.
Но это не означает, что делать такой тест-прогон не нужно.
Таким тест-прогоном можно понизить и температуру на процессоре и снизить обороты вентилятора.
Но такой тест-прогон утомительный и требует времени. Стоит ли результат этого? Стоит.
Используя такую аппаратную настройку, отпадает необходимость каждую систему тюнинговать отдельно.
« Последнее редактирование: 19.02.2020 11:04:05 от Speccyfighter »

Оффлайн trs

  • Давно тут
  • **
  • Сообщений: 284
Re: Управление шумным вентилятором
« Ответ #4 : 19.02.2020 10:42:09 »
Если речь о lm_sensors, то знаю два варианта.

1. Простой (программный).

Запускаем pwmconfig. Следуем указаниям. При этом создаются настройки и сохраняются в /etc/fancontrol. Далее активируем и запускаем сервис fancontrol. Вот он уже будет что надо и когда надо в файлы типа hwmon1/device/pwm1 записывать. Если не зависнет (маловероятно, но следует иметь ввиду: когда нагрузка возрастёт и система начнёт уходить в подкачку, охлаждение может оказаться недостаточным).

2. Аппаратный. (Возможен при наличии поддержки со стороны оборудования. В таком случае, вероятно, уже есть опция "автоматически регулировать" в "БИОС").

Определяем тип мультиконтроллера (визуально, или утилитой sensors-detect). Находим на него документацию. Смотрим, имеется ли автономный режим контроля температуры и оборотов. Если да, ищем регистры управления. Ну и дальше, всё должно стать понятно из документации, иначе лучше не экспериментировать — сначала вентилятор раскрутится до 40 тыс об/мин и взлетит системник, потом взорвётся блок питания. Я предупредил.

Спойлер
Создаётся 2 примерно таких юнита:

fan-init.service
[Unit]
Description=Initialize fan controller
After=systemd-modules-load.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/какой-надо-путь/fan-init.sh

[Install]
WantedBy=sysinit.target
Also=fan-init-after-sleep.service

fan-init-after-sleep.service
[Unit]
Description=Initialize fan controller after sleep
StopWhenUnneeded=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/какой-надо-путь/fan-init.sh

[Install]
WantedBy=sleep.target

И, собственно, скрипт инициализации регистров управления контроллера:

fan-init.sh
#!/bin/sh

let() {
        echo $2 | tee /sys/devices/platform/nct6775.*/hwmon/hwmon2/$1
}

# используем датчик температуры CPU
let     pwm2_temp_sel           2

# Целевая температура, тысячные доли градуса
let     pwm2_target_temp        40000
let     pwm2_temp_tolerance     02000
# стартовое значение ШИМ (1 - 255)
let     pwm2_start              85
# минимальные обороты
let     pwm2_floor              45
# Thermal Cruise mode (2)
let     pwm2_enable             2

let     pwm1_temp_sel           1
# Manual mode, write to pwm[0-5] any value 0-255
let     pwm1                    90
let     pwm1_enable             1

« Последнее редактирование: 19.02.2020 10:48:24 от trs »

Оффлайн zah

  • Давно тут
  • **
  • Сообщений: 140
  • ^_^
Re: Управление шумным вентилятором
« Ответ #5 : 19.02.2020 22:27:38 »
Если речь о lm_sensors, то знаю два варианта.

1. Простой (программный).

Запускаем pwmconfig. Следуем указаниям. При этом создаются настройки и сохраняются в /etc/fancontrol. Далее активируем и запускаем сервис fancontrol. Вот он уже будет что надо и когда надо в файлы типа hwmon1/device/pwm1 записывать. Если не зависнет (маловероятно, но следует иметь ввиду: когда нагрузка возрастёт и система начнёт уходить в подкачку, охлаждение может оказаться недостаточным).

В пакете lm_sensors нет pwmconfig

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Управление шумным вентилятором
« Ответ #6 : 20.02.2020 03:02:07 »
Если речь о lm_sensors, то знаю два варианта.

1. Простой (программный).

Запускаем pwmconfig. Следуем указаниям. При этом создаются настройки и сохраняются в /etc/fancontrol. Далее активируем и запускаем сервис fancontrol. Вот он уже будет что надо и когда надо в файлы типа hwmon1/device/pwm1 записывать. Если не зависнет (маловероятно, но следует иметь ввиду: когда нагрузка возрастёт и система начнёт уходить в подкачку, охлаждение может оказаться недостаточным).

В пакете lm_sensors нет pwmconfig

pwmconfig в пакете lm_sensors3-utils. Но в систему на gtk, этот пакет притащит пачку qt-библиотек.

$ rpm -ql lm_sensors3-utils | grep 'bin/\|service$\|init'
/lib/systemd/system/fancontrol.service
/lib/systemd/system/sensord.service
/usr/sbin/fancontrol
/usr/sbin/isadump
/usr/sbin/isaset
/usr/sbin/pwmconfig
/usr/sbin/sensord
/usr/share/lm_sensors3/fancontrol.init
/usr/share/lm_sensors3/sensord.init
$ apt-cache depends lm_sensors3-utils | tail -n 1
  Obsoletes: <lm_sensors-utils>

Пользователям систем на sysv нужно быть осторожнее с пакетом lm_sensors3-utils:
линуксоиды добросовесно испортили init-скрипт и он требует правки
$ hexdump -C /usr/share/lm_sensors3/sensord.init | grep b4
000006c0  65 72 73 3d b4 6d 6f 64  70 72 6f 62 65 20 2d 63  |ers=.modprobe -c|
000006d0  20 7c 20 5c 0a 20 20 61  77 6b 20 b4 2f 5e 5b 5b  | | \.  awk ./^[[|
00000710  7b 20 70 72 69 6e 74 20  24 33 20 7d b4 b4 0a 69  |{ print $3 }...i|
00000730  b4 6d 6f 64 70 72 6f 62  65 20 2d 63 20 7c 20 5c  |.modprobe -c | \|
00000740  0a 20 20 61 77 6b 20 b4  2f 5e 5b 5b 3a 73 70 61  |.  awk ./^[[:spa|
00000790  7d b4 b4 0a 0a 23 20 43  6f 6e 66 69 67 75 72 61  |}....# Configura|
00000870  61 6c 6c 65 64 0a 5b 20  b4 75 6e 61 6d 65 20 2d  |alled.[ .uname -|
00000880  72 b4 20 3d 20 40 4d 56  45 52 53 49 4f 4e 40 20  |r. = @MVERSION@ |
00000a70  65 20 b4 65 63 68 6f 20  24 64 72 69 76 65 72 b4  |e .echo $driver.|
00000b40  76 65 72 20 22 0a 20 20  20 20 20 20 20 20 20 20  |ver ".          |
00000da0  20 20 20 64 72 69 76 65  72 73 3d b4 65 63 68 6f  |   drivers=.echo|
00000df0  63 65 3a 5d 5c 6e 22 20  22 20 22 b4 0a 20 20 20  |ce:]\n" " "..   |

Количество символов с hex-кодом b4 в скрипте
$ hexdump -C /usr/share/lm_sensors3/sensord.init | cut -f3-19 -d " " | head -n -1 | grep -o b4 | wc -w
14

Для более лёгкого визуального восприятия:
см. hex код <B4>
$ less /usr/share/lm_sensors3/sensord.init
...
# Modules to load from modules.conf (modules configuration)
i2c_bus_drivers=<B4>modprobe -c | \
  awk <B4>/^[[:space:]]*alias[[:space:]]+i2c-bus-[[:digit:]]/ { print $3 }<B4><B4>
i2c_chip_drivers=<B4>modprobe -c | \
  awk <B4>/^[[:space:]]*alias[[:space:]]+i2c-sensors-chip-[[:digit:]]/ { print $3
}<B4><B4>
...

Байт b4, это символ с десятичным кодом 180:
$ echo $((16#B4))
180
http://www.asciitable.com
https://www.ascii-code.com

Нет, конечно понимаю, что писать шелл-код на своём национальном языке это очень круто... Разработчики Линукс, когда пишите шелл-код, не вылезайте пожалуйста за пределы первых 128-ми байт ASCII таблицы.
« Последнее редактирование: 20.02.2020 08:34:51 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Управление шумным вентилятором
« Ответ #7 : 20.02.2020 06:44:21 »
...
Пользователям систем на sysv нужно быть осторожнее с пакетом lm_sensors3-utils:
... init-скрипт ... требует правки
$ hexdump -C /usr/share/lm_sensors3/sensord.init | grep b4
000006c0  65 72 73 3d b4 6d 6f 64  70 72 6f 62 65 20 2d 63  |ers=.modprobe -c|
000006d0  20 7c 20 5c 0a 20 20 61  77 6b 20 b4 2f 5e 5b 5b  | | \.  awk ./^[[|
00000710  7b 20 70 72 69 6e 74 20  24 33 20 7d b4 b4 0a 69  |{ print $3 }...i|
00000730  b4 6d 6f 64 70 72 6f 62  65 20 2d 63 20 7c 20 5c  |.modprobe -c | \|
00000740  0a 20 20 61 77 6b 20 b4  2f 5e 5b 5b 3a 73 70 61  |.  awk ./^[[:spa|
00000790  7d b4 b4 0a 0a 23 20 43  6f 6e 66 69 67 75 72 61  |}....# Configura|
00000870  61 6c 6c 65 64 0a 5b 20  b4 75 6e 61 6d 65 20 2d  |alled.[ .uname -|
00000880  72 b4 20 3d 20 40 4d 56  45 52 53 49 4f 4e 40 20  |r. = @MVERSION@ |
00000a70  65 20 b4 65 63 68 6f 20  24 64 72 69 76 65 72 b4  |e .echo $driver.|
00000b40  76 65 72 20 22 0a 20 20  20 20 20 20 20 20 20 20  |ver ".          |
00000da0  20 20 20 64 72 69 76 65  72 73 3d b4 65 63 68 6f  |   drivers=.echo|
00000df0  63 65 3a 5d 5c 6e 22 20  22 20 22 b4 0a 20 20 20  |ce:]\n" " "..   |

Количество символов с hex-кодом b4 в скрипте
$ hexdump -C /usr/share/lm_sensors3/sensord.init | cut -f3-19 -d " " | head -n -1 | grep -o b4 | wc -w
14

Для более лёгкого визуального восприятия:
см. hex код <B4>
$ less /usr/share/lm_sensors3/sensord.init
...
# Modules to load from modules.conf (modules configuration)
i2c_bus_drivers=<B4>modprobe -c | \
  awk <B4>/^[[:space:]]*alias[[:space:]]+i2c-bus-[[:digit:]]/ { print $3 }<B4><B4>
i2c_chip_drivers=<B4>modprobe -c | \
  awk <B4>/^[[:space:]]*alias[[:space:]]+i2c-sensors-chip-[[:digit:]]/ { print $3
}<B4><B4>
...

Байт b4, это символ с десятичным кодом 180:
$ echo $((16#B4))
180
http://www.asciitable.com
https://www.ascii-code.com

Отправлен багрепорт:
Ошибка 38131 - Непечатные символы в sensord.init
https://bugzilla.altlinux.org/show_bug.cgi?id=38131

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Управление шумным вентилятором
« Ответ #8 : 20.02.2020 07:21:56 »
...
Количество символов с hex-кодом b4 в скрипте
$ hexdump -C /usr/share/lm_sensors3/sensord.init | cut -f3-19 -d " " | head -n -1 | grep -o b4 | wc -w
14

Для более лёгкого визуального восприятия:
см. hex код <B4>
$ less /usr/share/lm_sensors3/sensord.init
...
# Modules to load from modules.conf (modules configuration)
i2c_bus_drivers=<B4>modprobe -c | \
  awk <B4>/^[[:space:]]*alias[[:space:]]+i2c-bus-[[:digit:]]/ { print $3 }<B4><B4>
i2c_chip_drivers=<B4>modprobe -c | \
  awk <B4>/^[[:space:]]*alias[[:space:]]+i2c-sensors-chip-[[:digit:]]/ { print $3
}<B4><B4>
...

Байт b4, это символ с десятичным кодом 180:
$ echo $((16#B4))
180
http://www.asciitable.com
https://www.ascii-code.com

Отправлен багрепорт:
Ошибка 38131 - Непечатные символы в sensord.init
https://bugzilla.altlinux.org/show_bug.cgi?id=38131

Предположительно, вместо символа с hex-кодом b4, должен стоять символ Обратный апостроф (Grave accent), - hex-код 60, десятичный 96.
В частности:
...
i2c_bus_drivers=<B4>modprobe -c | \
  awk <B4>/^[[:space:]]*alias[[:space:]]+i2c-bus-[[:digit:]]/ { print $3 }<B4><B4>
...
Первый байт обратный апостроф, второй байт апостроф, третий байт апостроф, четвёртый байт обратный апостроф. Т.е. для awk ограничено апострофами, команда для переменной, - обратными апострофами.
И так весь скрипт привести руками к должному виду.

hex-код EA в имени разработчика, предположительно, это Jakub Narebski (eng):
https://www.google.com/search?q=Jakub+Narebski+linux

Также потребуют правки все строки:
# grep -n @ /usr/share/lm_sensors3/sensord.init
1:#!@BASH@
3:# @INITRDDIR@/sensord
28:# config: @SYSCONFDIR@/sensors.conf
34:. @INITRDDIR@/functions
38:# Add @SBINDIR@ (sensord) and @BINDIR@ (sensors) to PATH if necessary
39:echo "$PATH" | grep -q @SBINDIR@ || PATH=$PATH:@SBINDIR@
40:echo "$PATH" | grep -q  @BINDIR@ || PATH=$PATH:@BINDIR@
58:[ -x @SBINDIR@/sensord ] || exit 0
59:[ -x  @BINDIR@/sensors ] || exit 0


Оригинал скрипта тут:
https://fossies.org/linux/lm-sensors/prog/init/sensord.init
« Последнее редактирование: 20.02.2020 08:59:22 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Управление шумным вентилятором
« Ответ #9 : 20.02.2020 09:05:20 »
Также потребуют правки все строки:
# grep -n @ /usr/share/lm_sensors3/sensord.init
1:#!@BASH@
3:# @INITRDDIR@/sensord
28:# config: @SYSCONFDIR@/sensors.conf
34:. @INITRDDIR@/functions
38:# Add @SBINDIR@ (sensord) and @BINDIR@ (sensors) to PATH if necessary
39:echo "$PATH" | grep -q @SBINDIR@ || PATH=$PATH:@SBINDIR@
40:echo "$PATH" | grep -q  @BINDIR@ || PATH=$PATH:@BINDIR@
58:[ -x @SBINDIR@/sensord ] || exit 0
59:[ -x  @BINDIR@/sensors ] || exit 0

Вы видели формат переменных в ms-dos/windows?
Это то же самое. Как в ср@ной винде.
Под тридцать правок в одном шелл-скрипте, это уже явный перебор.
« Последнее редактирование: 20.02.2020 09:32:19 от Speccyfighter »

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
Re: Управление шумным вентилятором
« Ответ #10 : 20.02.2020 10:06:15 »
Вы видели формат переменных в ms-dos/windows?
Это то же самое. Как в ср@ной винде.
Под тридцать правок в одном шелл-скрипте, это уже явный перебор.
Вообще-то это явный задел для чего-то вроде sed и подставновки в момент сборки. И этот файл надо просто удалить из пакета на самом деле, он не нужен. init-скрипт должен находиться в другом месте, и он там и находится (UPD: как при более внимательном рассмотрении выяснилось, не тот скрипт).

Кстати, вот тут есть пример, правда про другие файлы: https://packages.altlinux.org/en/sisyphus/specfiles/lm_sensors3

sed -i "s|\@WRAPPER_DIR\@|%_libexecdir/%name|" lm_sensors.service
sed -i "s|\@WRAPPER_DIR\@|%_libexecdir/%name|" sensord.service
« Последнее редактирование: 21.02.2020 08:46:27 от asy »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Управление шумным вентилятором
« Ответ #11 : 20.02.2020 15:46:46 »
Вы видели формат переменных в ms-dos/windows?
Это то же самое. Как в ср@ной винде.
Под тридцать правок в одном шелл-скрипте, это уже явный перебор.
Вообще-то это явный задел для чего-то вроде sed и подставновки в момент сборки. И этот файл надо просто удалить из пакета на самом деле, он не нужен. init-скрипт должен находиться в другом месте, и он там и находится.

Кстати, вот тут есть пример, правда про другие файлы: https://packages.altlinux.org/en/sisyphus/specfiles/lm_sensors3

sed -i "s|\@WRAPPER_DIR\@|%_libexecdir/%name|" lm_sensors.service
sed -i "s|\@WRAPPER_DIR\@|%_libexecdir/%name|" sensord.service

Спасибо, asy.

Сам пакет lm_sensors3-utils однозначно заточен только под systemd. Все *.service-файлы там где и должны быть.
Но шелл-скрипты в пакете  всё таки есть:
# rpm -qvl lm_sensors3-utils | grep init
-rwxr-xr-x    1 root    root                     1471 кві  6  2019 /usr/share/lm_sensors3/fancontrol.init
-rwxr-xr-x    1 root    root                     4318 кві  6  2019 /usr/share/lm_sensors3/sensord.init

И что ещё интереснее, скрипт /usr/share/lm_sensors3/fancontrol.init (в отличие от sensord.init) написан по всем правилам синтаксиса, все символы шелл-кода в пределах 128-ми байт ascii и скрипт даже не требует установки exec бита. fancontrol.init можно просто скопировать в /etc/init.d, убрав расширение init.

У меня подозрение, что sensord.init писался в польской раскладке. В комментариях скрипта, можно писать хоть на китайском, но шелл-код должен быть только в пределах 128-ми байт таблицы ASCII. И в довесок ко всему, шелл-код sensord.init сломан байтом b4 - прямой (правый) апостроф, которого нет в ascii 0-127. Что противоречит правилам написания скриптов. И плохо представляю, как такой шелл-код был оттестирован в RH7.2, о чём утверждает сам скрипт.
Это конечно моё личное мнение, которое ни на что большее не претендует, но шелл-скрипт sensord.init, даже как заготовка не годится.

Почему это замечено только сейчас:
В своё время, по веской причине (с моей точки зрения) перешёл с AMD на Intel. У интела, при превышении лимита температуры процессора, срабатывает аварийный poweroff. К тому же все настройки выкручивались аппаратно и в этом пакете не было необходимости. Но столкнулся с этим в связи с темой, случайно заглянув в lm_sensors3-utils.
« Последнее редактирование: 20.02.2020 16:03:33 от Speccyfighter »

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
Re: Управление шумным вентилятором
« Ответ #12 : 20.02.2020 15:59:43 »
У меня подозрение, что sensord.init писался в польской раскладке.
Да не нужен он. В srpm есть другой:
Source1: lm_sensors.init
...
install -pD -m755 %SOURCE1 %buildroot%_initrddir/lm_sensors
Подозреваю, что в этот sensord.init никто никогда и не заглядывал.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Управление шумным вентилятором
« Ответ #13 : 20.02.2020 16:05:35 »
У меня подозрение, что sensord.init писался в польской раскладке.
Да не нужен он. В srpm есть другой:
Source1: lm_sensors.init
...
install -pD -m755 %SOURCE1 %buildroot%_initrddir/lm_sensors
Подозреваю, что в этот sensord.init никто никогда и не заглядывал.

Угу:

Почему это замечено только сейчас:
В своё время, по веской причине (с моей точки зрения) перешёл с AMD на Intel. У интела, при превышении лимита температуры процессора, срабатывает аварийный poweroff. К тому же все настройки выкручивались аппаратно и в этом пакете не было необходимости. Но столкнулся с этим в связи с темой, случайно заглянув в lm_sensors3-utils.

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
Re: Управление шумным вентилятором
« Ответ #14 : 20.02.2020 16:38:04 »
Почему это замечено только сейчас:
В своё время, по веской причине (с моей точки зрения) перешёл с AMD на Intel. У интела, при превышении лимита температуры процессора, срабатывает аварийный poweroff. К тому же все настройки выкручивались аппаратно и в этом пакете не было необходимости. Но столкнулся с этим в связи с темой, случайно заглянув в lm_sensors3-utils.
Похоже этим никто не пользуется. Я, честно говоря, тоже только сейчас посмотрел внимательнее на sensord и sensord.init. Доступ к сенсорам обеспечивает lm_sensors3, и там всё нормально работает. А в lm_sensors3-utils лежат штуки, которые обычно заменяются чем то ещё. Например collectd, gkrelm и т.п. вполне заменяют sensord. Но раз пакуется, надо починить наверное всё же.
« Последнее редактирование: 20.02.2020 16:41:04 от asy »