Делюсь одним малоизвестным решением проблемы с перегревом, коль уж судьба заставила использовать эту редкую ОС на ноутбуке.
Суть проблемы
Существует класс ноутбуков с двумя видеокартами на борту: дискретной — для игор тяжелой графики и встроенной.
Во всех операционных системах (даже в 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++: