FreeBSD, ноутбук и перегрев

от автора

Делюсь одним малоизвестным решением проблемы с перегревом, коль уж судьба заставила использовать эту редкую ОС на ноутбуке.

Специально выделил температуру, на 55С включаются вентиляторы и ноутбук начинает шуметь.

Специально выделил температуру, на 55С включаются вентиляторы и ноутбук начинает шуметь.

Суть проблемы

Существует класс ноутбуков с двумя видеокартами на борту: дискретной — для игор тяжелой графики и встроенной.

Во всех операционных системах (даже в Windows) есть поведение, когда драйвер для дискретной видеокарты не установлен или работает неправильно, но сама карта при этом активирована.

Поскольку дискретная видеокарта требует огромное количество ресурсов — начинает садиться батарея, а сам ноутбук нагревается, с чего начинают шуметь вентиляторы.

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

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

Вот так выглядит один из репортов пользователей с официального форума FreeBSD:

Разумеется существует простое решение «в лоб» в виде отключения дискретной видеокарты в BIOS, но это откровенно неудобно, поэтому ниже покажу более интересный способ.

Все описанное тестировалось на моем ноутбуке Lenovo Z580:

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

Также добавлю, что модуль и утилита acpi_call были портированы из линукса, где присутствуют по-умолчанию.

Скрипт

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

#!/bin/sh  usage() { printf "Usage:\t$0\n" printf "\tMust be run as root\n" }  [ "`whoami`" != "root" ] && usage && exit 1  kldstat -q -n acpi_call.ko MODULE_LOADED=$?  if [ $MODULE_LOADED != "0" ]; then echo "The acpi_call module is not loaded, try running `kldload acpi_call` as root" exit 1 fi   if [ -f ~/.gpu_method ]; then echo "Using previously stored method, as it was previously successful..." . ~/.gpu_method else methods=" \_SB.PCI0.P0P1.VGA._OFF \_SB.PCI0.P0P2.VGA._OFF \_SB_.PCI0.OVGA.ATPX \_SB_.PCI0.OVGA.XTPX \_SB.PCI0.P0P3.PEGP._OFF \_SB.PCI0.P0P2.PEGP._OFF \_SB.PCI0.P0P1.PEGP._OFF \_SB.PCI0.MXR0.MXM0._OFF \_SB.PCI0.PEG1.GFX0._OFF \_SB.PCI0.PEG0.GFX0.DOFF \_SB.PCI0.PEG1.GFX0.DOFF \_SB.PCI0.PEG0.PEGP._OFF \_SB.PCI0.XVR0.Z01I.DGOF \_SB.PCI0.PEGR.GFX0._OFF \_SB.PCI0.PEG.VID._OFF \_SB.PCI0.PEG0.VID._OFF \_SB.PCI0.P0P2.DGPU._OFF \_SB.PCI0.P0P4.DGPU.DOFF \_SB.PCI0.IXVE.IGPU.DGOF \_SB.PCI0.RP00.VGA._PS3 \_SB.PCI0.RP00.VGA.P3MO \_SB.PCI0.GFX0.DSM._T_0 \_SB.PCI0.LPC.EC.PUBS._OFF \_SB.PCI0.P0P2.NVID._OFF \_SB.PCI0.P0P2.VGA.PX02 \_SB_.PCI0.PEGP.DGFX._OFF \_SB_.PCI0.VGA.PX02 \_SB.PCI0.PEG0.PEGP.SGOF \_SB.PCI0.AGP.VGA.PX02 " fi  for m in $methods; do echo -n "Trying $m: " /usr/local/sbin/acpi_call -p $m -o i result=$? case "$result" in 0) echo "Call succeeded!" if [ ! -f ~/.gpu_method ]; then echo "Storing $m in ~/.gpu_method for reusal" echo "export methods=\"$m\"" > ~/.gpu_method fi break ;; *) echo "failed, continuing" ;; esac done

Ниже покажу как его использовать.

Установка и запуск

Скрипт использует специальную утилиту acpi_call, с помощью которой он вызывает перебором все известные дискретные видеокарты и шлет команду отключения.

Утилита acpi_call устанавливается из пакетов:

 pkg install acpi_call

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

kldload acpi_call

Сам скрипт можно либо взять из статьи либо скачать оригинал из сети:

fetch https://people.freebsd.org/~xmj/turn_off_gpu.sh

Запускать его необходимо из-под root:

chmod +x /root/bin/turn_off_gpu.sh /root/bin/turn_off_gpu.sh

Имейте ввиду, что дискретная карта может активироваться при возвращении ноутбука из режима сна, так что по-хорошему вызов этого скрипта должен быть в /etc/rc.resume.

Результат

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

Если этого не происходит, проверьте что у вас запущен и работает демон powerd или powerd++:

Эпилог

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

Оригинал статьи в нашем блоге, также мы теперь дублируем статьи на Дзене.


ссылка на оригинал статьи https://habr.com/ru/articles/943212/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *