Собрал в одной статье весь практический опыт настройки засыпания этой системы на разных ноутбуках. Если хотите попробовать FreeBSD на ноутбуке — точно стоит прочитать.

Incubus, 1879
Incubus, 1879

По каким принципам автор подбирает себе оборудование детально описано в отдельной статье, вкратце:

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

Если есть место под второй 2.5'' диск — докупается второй диск, если есть NVM‑разъем — докупается NVMe‑накопитель.

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

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

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

Которых обычно по 4-5 штук на одной машине.

Разработка ПО она такая — вы же не думали, будто всю работу автор делает с помощью одного единственного инструмента?

На всех ноутбуках используется текущая стабильная версия FreeBSD, на момент написания статьи это 14.3.

Общие принципы

Процессы погружения в сон и просыпания (suspend/resume) на самом деле технически сложные — представьте на минутку, что необходимо «поставить на паузу» каждое устройство и каждую запущенную программу, а затем при просыпании «вернуть все обратно».

Разумеется работает это далеко не всегда — все же FreeBSD не разрабатывалась для десктопа, не говоря уже о ноутбуках, поэтому требует отладки и подбора параметров.

Так выглядит идеально отлаженный вариант, как-то так это и должно работать:

Может быть ситуация, когда засыпание отрабатывает, но при попытке проснуться система зависает.

Сбой и зависание могут произойти не при первом пробуждении, а например при десятом — представляете как весело такое отлаживать?

Еще может «зависнуть» (перестать подавать признаки жизни) при пробуждении не вся система целиком, а какое-то отдельное устройство.

Например тачпад или батарея.

Может быть разное поведение при работе от батареи и от сети — вариантов много и все веселые.

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

Но вернемся к нашим электронным баранам.


Мест для настройки процессов засыпания-пробуждения по большому счету два:

системные переменные, задаваемые через sysctl и скрипты, отвечающие за сам процесс.

Настройки бывают глобальными, менять которые во время работы системы нельзя, в этом случае они задаются в файле /boot/loader.conf.

Для более «гражданских» , которые можно менять во время работы используется файл /etc/sysctl.conf и собственно команда sysctl, но в любом случае изменение таких настроек происходит только от root.

Надо отметить, что системные настройки, имеющие отношение к ACPI и процессам засыпания-пробуждения — по большому счету «грязные хаки», меняющие поведение отдельных модулей или ядра системы ради возможности успешного засыпания или пробуждения.

Чаще всего эти настройки отвечают за принудительный сброс состояния устройства, повторную инициализацию или наоборот — за пропуск стадии инициализации при возвращении из сна.

Поскольку FreeBSD это не Ubuntu — тут не принято добавлять по отдельному «грязному хаку» на каждую модель ноутбука и затем судорожно все это поддерживать, отлавливая бесконечное количество багов при отваливающемся функционале в новых ядрах.

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

Современное окружение

Если вы живете не в лесу с оленями и не являетесь носителем радикальных сисадминских взглядов, исключащих из системы «все ненужное» — в вашей домашней FreeBSD будут работать сервисы DBus и devd, через события в которых и будет происходить запуск процесса засыпания.

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

Большая и красивая кнопка "Suspend" - выбор продвинутой молодежи.
Большая и красивая кнопка "Suspend" - выбор продвинутой молодежи.

Поэтому для нормального использования настраивать стоит именно этот функционал.

ZZZ

В FreeBSD есть несколько утилит разного уровня «системности», которые используются для погружения машины в сон. К сожалению для нормального процесса засыпания отлаживать придется их все.

В противном случае могут быть «спецэффекты» когда с помощью консольной утилиты засыпание работает правильно, а из пользовательского интерфейса в графическом окружении, который отправляет события через DBus — нет.

С незапамятных времен, в FreeBSD существовал скрипт /usr/sbin/zzz, отвечающий за погружение машины в сон одной командой, небольшой по размеру, поэтому привожу его код целиком:

#!/bin/sh
#
# Suspend the system using either ACPI or APM.
# For APM, "apm -z" will be issued.
# For ACPI, the configured suspend state will be looked up, checked to see
# if it is supported, and "acpiconf -s <state>" will be issued.
#
# Mark Santcroos <marks@ripe.net>
#

PATH=/sbin:/usr/sbin:/usr/bin:/bin

ACPI_SUSPEND_STATE=hw.acpi.suspend_state
ACPI_SUPPORTED_STATES=hw.acpi.supported_sleep_state
APM_SUSPEND_DELAY=machdep.apm_suspend_delay

