Эта небольшая заметка кратко описывает настройку FreeBSD 12.1 для работы на Lenovo ThinkPad X220 — чтобы не забыть неочевидные действия, выполняемые после установки системы. Используемый ThinkPad из 2011 года — из тех времён, когда ещё использовался приличный дизайн от IBM – с синим Enter и семирядной клавиатурой.

В заметке используются материалы из следующих мест:

Корректное отображение ~ в пути, в приглашении bash

Поскольку все домашние каталоги пользователей расположены по пути /usr/home/, а /home/ лишь символическая ссылка на вышеуказанный каталог – в приглашении командной строки \w будет заменяться не на ~/catalog_name, а на /usr/home/catalog_name.

Чтобы путь к каталогу внутри домашнего каталога имел в своём начале ~, нужно установить в качестве домашнего каталога пользователя прямой путь к нему — /usr/home/, а не символическую ссылку — /home/. Делается это через sudo chsh username.

Минимальный набор групп для доступа к устройствам ноутбука

  • wheel — нужен для sudo;
  • video – для доступа к /dev/dri/card*;
  • webcamd — для доступа к веб-камере.

Управление питанием

Настройки для /etc/rc.conf:

powerd_enable="YES"
powerd_flags="-a hiadaptive -b adaptive -M 2000"
performance_cx_lowest="Cmax"
economy_cx_lowest="Cmax"

В /boot/loader.conf добавить:

cpufreq_load="YES"
kern.hz=100

Благодаря этим настройкам ноутбук станет более медленным, но энергосберегающим при работе от батареи. И наоборот — при работе от сети.

Звук

Нужно загружать модуль snd_hda при старте системы — для этого добавляем в /boot/loader.conf:

snd_hda_load="YES"

Для переключения между динамиками и наушниками нужно добавить в /boot/device.hints:

hint.hdaa.0.nid20.config="as=1 seq=0 device=Speaker"
hint.hdaa.0.nid21.config="as=1 seq=15 device=Headphones"

Управление яркостью

В /boot/loader.conf надо добавить это:

acpi_ibm_load="YES"
acpi_video_load="YES"

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

Вторая строка загружает модуль с помощью которого можно управлять яркостью экрана через sysctl, обращаясь к hw.acpi.video.lcd0.brightness.

Мультимедиа-клавиши

Сначала надо проверить, что модуль acpi_ibm уже загружен в системе.

После этого нужно добавить в /etc/devd.conf следующие строки, чтобы devd научился ловить нажатия на Fn кнопки и отсылать их в наш скрипт:

notify 10 {
    match "system" "ACPI";
    match "subsystem" "IBM";
    action "/etc/acpi_thinkpad.sh $notify";
};

Неполное содержимое скрипта /etc/acpi_thinkpad.sh:

#!/bin/sh

ACPI_EVENT="$1"

case "$ACPI_EVENT" in
    '0x04')
        /usr/sbin/zzz
        ;;
esac

Посмотреть скан-коды клавиш можно остановив devd и запустив его из консоли от рута с ключом -d.

Тачпад и трекпойнт

Для начала надо включить поддержку Synaptics touchpad и трекпойнта в /boot/loader.conf:

hw.psm.synaptics_support=1
hw.psm.trackpoint_support=1

Пакет xf86-input-synaptics должен быть удалён — вместо него должен быть установлен пакет xf86-input-evdev.

Этого достаточно для работы тачпада и трекпойнта и средней кнопки над тачпадом. Заодно будет работать и прокрутка при нажатии на среднюю кнопку.

Мне удобен весьма чуствительный трекпойнт и для этого в /etc/systcl.conf должны быть следующие строки:

hw.psm.trackpoint.sensitivity=150
hw.psm.trackpoint.upper_plateau=125

Веб-камера

Нужно произвести следующие изменения в следующих файлах:

/boot/loader.conf:

cuse_load="YES"

/etc/rc.conf:

webcamd_enable="YES"

/etc/sysctl.conf:

kern.evdev.rcpt_mask=12

После, добавить пользователя в группу webcamd:

sudo pw groupmod webcamd -m <username>

Сон

Для начала должен быть загружен модуль acpi_ibm.

Переход в режим сна делается командой: acpiconf -s 3 от рута. Либо же, можно использовать команду zzz.

Включение drm-kmod

Нужно установить пакет graphics/drm-kmod. Затем, надо включить загрузку модуля i915kms.ko добавлением следующей строки в /etc/rc.conf:

kld_list="${kld_list} /boot/modules/i915kms.ko"

Wi-Fi

Нужно добавить в /boot/loader.conf:

if_iwn_load="YES"
wlan_wep_load="YES"
wlan_ccmp_load="YES"
wlan_tkip_load="YES"

Потом, добавить в /etc/rc.conf:

wlans_iwn0="wlan0"
ifconfig_wlan0="WPA DHCP powersave"
create_args_wlan0="country RU regdomain NONE"

Для работы с WiFi-сетями нужно установить пакет wpa_supplicant и добавить в начало /etc/wpa_supplicant.conf:

ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
fast_reauth=1

Разное

Можно добавить в /boot/loader.conf:

autoboot_delay="2"
kern.maxproc="100000"
kern.ipc.shmseg="1024"
kern.ipc.shmmni="1024"
cpuctl_load="YES"
coretemp_load="YES"
libiconv_load="YES"
libmchain_load="YES"
cd9660_iconv_load="YES"
msdosfs_iconv_load="YES"

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

Чтобы при загрузке системы DHCP client не тормозил весь процесс — можно внести в /etc/rc.conf следующую строку:

background_dhclient="YES"

Для монтирования разделов вручную пользователем, отключения системного динамика и т.п. — можно добавить в /etc/sysctl.conf следующее:

vfs.read_max=128
vfs.usermount=1
hw.syscons.bell=0
kern.vt.enable_bell=0

Обновление 2024-04-28

На данный момент в моем Thinkpad’е используется coreboot вместо BIOS, к материнской плате припаяна плата AGAN X230 для 2K-дисплея, а в качестве ОС используется FreeBSD 14.0. В связи со всем этим, я добавил обновление к статье:

Корректная работа режима сна

Из коробки, режим сна работал странно. Команда sudo zzz успешно уводила ноутбук в сон, потом он просыпался и даже успевал показать экран с i3wm, но потом что-то вызывало команду shutdown -h now и ноутбук выключался обычным образом. Перешерстив кучу постов на форуме FreeBSD я нашёл тему, где у человека ноутбук от HP в принципе не уходил в режим сна, но советы оттуда внезапно помогли и мне.

В /etc/sysctl.conf надо было добавить следующие строки:

hw.pci.do_power_suspend=0
hw.pci.do_power_nodriver=1

А в /boot/loader.conf вот эти:

hint.p4tcc.0.disabled="1"
hint.acpi_throttle.0.disabled="1"

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

Чтобы ноутбук засыпал при закрытии крышки, как и раньше, в /etc/sysctl.conf понадобилось добавить ещё одну строчку:

hw.acpi.lid_switch_state=S3

Вывод лога загрузки на «второй» 2K-монитор

Coreboot с SeaBIOS payload и загрузчик FreeBSD дружат очень плохо. Настолько плохо, что на экране сверху будет отображаться узкая полоска чего-то вроде видеопомех, вместо интерфейса загрузчика и лога загрузки.

К счастью, поправить это достаточно просто. Сначала, надо вслепую, после запуска загрузчика, нажать на Esc, а потом ввести команду vbe on и нажать на Enter. После этого, загрузчик переключит видеорежим и на экране отобразится его консоль.

Дальше, уже можно спокойно загрузиться в систему командой boot и надо будет добавить следующие настройки в /boot/loader.conf:

hw.vga.textmode="0"
kern.vty=vt
i915kms_load="YES"
vbe_max_resolution=2560x1440

Уменьшение количества сообщений при загрузке

В /boot/loader.conf добавить:

boot_mute="YES"

А в /etc/rc.conf:

rc_startmsgs="NO"

Энергосбережение для видеокарты

В /boot/loader.conf добавить строки:

drm.i915.enable_rc6="7"
drm.i915.semaphores="1"
drm.i915.intel_iommu_enabled="1"

Intel 8260

В ноутбуке теперь стоит аналог WiFi-карты Intel 8260 и настраивать его надо через iwlwifi, а не через iwn, который в основном для старых карт.

Настройка WiFi весьма проста. Ничего в /boot/loader.conf прописывать не надо. А в /etc/rc.conf надо прописать лишь несколько строк:

kld_list="${kld_list} if_iwlwifi"
wlans_iwlwifi0="wlan0"
ifconfig_wlan0="WPA DHCP mode 11g"
ifconfig_wlan0_ipv6="inet6 accept_rtadv"
create_args_wlan0="wlanmode sta regdomain none country RU"

Звук и coreboot

После замены оригинального BIOS на coreboot поменялись nID для звуковой карты и совет выше, из раздела Звук, перестал работать. Как и аудио в наушниках, подключенных через 3.5 мм джек.

Список доступных nID можно увидеть в выводе команды:

dmesg | grep pcm

В итоге, звук в наушниках появился, после добавления таких строк в /boot/device.hints:

hint.hdaa.0.nid31.config="as=1 seq=0 device=Speaker"
hint.hdaa.0.nid35.config="as=1 seq=15 device=Headphones"

Глитчи в GUI

Спустя какое-то время работы у меня возникали чёрные квадраты и (изредка) полосы на экране. Как оказалось, надо установить драйвер от Intel:

sudo pkg install xf86-video-intel

И создать файл /usr/local/etc/X11/xorg.conf.d/10-intel.conf со следующим содержимым:

Section "Device"
        Option     "ShadowFB"               "False"
        Identifier  "Card0"
        Driver      "modesetting"
        BusID       "PCI:0:2:0"
EndSection

Разное (2)

Для большей отзывчивости десктопа под высокой нагрузкой, я добавил в /etc/sysctl.conf:

kern.sched.preempt_thresh=224

Настройки, связанные с производительностью сетевого стека в /boot/loader.conf:

net.link.ifqmaxlen="2048"
cc_htcp_load="YES"

Поддержка дока:

acpi_dock_load="YES"