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

Специально выделил температуру, на 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++:

Эпилог

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

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

Комментарии (9)


  1. checkpoint
    02.09.2025 20:15

    У меня FreeBSD 13.5-RELEASE на ноуте Lenovo Ideapad со встроенной AMD-GPU и дискретной RTX-3050. Никаких проблем с нагревом нет, температура процесcора ~45C, вентиляторы молчат. Что я дела не так ? Похоже на баг в 14.x-RELEASE.

    Кстати, открыл для себя утилиту nvrun-vgl, позволяет оффлоадить GL графику для конкретного процесса на дискретную видюху. Тяжелые САПРы запускаю через эту утилиту. Всё остальное запускается на встроенной AMD-GPU. После запуска nvrun-vgl, сразу начинуют крутиться вентиляторы... но стоит её остановить, как всё само возвращается в исходное состояние.


    1. alex0x08 Автор
      02.09.2025 20:15

      Так стоят же драйвера, если nvidia-smi отрабатывает.

      И нет, это не баг в 14й, такое поведение есть и в линуксе и в вендах.


      1. checkpoint
        02.09.2025 20:15

        Ничего не понимаю. Что мешает Вам поставить драйвера для Nvidia вместо этого скрипта ? ;)


        1. alex0x08 Автор
          02.09.2025 20:15

          Что мешает?

          Ну например что этот драйвер - блоб с не самой стабильной работой даже в линуксе, что есть проблемы с совместимостью, с suspend/resume, с устареванием - NVidia постоянно сокращает поддерживаемые модели и выкидывает их из новых драйверов.

          Полагаю вы не просто так на 13й остались, хотя релиз 15й обещают уже в ноябре.


          1. checkpoint
            02.09.2025 20:15

            Полагаю вы не просто так на 13й остались

            Верно, я побаиваюсь переходить на 14-ю. Просто уверен, что там всё нафиг сломано. :-) Но меня подмывает поддержка 802.11a для iwm, так что скоро будут упгрейдить. Хочу уже на WiFi 5ГГц пересесть.


            1. alex0x08 Автор
              02.09.2025 20:15

              iwm на современных картах все также нестабилен, так что я остался на wifibox.

              И видимо в ближайшие годы это не изменится.


              1. checkpoint
                02.09.2025 20:15

                На моей Intel 7265 драйвер iwm работает стабильно, не глючит, не зависает при засыпании/просыпании, но коннектит только к сетям 11g (2.4GHz). Я недавно ставил 14.3-RELEASE на мини-ПК и случайно обнаружил, что там этот же драйвер отлично коннектит к 11ac (5GHz). Но на сколько стабильно он работает - не проверял.

                Еще я пробовал iwlfifi (портированный из линуха) - коннектит почти ко всему, но крайне не стабильный - виснет при засыпании или спорадически паникует при работе.

                Пару лет назад прочитал в новостях, что FreeBSD Foundation нашло финансирование и наняло команду для вылизывания драйверов WiFi во фре, но воз и ныне там. :(


  1. checkpoint
    02.09.2025 20:15

    Кстати, раз уж впомнили фрюху, может быть сталкивались с такой проблемой. После очередного аргрейда (с 13.3 на 13.5 помоему), появился такой крайне неприятный глюк - после просыпания (открытия крышки ноута) что-то происходит с sddm (или Xorg, пока не могу понять что именно глючит), и он показывает черный экран - не включается подсветка. Если закрыть крышку и открыть еще раз - всё ок. Иногда этого глюка нет, а иногда даже пять раз подряд закрыть/открыть не помогает.

    PS: Да, workaround к этому глюку достаточно простой - запускать backlight из /etc/rc.resume, но он сбивает настройки подсветки. :(


    1. alex0x08 Автор
      02.09.2025 20:15

      Сталкивался разумеется, это же классика, начните с изучения поведения при засыпании, проявляется ли эффект при acpiconf -s3

      Дальше есть три параметра:

      sysctl hw.acpi.reset_video

      kern.vt.suspendswitch

      и

      hw.syscons.sc_no_suspend_vtswitch:

      которыми стоит поиграться в зависимости от модели.

      Стоит предупредить что поведение может быть непредсказуемым - от полного зависания до черного экрана.