# Check for ACPI support
if sysctl $ACPI_SUSPEND_STATE >/dev/null 2>&1; then
	# Get configured suspend state
	SUSPEND_STATE=$(sysctl -n $ACPI_SUSPEND_STATE)

	# Get list of supported suspend states
	SUPPORTED_STATES=$(sysctl -n $ACPI_SUPPORTED_STATES)

	# Check if the configured suspend state is supported by the system
	if echo "$SUPPORTED_STATES" | grep "$SUSPEND_STATE" >/dev/null; then
		# execute ACPI style suspend command
		exec acpiconf -s "$SUSPEND_STATE"
	else
		echo -n "Requested suspend state $SUSPEND_STATE "
		echo -n "is not supported."
		echo    "Supported states: $SUPPORTED_STATES"
	fi
# Check for APM support
elif sysctl $APM_SUSPEND_DELAY >/dev/null 2>&1; then
	# Execute APM style suspend command
	exec apm -z
else
	echo "Error: no ACPI or APM suspend support found."
fi

exit 1

Как можно заметить, тут происходит проверка как внешних аргументов, передаваемых скрипту при вызове, так и проверка на тип используемого API — ACPI или APM.

APM тут это именно название подсистемы управления питанием, не стоит путать с одноименной консольной командой, которая также из древних времен. Весь смысл существования которой в 21м веке — проверка из консоли уровня заряда батареи.

Но современные реалии таковы, что с APM вам уже не удастся столкнуться при всем желании (если только не ограбите музей) — APM использовался на ноутбуках в 90е и самом начале нулевых.

Даже на описываемом ниже Asus F3KE из 2007 года используется вполне современный ACPI а не APM.

Хотя поддержка APM там тоже есть — оставлена для обратной совместимости.

В общем, ветвление логики в скрипте zzz ради поддержки APM уже очень давно не актуально.

Помимо проверки на ACPI/APM, в скрипте есть еще проверка на «sleep state» — состояние засыпания, причем оно еще проверяется на поддерживаемость через чтение системной настройки.

Все это безусловно красиво и замечательно, но потенциально может приводить к фатальным ошибкам, а самое главное — к разному поведению при использовании zzz и acpiconf (см. ниже).

Поэтому я реализовал собственную и сокращенную версию этого скрипта:

#!/bin/sh

PATH=/sbin:/usr/sbin:/usr/bin:/bin
# execute ACPI style suspend command
exec acpiconf -s 3

exit 1

Тут стоит пояснить, что актуальны для ноутбуков только состояния S3 и S4, работающего на практике S1 или S2 не видел ни разу.

Состояние S4 отвечает за «hibernate» (suspend to disk) — выключение устройства, с предварительным сбрасыванием состояния памяти на диск.

Нетрудно прикинуть, что если (для примера) в машине установлено 64Гб оперативной памяти — на диск будет записан файл примерно такого размера, который еще должен быть успешно записан на диск до отключения питания.

А потом считан обратно при просыпании.

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

Короче этот самый «хибернейт» хреново работает даже в Windows, так что использовать его во FreeBSD — откровенно дурная идея.

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

Поэтому если оставить в скрипте чтение «sleep state» из аргумента — можно налететь на то что ноутбук попытается уйти именно в хибернейт по событию из DBus.

Чаще всего такое происходит при низком заряде батареи, поскольку во многих окружениях задано поведение по-умолчанию в виде запуска «suspend to disk».

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

Так что считаю важным жестко зашить в этом скрипте именно S3.

acpiconf

Следующая остановка — утилита еще более низкого уровня, непосредственно погружающая машину в сон, называется acpiconf.

Полный путь: /usr/sbin/acpiconf.

Это уже не шелл-скрипт а полноценный бинарник, нативное приложение, которое дергает системные вызовы ОС для запуска процесса засыпания.

Именно оно вызывается из описанного выше скрипта zzz.

По идее достаточно использовать это приложение для помещения ноутбука в сон:

acpiconf -s 3

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

rc.suspend

Теперь стоит рассказать про скрипт /etc/rc.suspend, отвечающий во FreeBSD за погружение машины в сон по событию из devd.

Да, его я тоже модифицировал, моя версия выглядит вот так:

#!/bin/sh
#
subsystem=$1
state=$2

if [ -r /var/run/rc.suspend.pid ]; then
	exit 1
fi

echo $ 2> /dev/null > /var/run/rc.suspend.pid

. /etc/rc.subr

load_rc_config

/bin/sync && /bin/sync && /bin/sync
/bin/sleep 1

/bin/rm -f /var/run/rc.suspend.pid

/usr/sbin/zzz

exit 0

Ключевое отличие (помимо удаления оповещения сервисов) в том что дергается скрипт zzz, который в свою очередь вызывает acpiconf, но с параметром -s 3 т.е с непосредственным вызовом процесса засыпания.

А в оригинале стоял вот такой вызов:

# Notify the kernel to continue the suspend process
/usr/sbin/acpiconf -k 0

Тут стоит пояснить важный нюанс.

Дело в том что параметр -k 0 на самом деле «грязный хак», позволяющий вклиниться в уже запущенный процесс засыпания, который как предполагается уже начат снаружи и вызов acpiconf -k 0 лишь дергает программный триггер, оповещающий систему что можно наконец спокойно заснуть.

Как лаконично написано в документации (man acpiconf):

Most users should not use this option directly.

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

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

Но разумеется можете попробовать самостоятельно подергать крышкой ноутбука или послать несколько команд засыпания через DBus одновременно — чтобы убедиться на собственном опыте как оно работает.

Процесс просыпания

В отличие от засыпания, процесс возвращения из сна фактически неконтролируемый — вас просто ставят перед фактом что система проснулась.

А если нет — то нет, увы.

Поэтому скрипт /etc/rc.resume отрабатывает только после полного успешного просыпания системы.

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

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

Если повезет — будет настройка в BIOS, где такую реакцию можно отключить.

История с Lid

Во всех BSD-системах есть специальный параметр, который отвечает за обработку закрытия крышки ноутбука, во FreeBSD он называется:

hw.acpi.lid_switch_state

Если поставить этому параметру значение:

sysctl hw.acpi.lid_switch_state=S3

то при закрытии крышки ноутбука произойдет засыпание.

Технически отработает событие закрытия крышки ноутбука, по которому devd запустит тот самый /etc/rc.suspend скрипт.

Но мой опыт показывает, что вся эта красота того не стоит:

процесс засыпания — сложный и может сломаться в любой момент, на него влияют даже запущенные программы и общая нагрузка на CPU и память.

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

Что люди делают сразу после закрытия крышки ноутбука?

Правильно:

кладут его в рюкзак или еще какое узкое пространство без кислорода и вентиляции.

Что будет дальше?

Перегрев и выход из строя.

И все, конец.

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

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

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

Веселое будущее

Как обычно внезапно оказалось, что весь этот концепт с «suspend state» успел устареть и в последних поколениях ноутбуков теперь полностью новое API (S0ix), пока не поддерживаемое FreeBSD.

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

Все мои железки

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

Причем большая их часть отсутствует в официальном списке совместимого оборудования (HCL) и мало того — по некоторым вообще нет упоминаний в сети, что данная конкретная модель работает хотя-бы с Linux.

Так что материал в некотором смысле уникальный.

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

Lenovo Z580

Используется с 2012 года.

Обзор на эту модель можно посмотреть тут, машинка несет верную службу уже очень давно, сменив:

корпус, клавиатуру, экран, процессор, дискретную видеокарту и память.

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

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

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

Добавлю, что в оригинале корпус был серым, но после того как был разбит (окончательно) и встала необходимость замены — ремонтники подогнали редкий красный вариант:

Дружите с ремонтниками и ваше железо будет в ажуре.
Дружите с ремонтниками и ваше железо будет в ажуре.

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

Легко добраться и до памяти (отдельная крышка на двух болтах) и до дисков — вместо CD/DVD-ROM вставляются салазки со вторым диском.

Короче перед вами идеальная полевая машина для тотальной кибервойны, эдакий УАЗик от ноутбуков.

На борту две видеокарты:

дискретная NVIDIA и встроенная Intel.

Поскольку карту NVIDIA я не использую (во FreeBSD), она автоматически отключается при запуске специальным скриптом.

При этом модуль ядра для карты NVIDIA должен быть установлен и загружен.

В противном случае при восстановлении из сна может произойти зависание системы.

Дискретная карта называется GeForce GT 640M, поддерживается драйвером nvidia-driver-304.

Еще ноутбук не всегда возвращается из сна с текущей версией модуля drm-kmod, частью которого является драйвер для встроенных видеокарт от Intel, поэтому необходимо использовать более старый drm-515-kmod.

Суммарно в /etc/rc.conf должно быть так:

kld_list="i915kms nvidia acpi_video acpi_call"

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

В /boot/loader.confу меня следующие настройки:

hw.i915kms.reset=1

kern.vt.deadtimer=60
hw.usb.no_suspend_wait=1
kern.vt.suspendswitch=0
hw.syscons.sc_no_suspend_vtswitch=1

hw.pci.do_power_nodriver=3

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

ThinkPad L390

Используется с 2019 года.

Более-менее современный «ультрабук» в моей коллекции, обзор модели находится тут.

Как и большинство ультрабуков, аппарат фактически неразборный — поменять диск, память или батарею можно только силами ремонтников в мастерской, вскрывать корпус самостоятельно не советую — он на защелках, которые легко отламываются.

Но память тут не впаяна, поэтому ее объем можно увеличить заменой планок.

Про эту модель могу сказать две важные для BSD-шника вещи, одну хорошую, а вторую (по традиции) — плохую.

Из хорошего:

практически все железо в нем работает с FreeBSD «из коробки», без дополнительных плясок с бубном и настроек.

Работает видео (i1915kms), звук и даже bluetooth.

Единственное что не удалось завести — считыватель отпечатков пальцев, который внезапно тут тоже есть.

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

% cat /boot/loader.conf

compat.linuxkpi.i915_disable_power_well="0"

А теперь о плохом:

для работы WiFi-карты нужен Wifibox, иначе карта перестает работать после просыпания и часто сбоит при загрузке системы после перезагрузки из Windows или Linux.

Вот такие печальные дела.

Детальная статья про Wifibox и его настройку находится тут, ниже показываю как выглядит /etc/rc.conf с отключенными «нативными» модулями для этой WiFi-карты:

devmatch_blocklist="if_iwm if_iwlwifi"
dbus_enable="YES"
devd_enable="YES"
kld_list="fusefs i915kms"

Fujitsu Lifebook U554

Используется с 2014 года.

Редкая для РФ модель ультрабука, на момент покупки имевшая самую долгую работу от батареи (14 часов, больше было только у Macbook), обзор можно посмотреть тут.

На фото видно сильно затертый корпус, частично металлический. Так это второй корпус, то есть он был заменен — вот что бывает, когда на ноутбуке действительно работают.

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

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

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

После обновления корпуса, мой девайс получил в качестве бонуса от ремонтников еще и тачскрин — стало можно водить пальцем по экрану, работает как большой тачпад.

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

На борту встроенная видеокарта от Intel, поэтому используется модульi915kms в /etc/rc.conf:

kld_list="i915kms acpi_video"

Также требуется отключить засыпание системной консоли:

kern.vt.suspendswitch=0

Для Xorg выставлен драйвер modesetting но с указанием старого DRI (опять для Chrome и его багов отрисовки).

Файл /etc/X11/xorg.conf.d/10-modesetting.conf:

Section "Device"
  Identifier    "ModeSetting"
  Driver        "modesetting"
  Option	"DRI"	"1"
EndSection

Еще в ноутбуке установлена довольно проблемная WiFi-карта:

AR9462 Atheros Wireless Network Adapter

которая требует полного сброса, параметр в /boot/loader.conf:

dev.ath.0.hal.force_full_reset=1

Но конечно самый проблемный девайс в этом ноутбуке это тачпад:

eGalax Inc. eGalaxTouch EXC7910-1131-43.00.00

Он требует специальной правки ядра и дополнительной настройки в Xorg для правильной работы.

Настройка для Xorg в файле /etc/X11/xorg.conf.d/30-touchpad.conf:

Section "InputClass"
        Identifier "libinput touchpad catchall"
        Driver "libinput"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"        
        
        Option          "AccelProfile"          "adaptive"
        Option          "DisableWhileTyping"    "True"
        Option          "MiddleEmulation"       "True"
        Option          "ScrollMethod"          "edge"
        Option          "Tapping"               "True"
        Option          "TappingDrag"           "False"
        Option          "TappingDragLock"       "False"
        
        Option "AccelSpeed" "0.53"
        Option "ClickMethod" "clickfinger"
        Option "HorizontalScrolling" "off"
        Option "LeftHanded" "off"
        Option "NaturalScrolling" "off"
    
EndSection

Также стоит добавить, что как и на большинстве других ультрабуков — память (8Гб) тут впаяна на материнскую плату, поэтому расширению не поддается.

Настолько часто и долго использовался, что стерся даже фирменный логотип Thinkpad
Настолько часто и долго использовался, что стерся даже фирменный логотип Thinkpad

Lenovo T440

Используется с 2016 года.

Боевая классика и настоящая «машинка апокалипсиса», на которой спокойно уживаются все три основных BSD: NetBSD, OpenBSD и FreeBSD.

И два линукса. И куча виртуалок и эмуляторов.

И все железно работает, причем годами.

Неубиваемый аппарат с прочной клавиатурой, который автор таскает с собой в походы и покатушки на 150км.

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

Батареи аж две, внутренняя к сожалению не поддается замене (т.к. впаяна), зато внешняя — на защелках и легко меняется в голом поле, без разбора корпуса.

К сожалению сам разбор затруднен, поскольку корпус опять на защелках (которые легко ломаются ага), поэтому быстро поменять диски или память не выйдет — только в мастерской и с помощью ремонтников.

Эта модель очень популярна среди BSD-разработчиков, поэтому все что касается процесса засыпания работает из коробки.

Причем во всех трех BSD.

Но я все же добавил ряд настроек для уменьшения потребления батареи в файл /boot/loader.conf:

hw.i915kms.enable_dc=0
hw.usb.no_boot_wait=1
compat.linuxkpi.i915_disable_power_well="0"

И немного настроек в /etc/sysctl.conf для модуля i915kms:

hw.i915kms.enable_guc="1"
hw.i915kms.modeset="1"
hw.i915kms.fastboot="1"
hw.i915kms.disable_power_well="0"
hw.i915kms.enable_dc="0"
hw.i915kms.enable_fbc="1"
hw.i915kms.enable_psr="0"
hw.i915kms.enable_psr2_sel_fetch="0"
hw.i915kms.panel_use_ssc="0"
hw.i915kms.nuclear_pageflip="1"
# да, он тут тоже нужен
kern.vt.suspendswitch=0

Как видите, тут опять необходим отключенный параметр kern.vt.suspendswitch, без которого видеокарта (вместе с ноутбуком) не всегда возвращается из сна.

Также я добавил настройку DRI, поскольку браузер Chromium в какой-то момент взял в привычку выдавать визуальные артефакты при отрисовке WebGL-сцен, файл /etc/X11/xorg.conf.d/20-intel.conf:

Section "Device"
 Identifier "Intel Graphics"
 Driver "modesetting"
 Option "AccelMethod" "UXA"
 Option "TearFree" "true"
 Option "DRI" "3"
EndSection

ASUS F3KE

Используется с 2023 года.

Ноутбук с непростой судьбой, попавший в мои руки случайно и крайне необычным образом:

для одной сцены с дракой (автор когда-то занимался с настоящими каскадерами) хотели красиво разбить в кадре какое-нибудь компьютерное оборудование.

Так что я попросил знакомых ремонтников (Дима, Лена привет), которые занимались обслуживанием моего «железного зоопарка» выдать что-нибудь ненужное из электроники — на убой.

Они выдали это.

Сцена в итоге так и не состоялась — съемки отменили, зато аппарат остался и недолго думая решил вернуть его к жизни:

вместо устаревшего HDD был вставлен SSD, заменена батарейка BIOS и основная батарея.

Оказалось китайские аналоги батарей для столь древней модели до сих пор продаются!

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

Такие дела.

Что же касается поддержки *BSD и Linux — скажу откровенно, что это точно не лучший девайс для подобных задач.

Если только вы не мазохист, с особо изысканным вкусом.

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

Если только вам в 2025 году вдруг не понадобится встроенный 56K-модем или инфракрасный порт.

В качестве вишенки на торте из геммороя, в ноутбуке используется известное «скотское комбо»:

AMD вместо процессора плюс Radeon вместо видеокарты.

И то и другое хреново работает с открытыми системами даже по отдельности а вместе, в одном компьютере превращается в натуральный ад.

Спасает только почтенный возраст:

за 20 лет успели наконец сделать открытые работающие драйвера даже для комбинации из AMD и Radeon, естественно с минимальной поддержкой 3D-ускорения.

Зато без необходимости ковырять закрытые прошивки из далекого прошлого.

Разумеется с настройкой ACPI в этом чудовище чуде пришлось серьезно разбираться, поэтому полная настройка описана в отдельной статье, тут.

Ниже пройдусь только по тем настройкам, которые имеют отношение к процессу засыпания.

Для начала настройка Xorg, файл/etc/X11/xorg.conf.d/20-radeon.conf:

Section "Device"
    Identifier "Card0"
    Driver     "modesetting"
    Option "TearFree" "true"    
EndSection

Опция TearFree нужна как обычно только для Chromium и его дурацких шуток с отрисовкой.

В /boot/loader.conf:

# DO NOT WAIT FOR USB DEVICES FOR ROOT (/) FILESYSTEM
hw.usb.no_boot_wait=1  

# POWER OFF DEVICES WITHOUT ATTACHED DRIVER
hw.pci.do_power_nodriver=3

kern.vt.suspendswitch=0
kern.vt.deadtimer=60

compat.linuxkpi.enable_fbc=0
hw.acpi.override_isa_irq_polarity=1

Dell G3

Используется с 2018 года.

Последний в списке, но точно не последний в ежедневном использовании, огромный аппарат от Dell c 17' экраном. Обзор на эту модель можно посмотреть тут.

Оказалось, что серия активно развивается и продается до сих пор, однако стоит отметить, что разница между конкретными моделями внутри серии зачастую огромна — выпускаются ноутбуки одной серии с 17' или 15' экранами, с i7 или i5 процессорами, с сильно разным объемом памяти, разными видеокартами и так далее.

Собственно даже моя покупка этого ноутбука изначально была ошибкой — хотел взять модель с 15' экраном поскольку она меньше и легче, но банально ошибся при заказе.

Так что выбирать конкретную модель стоит тщательно.


Поставить FreeBSD на этот ноутбук удалось далеко не сразу, несмотря даже на тот факт, что с ним сразу шла установленная Ubuntu Linux в качестве ОС по-умолчанию.

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

обновлены диски, вставлено 64Гб памяти и более мощная видеокарта.

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

Главная засада с этой моделью это WiFi-карта (опять), которая снова требует приседаний с Wifibox для нормальной работы и восстановления после пробуждения.

Без этого, со стандартными драйверами, Wifi-карта либо подвисает и перестает подавать признаки жизни, либо ноутбук зависает целиком.

На борту конечно же две видеокарты (17' гробов с одной видеокартой не бывает): 

дискретная от NVIDIA и встроенная Intel

Работает этот «тандем» заметно лучше чем в описанном выше Z580 и не требует каких-либо серьезных заморочек с настройкой.

Все что я сделал, это указал id карты (отображается в выводе pciconv -lv) и добавил стандартный блок с modesetting:

cat /etc/X11/xorg.conf.d/intel.conf 

Section "Device"      
	Identifier  "Card1"
	Driver      "modesetting"
	BusID       "PCI:0:2:0"
EndSection

В /boot/loader.conf была добавлена минимальная настройка — для обхода известного бага, а также подгрузка модуля vmm, которого требует сам Wifibox для работы:

vmm_load="YES"
compat.linuxkpi.i915_disable_power_well="0"

В /etc/rc.confлишь настройка для отключения стандартных драйверов и инициализации Wifibox:

devmatch_blocklist="if_iwm if_iwlwifi"
wifibox_enable="YES"
ifconfig_wifibox0="SYNCDHCP"
background_dhclient_wifibox0="YES"
defaultroute_delay="0"

kld_list="fusefs i915kms nvidia"

Также снова необходимо отключить засыпание TTY-консолей:

kern.vt.suspendswitch=0

Эпилог

Большая часть задач системного администратора, сетевого инженера, пентестера, тестировщика, DevOps и даже технического менеджмента вроде CTO не требует сверхсовременного или мощного оборудования.

Поэтому тема с использованием в работе 10-летних ноутбуков — формально устаревших, но отлично работающих врядли потеряет актуальность в ближайшем будущем.

Мне, как и большинству коллег, в первую очередь требуются надежность и безотказность а не погоня за гигагерцами, объемами памяти и прочими признаками элитности и успешности.

Так что плашки «Pro» и «Extreme» можете налепить себе на лоб или еще какое интересное место.

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

И надо сказать, мой подход давно себя оправдал.

P.S.

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

Если вы также используете FreeBSD на ноутбуках — делитесь в комментах вашим опытом.

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


  1. JBFW
    04.10.2025 08:37

    Если вы живете не в лесу с оленями и не являетесь носителем радикальных сисадминских взглядов, исключащих из системы «все ненужное» — в вашей домашней FreeBSD будут работать сервисы DBus и devd, через события в которых и будет происходить запуск процесса засыпания.

    Вот он, корень зла! )

    Когда я еще использовал FreeBSD на ноутбуке - "такой фигни не было!" (с) - всё прекрасно засыпало по захлопыванию крышки, насколько помню - без особого шаманства. Хотя давненько это было.

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