Как стать автором Подводим итоги сезона Data Mining и награждаем лучших дата-оккультистов Все потоки Разработка Администрирование Дизайн Менеджмент Маркетинг Научпоп
checkpoint 21 августа в 03:06
Операционная система FreeBSD на ноутбуке Lenovo
Системное администрирование **nix *
Tutorial
В этой статье я хочу поделиться с общественностью некоторыми аспектами настройки и эксплуатации операционной системы FreeBSD при установке на современный ноутбук с целью использования его как основного рабочего места инженера (программиста, электронщика или конструктора). В своих предыдущих статьях я упоминал, что являюсь тонким ценителем этой ОС и с некоторых пор организовал своё рабочее место под управлением FreeBSD, о чем ни сколько не пожалел, и даже наоборот — мои волосы теперь по-настоящему мягкие и шелковистые.
Моя статья посвященная настройке САПР КОМПАС-3D под FreeBSD получила ряд одобрительных комментариев, поэтому мне захотелось продолжить тему «FreeBSD на десктопе». К тому же, есть добрые предпосылки — недавно я приобрел новый современный ноутбук Lenovo Ideapad 3 Gaming взамен окончательно рассыпавшегося на несколько частей Asus VX7, а с ним и массу приятного и затейливого опыта установки и настройки ОС FreeBSD для работы на новом «железе». В этой статье я не будут касаться установки и настройки специализированного ПО и прочих САПР, будет рассмотрен только системный вопрос: установка операционной системы, драйверов, патчей, библиотек, настройка и борьба с железом. Будет много выдержек из системного руководства (мануала – man) — уж сильно я к нему пристрастился за последние 130 лет.
Ссылка на статью в формате PDF для “офф-лайн” прочтения
В этом выпуске:
3. Установка ОС FreeBSD и первые звоночки
4. Апдейт и апгрейд ОС FreeBSD
5. «Фатальная» особенность оболочки tcsh
6. Несколько слов о системной документации
8. Менеджмент пакетов в ОС FreeBSD
9. Замечание по структуре каталогов в ОС FreeBSD
11. Проверка работоспособности компилятора и системы сборки
14. Управление электропитанием
14.2 Настройка управления частотой центрального процессора
15. Настройка шедулера и прочих параметров ядра ОС
16.1 Установка и настройка сетевого драйвера iwm
16.2 Тестирование сетевого интерфейса с драйвером iwm
16.3 Установка, настройка и тестирование драйвера iwlwifi
16.4 Апгрейд ядра ОС FreeBSD до 13-STABLE и обратно до 13.1-RELEASE
17. Установка графической подсистемы X11
18. Настройка Xorg в режиме scfb
19. Заставляем работать TouchPad
21. Настройка раскладки клавиатуры в Xfce4
22. Проблема потери настроек клавиатуры после suspend/resume
23.1 Технология «PRIME GPU Offloading»
23.2 Установка драйвера для NVIDIA GPU
23.3 Установка DRM драйвера для AMD GPU
23.4 Установка драйвера к AMD GPU для X сервера Xorg
23.5 Настройка Xorg на работу с 3D ускорителем AMD GPU
23.6 «Гибридный режим» – запуск вспомогательного Xorg для работы с акселератором NVIDIA GeForce
24. Тестирование 3D ускорителей
26. Установка automount для съёмных носителей и настройка поддержки кириллицы
27. Разное про FreeBSD и не только
28. Основные сайты для посещения
1. Аппаратный вопрос
Для начала немного слов про выбор ноутбука. Опыт эксплуатации FreeBSD на моём старом ноутбуке Asus VX7 показал, что при приобретении нового ПК нужно тщательнейшим образом подходить к выбору аппаратуры на которой этой ОС предстоит работать. Ни для кого не является секретом то, что во FreeBSD с драйверами дела обстоят несколько кхм… похуже чем в Linux и на то есть свои причины — команда разработчиков этой ОС достаточно небольшая, вокруг системы нет такого количество сторонних комиттеров как в Linux, а система проходит почти незамеченной крупными игроками в IT индустрии и у производителей аппаратуры. В общем, драйвера к ней создаются либо отъявленными энтузиастами, либо по целевому финансированию от компаний бизнес которых выстроен вокруг FreeBSD. По большей части финансируются разработки драйверов сетевых и дисковых адаптеров, так как FreeBSD, в подавляющем большинстве случаев, используется на тяжело нагруженных серверах, а о поддержке «десктопа» мало кто думает.
Справедливости ради стоит заметить, что такой известный производитель видео карт с GPU как NVIDIA регулярно выпускает билды драйверов к своим видюхам в том числе и для FreeBSD amd64. Вот только вокруг изделий этой фирмы сложилась странная аура неприязни к качеству их продукции и многие фрюховоды и линуховоды настоятельно рекомендуют GPU от AMD в качестве альтернативы.
Так как новые ПК я приобретаю не часто, то хотелось взять сразу такой, чтоб навсегда. Ну или хотя бы лет на пять. И чтоб был очень очень производительный и при этом не грелся как чайник. И, разумеется, чтобы не дорогой. И удобный. Полистав глянцевые страницы интернет-журналов с обозреванием современных ноутбуков я пришел к выводу, что мне нужен ноутбук на процессоре AMD Ryzen 5, 7 или даже 9. Так получилось, что ноутбук я приобретал в марте 2022г, когда ценник на всю вычислительную технику резко взлетел вместе с курсом доллара. Прикинув остатки барышей я понял, что Ryzen 5 — мой выбор. В магазинах имелся на тот момент достаточно богатый выбор ноутбуков на этом процессоре, в том числе от известных брендов (Asus, Dell, MCI), но моё внимание привлек незатейливый ноут от Lenovo под названием Ideapad 3 Gaming. Привлёк он меня вот чем:
1. У Lenovo Ideapad 3 Gaming очень приятная на ощупь клавиатура (приятный клик) и с правильной раскладкой. Нет, кнопку «windows» на нём не ликвидировали, но в остальном расположение клавиш очень годное и мне привычное. В BIOS есть фича которая из бесполезной кнопки Fn делает еще один LeftCtrl — при работе в командной строке это благодать.
2. Процессор AMD Ryzen 5 5600H работающий на частоте 3293.96 MHz со встроенным видео ускорителем Radeon Graphics — всё как рекомендовано лучшими фрюховодами.
3. Второй (дискретный) GPU NVIDIA GeForce RTX 3050. Таким образом получается два GPU и вроде как оба поддерживаются во FreeBSD.
4. SSD диск объемом 238 GiB производства Samsung с интерфейсом NVMe — хоть и не большой по объему, но должен быть очень быстрый.
В остальном, достаточно стандартная начинка.
Не сильно долго размышляя, но и не торопясь я поехал в ближайший магазин и приобрел этот ноут, а к нему дополнительно оперативной памяти – суммарным объемом получилось 24 GiB. Так же приобрел запасной блок питания на 170 W. Во-первых, у ноута нестандартный разъем питания (прямоугольный, чем-то похож на USB type A), а блоки питания имеют свойство быстро дохнуть. Во-вторых, приятно иметь по отдельному БП дома и на работе, чтобы не носить с собой лишний груз.
Привез я это все домой, плотно поужинав и уложив детей спать, принялся в спокойной ночной обстановке под музыку в стиле Sovietwave устанавливать операционную систему. Повторюсь, моя цель — сделать на ноутбуке полноценное рабочее место с преферансом и куртизанками на базе ОС FreeBSD.
2. О версиях ОС FreeBSD
Первая версия ОС FreeBSD увидела свет в ноябре 1993 года и имела номер 1.0R. Это был «fork» версии ОС 386BSD разрабатываемой в калифорнийском университете в Berkley группой программистов Berkley Software Distribution (BSD), которая в свою очередь являлась переносом ОС 4.4BSD на платформу i386. Номер версии операционной системы FreeBSD некоторое время был многозначным (например 1.1.5.1 или 2.0.5), но с версии 6.0 разработчики перешли на двухзначное обозначение номера версии. Буква «R» в конце означает «release» («релиз» – выпуск) и чуть позже её заменили на суффикс обозначающий готовность системы к изнурительному труду. На данный момент имеется четыре суффикса, а значит четыре состояния готовности:
- Суффикс -RСx указывает на версию системы подготовленную к релизу (т. н. «release candidate X» – «релиз кандидат»), но еще не совсем дозревшую. Обычно, перед релизом может быть выпущено несколько кандидатов, которые тестируются широким кругом пользователей и вносятся незначительные корректировки. Например: 13.1-RC5 означает, пятый по счету кандидат в релизы перед выпуском версии 13.1.
- Суффикс -RELEASE означает, что система стабильная и надежная как гранит и является очередным выпуском (релизом). Например, ОС FreeBSD 13.1-RELEASE рекомендована к установки на высоко нагруженные вычислительные системы.
- Суффикс -STABLE означает, что в системе имеются кое-какие изменения относительно релиза, не всегда сказывающиеся в лучшую сторону на её стабильности. Например, могут присутствовать новые, не до конца отлаженные драйверы или патчи к проблемам безопасности «на скорую руку». К версии -STABLE нужно относится с некоторым вниманием, потому как не все патчи одинаково полезны.
- И на конец суффикс -CURRENT указывает на то, что данная версия – это самое последнее достижение в разработке системы, т. е. экспериментальная версия системы со всеми нововведениями. Данная версия рекомендуется только для разработчиков системы, для экспериментаторов или бета-тестеров. На момент написания данной статьи, таковой являлась версия FreeBSD 14-CURRENT.
3. Установка ОС FreeBSD и первые звоночки
Инсталляционный образ FreeBSD (на тот момент 13.0-RELEASE) был мной уже ранее выкачан и записан на USB носитель, загрузка с которого прошла без особых проблем. Для желающих попробовать FreeBSD привожу ссылку на официальную инструкцию для версии 13.1-RELEASE: https://www.freebsd.org/releases/13.1R/announce/
Сам процесс инсталляции тривиальный. Инсталлятор задаст несколько вопросов: как распределить дисковое пространство, какие системные пакеты установить, предложит настроить сеть и завести первого пользователя, а так же предложит установить пароль для системного пользователя root. Обычно от настройки сети на этом этапе я отказываюсь, так как могут быть нюансы.
Доверившись инсталлятору я разбил диск по-умолчанию, т. е. все файловые системы в одном разделе и запустил установку. Инсталлировал полный комплект вместе с портами, исходными текстами ядра и системных утилит – опыт подсказывал, что исходники обязательно понадобятся. Новой машине дал название butterfly, завел себе пользователя rz, добавил его в группу wheel и на этом – всё.
Тут следует заметить, что установка FreeBSD происходит целиком и полностью в консольном (текстовом) режиме. Более того, базовая установка не предполагает установки каких либо графических подсистем, т. е. после загрузки ОС по окончанию инсталляции Вы получаете сообщение «Добро пожаловать» и промпт «login:»от одноименной утилиты. В общем, эталон минимализма.
После перезагрузки и входа в систему сразу выяснилось, что система не обнаружила Wi-Fi карту MediaTek MT7961, но обнаружила Ethernet карту RealTek RTL8168 и это уже порадовало — значит я смогу продолжить доустановку системы. Вот, что об имеющихся в ноутбуке сетевых адаптерах говорит утилита pciconf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
rz@butterfly:~ % su Password: <пароль root-а> root@butterfly:/home/rz # pciconf -levc ... re0@pci0:2:0:0: class=0x020000 rev=0x15 hdr=0x00 vendor=0x10ec device=0x8168 subvendor=0x17aa subdevice=0x3909 vendor = 'Realtek Semiconductor Co., Ltd.' device = 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller' class = network subclass = ethernet bar [10] = type I/O Port, range 32, base 0x2000, size 256, enabled bar [18] = type Memory, range 64, base 0xd1704000, size 4096, enabled bar [20] = type Memory, range 64, base 0xd1700000, size 16384, enabled ... none1@pci0:3:0:0: class=0x028000 rev=0x00 hdr=0x00 vendor=0x14c3 device=0x7961 subvendor=0x17aa subdevice=0xe0bc vendor = 'MEDIATEK Corp.' class = network bar [10] = type Prefetchable Memory, range 64, base 0xfc02000000, size 1048576, enabled bar [18] = type Prefetchable Memory, range 64, base 0xfc02100000, size 16384, enabled bar [20] = type Prefetchable Memory, range 64, base 0xfc02104000, size 4096, enabled cap 10[80] = PCI-Express 2 endpoint max data 128(128) FLR RO NS max read 512 link x1(x1) speed 5.0(5.0) ASPM L1(L0s/L1) ClockPM enabled cap 05[e0] = MSI supports 32 messages, 64 bit, vector masks cap 01[f8] = powerspec 3 supports D0 D1 D2 D3 current D0 ecap 000b[100] = Vendor [1] ID 1556 Rev 1 Length 8 ecap 0018[108] = LTR 1 ecap 001e[110] = L1 PM Substates 1 ecap 0001[200] = AER 2 0 fatal 0 non-fatal 0 corrected |
Немного погуглив, я выяснил, что поддержка адаптера MT7961 появилась в ядре Linux совсем недавно, с версии 5.13, а это давало понять, что во FreeBSD её можно не ждать в ближайшие годы. Очевидно, что в таком случае самый простой способ сделать поддержку Wi-Fi на этом ноутбуке это купить новый Wi-Fi адаптер (из списка подерживаемых) и попросту заменить, благо ноутбук легко разбирается и карта адаптера доступна для замены.
Тем временем решил двигаться далее. Легким движением руки настроил сеть путем добавления в системный конфигурационный файл /etc/rc.confодной строки ifconfig_re0=”DHCP”, для этого воспользовался следующими командами:
1 |
root@butterfly:/home/rz # echo 'ifconfig_re0="DHCP"' >> /etc/rc.conf |
А чтобы система приняла мои изменения, я выполнил команду:
1 |
root@butterfly:/home/rz # /etc/netstart |
по завершению которой убедился в готовности сетевого интерфейса командой ifconfig re0:
1 2 3 4 5 6 7 8 |
root@butterfly:/home/rz # ifconfig re0 re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE> ether 7c:8a:e1:a5:9e:03 inet 192.168.172.110 netmask 0xffffff00 broadcast 192.168.172.255 media: Ethernet autoselect (100baseTX <full-duplex>) status: active nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> |
и принялся доустанавливать систему и инсталлировать требуемые мне пакеты.
О системе пакетов я расскажу более подробно чуть позже, а сейчас установлю первый пакет – это будет утилита sudo, она позволяет избавиться от необходимости постоянно висеть в оболочке (шелле) от имени суперпользователя. Для этого используем следующую команду:
root@butterfly:/home/rz # pkg inst --yes sudo && rehash
После установки sudo необходимо подредактировать конфигурационный файл с помощью специальной утилиты visudo (устанавливается вместе с пакетом sudo), в файле требуется раскомментировать или добавить строку вида:
%wheel ALL=(ALL:ALL) ALL
После чего сохранить изменения и выйти из visudo. Если Вы используете редактор vi, что наиболее вероятно, то требуется нажать следующую последовательность клавиш: <ESC>:wq<ENTER>
Наличие данной строки в конфигурационном файле утилиты sudo позволит получать привилегии суперпользователя всем пользователям которые входят в группу wheel. Напомню, что я внес себя в группу wheel при инсталляции.
4. Апдейт и апгрейд ОС FreeBSD
Сразу после установки базового комплекта ОС FreeBSD, не плохо бы проапгрейдиться до последней версии, так как развернутый образ системы на моей USB флешке уже слегка залежавшийся. Для этих целей во FreeBSD имеется специальной средство — утилита freebsd-update, которая является универсальным средством для обновления системы. Данная утилита позволяет выполнять следующие задачи:
- Обновить текущую систему и установить критические обновления (патчи) без смены номера версии ОС.
- Обновить систему на более новую версию (minor version update).
- Обновить систему на более новую ветку (major version update).
Во всех случаях утилита freebsd-update выкачивает и устанавливает набор обновлений к ядру ОС, к системным утилитам и системным библиотекам в бинарном виде. Происходит это в два этапа: 1) выкачивание патчей и подготовка новых версий ядра, утилит и библиотек к установке, и 2) собственно установка, и, по необходимости, перезагрузка системы и дальнейшая доустановка.
Небольшое замечание: устанавливать обновление к ядру ОС утилита freebsd-update будет только в том случае, если Вы используете конфигурацию ядра по-умолчанию (ядро GENERIC). Если же на Вашей машине используется своё, кастомное ядро, то сборку ядра и его установку после обновления придется выполнить вручную, но утилита выкачает и применит все необходимые патчи к исходным кодам ядра.
Выкачивание критических обновлений осуществляется по команде:
1 2 3 4 5 6 7 8 9 10 11 12 |
rz@butterfly:~ % sudo freebsd-update fetch Password: <пароль пользователя rz> Looking up update.FreeBSD.org mirrors... 2 mirrors found. Fetching metadata signature for 13.0-RELEASE from update1.freebsd.org... done. Fetching metadata index... done. Inspecting system... done. Preparing to download files... done. The following files will be updated as part of updating to 13.1-RELEASE: /boot/kernel/kernel /usr/lib/debug/boot/kernel/kernel.debug (END) q |
Прежде всего утилита sudo попросит Вас авторизоваться – ввести пароль пользователя (rz), после чего она запустит утилиту freebsd-update. Далее утилита freebsd-update сообщит о том, какие патчи она выкачала и предложит просмотреть список. Меня в этом списке всё устраивает, поэтому я нажимаю q для выхода.
Установить выкачанные обновления можно командой:
rz@butterfly:~ % sudo freebsd-update install
Повторное использование утилиты sudo больше не просит ввода пароля — она запомнила его на некоторое время, таким образом избавив пользователя (меня) от необходимости постоянно вводить его при активной работе и настройке системы.
Если после установки обновлений что-то пошло не так, то по команде freebsd-update rollback можно откатиться к предыдущему состоянию системы, в том числе вернуть старую версию ядра ОС и выполнить перезагрузку (если требуется).
Так как утилита freebsd-update работает накопительным образом, т. е. постепенно выкачивает и складывает накопленные патчи, то рекомендуется добавить ежедневный вызов freebsd-update из cron-а. Cron это фоновый процесс который запускает другие процессы по расписанию. Запустить редактор таблицы cron можно командой:
rz@butterfly:~ % sudo crontab -e
Утилита crontab запустит редактор vi и предложит Вам отредактировать пустой файл, в него нужно добавить строку вида:
1 |
@daily<TAB>root<TAB>freebsd-update cron |
Здесь <TAB> это символ табуляции. Сохранить изменения и выйти из редактора vi.
Это позволит ежедневно выкачивать все критические обновления и накапливать их в локальной системе. Установить накопленные обновления можно в любой удобный момент по команде sudo freebsd-update install.
Апгрейд операционной системы со сменой номера версии немного более сложен и происходит в три фазы. Для выполнения апгрейда нужно знать номер версии системы (с суффиксом) до которой предполагается выполнить этот апгрейд, при этом возможно делать не только повышение номера версии, но и понижение. Список поддерживаемых версий ОС FreeBSD можно подсмотреть на сайте проекта: https://www.freebsd.org, другой метод мне не известен.
В обоих случаях операция смены версии ОС достаточно рисковая и не плохо бы позаботиться о резервной копии важных данных (как минимум файла с паролями). Так как ОС FreeBSD только что установленная на мой ноутбук еще не представляет никакой ценности, то смело выполним апгрейд системы до версии 13.1-RELEASE следующей командой:
rz@butterfly:~ % sudo freebsd-update upgrade -r 13.1-RELEASE
По этой команде утилита freebsd-update, во-первых проверит наличие в репозитории указанной версии ОС, во-вторых проверит целостность установленной системы и подготовит список патчей, а так же сообщит какие компоненты отсутствуют в системы, т. е. не будут изменяться. После подтверждения пользователя, утилита выкачает все требуемые патчи и подготовит их к установке. На этом заканчивается первая фаза. Дальнейшая установка производится, как обычно, по команде:
rz@butterfly:~ % sudo freebsd-update install
По команде install утилита freebsd-update выполнит установку нового ядра и системных библиотек и потребуется перезагрузки операционной системы. Это конец второй фазы.
Выполним перезагрузку командой reboot, дождемся окончания загрузки ОС, войдем в систему и перейдем к третьей фазе – продолжим доустановку повторным вводом команды:
rz@butterfly:~ % sudo freebsd-update install
по завершению которой не плохо бы еще раз перезагрузить систему с цель проверки её работоспособности и отсутствия проблем с загрузкой модулей. Всякое бывает!
Проверить текущую версию установленной ОС FreeBSD можно командой:
1 2 |
rz@butterfly:~ % freebsd-version 13.1-RELEASE |
либо традиционным способом:
1 2 |
rz@butterfly:~ % uname -a FreeBSD butterfly 13.1-RELEASE FreeBSD 13.1-RELEASE releng/13.1-n250148-fc952ac2212 GENERIC amd64 |
5. «Фатальная» особенность оболочки tcsh
Кто-то уже наверное обратил внимание, что в приводимых мной командах в качестве приглашения (промпта) командной строки используется символ % (процент) в вместо привычного многим символа $ (денежной единицы) – это признак того, что мы имеем дело с оболочкой tcsh.
В ОС FreeBSD, как и у остальных операционных систем группы BSD, традиционно используется командная оболочка типа C-Shell (csh, tcsh), вместо Bourne и Bourne Again Shell (bash) распространенных в среде ОС Linux. Отличия этих оболочек весьма существенные и я почти на 100% уверен, что пользователи привыкшие к bash будут долго плеваться от tcsh и, в конечном счете, просто установят bash из пакетов. Так, как я вырос на BSD, то мне видится всё наоборот — tcsh гораздо удобнее и приятнее в работе. В частности, в tcsh «из коробки» работает авторасширение и поиск по истории команд с помощью клавиш перемещения курсора «вверх» и «вниз». При этом, в отличии от bash, где тоже есть такая функция, поиск идет по части уже введенной команды. В bash так же присутствует данная фича, но реализована она крайне убого. Хотя, уверен, я просто плохо знаю bash.
Но в этой главе я хотел бы рассказать не о достоинствах и недостатках двух разных оболочек, в конце концов это дело привычки, а об одной особенности оболочки tcsh о которую буквально спотыкаются все новые пользователи FreeBSD. Дело в том, что tcsh по-умолчанию, в отличии от bash, не переиндексирует список исполняемых файлов в доступных путях описанных переменной окружения $PATH каждый раз при вызове внешней команды. Это приводит тому, что после окончания установки какого либо нового пакета, допустим компилятора С/C++, введя команду cc мы рискуем получить сообщение об ошибке типа:
cc: Command not found.
Для переиндексации внутренней hash-таблицы у оболочки tcsh есть встроенная команда rehash, которую следует вводить каждый раз при появлении в путях нового исполняемого файла, вот так:
1 2 3 4 |
rz@butterfly:~ % rehash rz@butterfly:~ % cc cc: error: no input files |
Для пользователей Linux это может показаться странным и неудобным, но на самом деле это не так и я объясню почему. Представьте, что Вы работаете на относительно медленной аппаратуре и у Вас в файловой системе располагаются сотни тысяч файлов (привет embedded разработчикам). Каждый раз когда Вы вводите команду, или нажимаете клавишу TAB, оболочка bash проводит поиск исполняемого файла по всем подкаталогам указанным в переменной окружения $PATH. Если файлов много, то это выражается в явной задержке, иногда очень даже надоедливой. В оболочке tsch по-умолчанию включен поиск по hash-таблице и поэтому tcsh выглядит более динамично (особенно при активном использовании клавиши TAB). Поиск по таблице можно выключить командой unhash или снова включить командой hash, а обновить таблицу командой rehash. О оболочке bash все строго наоборот.
6. Несколько слов о системной документации
Если верить словам Брайна Кернига из его книги «Время UNIX: A History and Memoir», то разработанная узким кругом программистов в Bell Labs ОС UNIX была преподнесена руководству компании как инструмент для обработки документации. Да, это был такой хитрый план Томпсона, Кернигана, Ричи и других обитателей «комнаты UNIX» для того, чтобы выбить финансирование на новую машину PDP-11 для их инициативной разработки, ибо старенькая PDP-7 уже порядком разваливалась и не удовлетворяла потребностям коллектива по развитию ОС UNIX. План сработал, а ОС UNIX дала миру такие средства как roff/ntoff, troff и ditroff для обращения с документацией как со структурированными взаимосвязанными данными. На базе языка troff была организована и внутрисистемная документация по командам и утилитам в самой ОС UNIX, для обращения к которой была введена команда man (от «manual») и расширенный язык для описания страниц руководства – mdoc.
Следуя лучшим традициям ОС UNIX в ОС FreeBSD на всё есть man-страницы, в том числе на системные и пользовательские утилиты, на приложения, на конфигурационные файлы, на API и ABI, на библиотеки и даже на драйверы устройств. Вообще, следует заметить, что по части системной документации и различных руководств для пользователя ОС FreeBSD нет равных. Важно и то, что в ОС FreeBSD непрерывно поддерживается целостность этой документации! Во многих ОС на базе Linux тоже есть команда man, но по большей части присутствует она там номинально и в некоторых случаях содержимое её страниц позаимствовано из FreeBSD. Среди пользователей группы операционных систем BSD есть негласное правило: если не знаешь с какой стороны подступиться к проблеме — начни с чтения различных man-ов и узкая тропинка будет становиться все шире и приведет тебя к решению проблемы. А легенда гласит, что известный термин RTFM возник именно в отношении к man-ам. 😉
Давайте выясним, какую информацию может предоставить нам man в ОС FreeBSD, для этого введем следующую команду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
rz@butterfly:~ % man man MAN(1) FreeBSD General Commands Manual MAN(1) NAME man – display online manual documentation pages SYNOPSIS man [-adho] [-t | -w] [-M manpath] [-P pager] [-S mansect] [-m arch[:machine]] [-p [eprtv]] [mansect] page ... man -f keyword ... man -k keyword ... DESCRIPTION The man utility finds and displays online manual documentation pages. If mansect is provided, man restricts the search to the specific section of the manual. The sections of the manual are: 1. FreeBSD General Commands Manual 2. FreeBSD System Calls Manual 3. FreeBSD Library Functions Manual 4. FreeBSD Kernel Interfaces Manual 5. FreeBSD File Formats Manual 6. FreeBSD Games Manual 7. FreeBSD Miscellaneous Information Manual 8. FreeBSD System Manager's Manual 9. FreeBSD Kernel Developer's Manual |
Страница по man сообщает нам формат команды man и её параметров, а так же выдает нам ряд интересной справочной информации о номерах секций системной документации и их назначении. Видно, что в системе присутствует девять секций (категорий) с различными руководствами, в том числе по разработке ядра ОС (9) и по играм (6) – как же без них! 🙂
Давайте выясним, что системе известно про сетевой адаптер RealTek 8168 установленный в моём новом ноутбуке и как вообще этот драйвер называется. Для этого введем команду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
rz@butterfly:~ % apropos realtek re, if_re(4) - RealTek 8139C+/8169/816xS/811xS/8168/810xE/8111 PCI/PCIe Ethernet adapter driver rgephy(4) - RealTek RTL8168/8169/8110/8211 series 10/100/1000 Gigabit Ethernet PHY driver rl, if_rl(4) - RealTek 8129/8139 Fast Ethernet device driver rsu, if_rsu(4) - Realtek RTL8188SU/RTL8192SU USB IEEE 802.11b/g/n wireless network device rsufw(4) - Firmware Module for Realtek driver rtsx(4) - Realtek SD card reader rtwn(4) - Realtek IEEE 802.11 wireless network driver rtwn_pci, if_rtwn_pci(4) - Realtek PCI device glue rtwn_usb, if_rtwn_usb(4) - Realtek USB device glue rtwnfw(4) - Firmware Module for Realtek Wireless driver rue, if_rue(4) - RealTek RTL8150 USB to Fast Ethernet controller driver ure, if_ure(4) - RealTek RTL8152/RTL8153 USB to Ethernet controller driver urtw, if_urtw(4) - Realtek RTL8187B/L USB IEEE 802.11b/g wireless network device |
Команда apropos производит поиск строки символов (без учета регистра) по всем man-страницам зарегистрированным в системе и выдает сокращенный список страниц на которых есть упоминание заданной строки текста. В данном случае мы получили список всех man-страниц с упоминанием про RealTek.
Из вывода команды apropos видно, что для имеющегося у меня сетевого адаптера используется два драйвера: драйвер re для самого Ethernet адаптера подключенного к шине PCIe и драйвер rgephy для управления трансивером (Ethernet PHY). В выводе команды apropos в скобках указан номер секции (категории) руководства.
Давайте посмотрим, что содержится в 4-й секции руководства по драйверу re:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
rz@butterfly:~ % man 4 re RE(4) FreeBSD Kernel Interfaces Manual RE(4) NAME re – RealTek 8139C+/8169/816xS/811xS/8168/810xE/8111 PCI/PCIe Ethernet adapter driver SYNOPSIS To compile this driver into the kernel, place the following lines in your kernel configuration file: device miibus device re Alternatively, to load the driver as a module at boot time, place the following line in loader.conf(5): if_re_load="YES" DESCRIPTION The re driver provides support for various NICs based on the RealTek RTL8139C+, RTL8169, RTL816xS, RTL811xS, RTL8168, RTL810xE and RTL8111 PCI and PCIe Ethernet controllers. ... |
Как видно, в руководстве приведена исчерпывающая информация о поддерживаемых моделях сетевых адаптеров и то, как этот драйвер установить. В данном случае предлагается два способа: 1) статический – вкомпилить драйвер в ядро операционной системы подправив конфигурационный файл ядра, и 2) динамический — дать указание загрузчику (bootloader-у) загружать соответствующий модуль. Второй вариант считается более предпочтительным, но так как в инсталлированном по-умолчанию ядре уже содержится этот драйвер, то никаких действий для его подключения от меня не потребовалось.
Давайте теперь спросим систему, что ей известно о сетевом адаптере MediaTek который не был автоматически обнаружен системой не смотря на то, что он присутствует в моём ноутбуке. Для этого введем команду:
1 2 |
rz@butterfly:~ % apropos mediatek apropos: nothing appropriate |
Система нам сообщает, что ничего конкретного про MediaTek она не знает. Печально. Что-ж, придется отказаться от MediaTek в пользу другого производителя.
7. Про FreeBSD Handbook
Проектом FreeBSD Documentation Project написана и постоянно актуализируется большая книга по ОС FreeBSD, которая называется «FreeBSD Handbook» (или просто «хэндбук»). Хендбук бесплатно распространяется с ОС FreeBSD в электронном виде в формате HTML, а так же доступен на сайте проекта, в том числе имеется версия на русском языке: https://docs.freebsd.org/ru/books/handbook/ которая немного отстает от англоязычной версии: https://docs.freebsd.org/en/books/handbook/
«FreeBSD Handbook» содержит огромный объём информации по установке, настройке и администрированию ОС FreeBSD. В отличии от внутрисистемной документации man-страниц, хэндбук не содержит справочной информации по командам и их ключам, а скорее представляет собой набор рецептов вида «как сделать то-то или как настроить что-то», при этом имеет четкую последовательность в повествовании – от простых тем к более сложным. «FreeBSD Handbook» уникальная книга, написана понятным языком и легко читается как художественная литература «на ночь, перед сном» – настоятельно рекомендую!
Прошу обратить внимание на то, что если в очередном релизе операционной системы что-то меняется или какая-то из стандартных операций претерпевает изменения, то соответствующие изменения вносятся и в хэндбук для этой версии ОС. Поэтому будьте внимательны и обращайте внимание на версию хэндбука который Вы читаете.
Помимо хэндбука, по ОС FreeBSD написаны и другие книги, так же доступные в электронном виде, их список можно посмотреть тут: https://docs.freebsd.org/en/books/
Существует печатная версия хэндбука, а на сайте FreeBSD Mall в продаже находится 3-е издание хэндбука за $7 описывающее FreeBSD версии 4.x и 5.x — несколько старовато, но для начинающих рекомендую к прочтению, да бы полностью погрузиться в этот страшный подземный мир FreeBSD.
На этом же сайте есть в продаже еще одна, совсем свежая, книга – FreeBSD Mastery: ZFS за $23. Не читал, но одобряю.
Еще одна печатная книга по «потрохам» ОС FreeBSD: «Design and Implementation of the FreeBSD Operating System, 2nd Edition» за авторством МакКузика и сотоварищей. Цена кусачая – $65 на Амазоне, но книга очень стоящая, особенно для студентов изучающих операционные системы и системное программирование. К этой книге МакКузик выпустил курс видео-лекций в составе 12 видеороликов по одному часу. Лекции платные, но для затравки на Youtube доступна первая часть: FreeBSD Kernel Internals, Dr. Marshall Kirk McKusick
8. Менеджмент пакетов в ОС FreeBSD
Так же, как и у многих дистрибутивов ОС Linux, у ОС FreeBSD есть свой репозиторий с огромным количеством портированных под неё свободных (open source) программ, библиотек и всего прочего, что у нас называют аббревиатурой СПО. На момент написания данной статьи количество этого СПО составляло 38 487 единиц. Однако, в отличии от большинства Linux дистрибутивов, в ОС FreeBSD есть целых два репозитория: первый называется FreeBSD Ports Collection или в простонародье – «порты», содержит он исходные коды портированных на FreeBSD свободных программ, набор соответствующих патчей к ним и Makefile-ы для сборки (компиляции). Патчи прикладываются к оригинальным исходным кодам автоматически в процессе сборки соответствующего порта, чтобы он без проблем компилировался и исполнялся в среде ОС FreeBSD. Во FreeBSD, как минимум, своя специфическая структура каталогов и почти все программы требуется пропатчить на соответствие этой структуре, но об этом чуть позже. Все порты разбиты на категории и подкатегории и на машине пользователя представляют собой набор Makefile-ов который хранится в хорошо структурированном подкаталоге /usr/ports/. Набор этих файлов можно установить в процессе инсталляции системы либо скачать отдельно. Управление портами осуществляется с помощью утилиты portsnap, цитирую:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
rz@butterfly:~ % man portsnap PORTSNAP(8) FreeBSD System Manager's Manual PORTSNAP(8) NAME portsnap – fetch and extract compressed snapshots of the ports tree SYNOPSIS portsnap [-I] [-d workdir] [-f conffile] [-k KEY] [-l descfile] [-p portsdir] [-s server] command ... [path] DESCRIPTION The portsnap tool is used to fetch and update compressed snapshots of the FreeBSD ports tree, and extract and update an uncompressed ports tree. In a normal update operation, portsnap will routinely restore modified files to their unmodified state and delete unrecognized local files. |
Второй репозиторий содержит так называемые пакеты (packages). Это уже скомпилированные и готовые к работе пакеты программ, библиотек и всего того, что есть в портах, в бинарном виде. Пакет как правило содержит некоторое количество метаданных о себе: краткое и полное описание содержимого, адрес и имя мантейнера, а так же список зависимостей от других пакетов. Для управления пакетами предназначена утилита pkg, цитата:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
rz@butterfly:~ % man pkg PKG(8) FreeBSD System Manager's Manual PKG(8) NAME pkg, pkg-static – manipulate packages SYNOPSIS pkg [-v] [-d] [-l] [-N] [-j ⟨jail name or id⟩ | -c ⟨chroot path⟩ | -r ⟨root directory⟩] [-C ⟨configuration file⟩] [-R ⟨repository configuration directory⟩] [-4 | -6] ⟨command⟩ ⟨flags⟩ pkg [--version] [--debug] [--list] [-N] [--jail ⟨jail name or id⟩ | --chroot ⟨chroot path⟩ | --rootdir ⟨root directory⟩] [--config ⟨configuration file⟩] [--repo-conf-dir ⟨repository configuration directory⟩] [-4 | -6] ⟨command⟩ ⟨flags⟩ DESCRIPTION pkg provides an interface for manipulating packages: registering, adding, removing and upgrading packages. pkg-static is a statically linked variant of pkg typically only used for the initial installation of pkg. |
Утилита pkg отслеживает список зависимостей, доустанавливает необходимые пакеты или удаляет неиспользуемые пакеты и файлы при деинсталляции какого-то пакета. Фактически это аналог RPM пакетов в ОС Linux, но есть нюансы. Один из них состоит в том, что репозиториев с пакетами не один, а целых два: latest и quarterly — первый содержит самые новые изменения в пакетах (новые пакеты, самые последние патчи и обновления к ним), а второй отстает от первого по времени на четверть года, т. е. содержит более стабильные и объезженные версии пакетов. Но и это еще не все. Для каждой поддерживаемой версии FreeBSD ведется свой набор репозиториев с пакетами (свой latest и quarterly) и они не совпадают друг с другом. Файл конфигурации /etc/pkg/FreeBSD.conf указывает какой именно репозиторий будет использован утилитой pkg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
rz@butterfly:~ % cat /etc/pkg/FreeBSD.conf # $FreeBSD$ # # To disable this repository, instead of modifying or removing this file, # create a /usr/local/etc/pkg/repos/FreeBSD.conf file: # # mkdir -p /usr/local/etc/pkg/repos # echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf # FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly", mirror_type: "srv", signature_type: "fingerprints", fingerprints: "/usr/share/keys/pkg", enabled: yes } |
При установке ОС FreeBSD «с нуля» соответствующий файл будет создан инсталлятором автоматически, он будет настроен на репозиторий quarterly для нашей версии FreeBSD. Так как меня интересует свежачок, то я создал аналогичный файл, но в другом месте файловой системы (обратите внимание, об этом сказано в комментарии) и в нём изменил значение параметра url на “pkg+http://pkg.FreeBSD.org/${ABI}/latest”:
1 2 3 4 5 6 7 8 |
rz@butterfly:~ % cat /usr/local/etc/pkg/repos/FreeBSD.conf FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest", mirror_type: "srv", signature_type: "fingerprints", fingerprints: "/usr/share/keys/pkg", enabled: yes } |
Здесь переменная ${ABI} задает версию FreeBSD и подставляется автоматически утилитой pkg.
И так, краткий справочник по команде pkg от Кэпа:
1. Обновление репозитория:
% sudo pkg update
2. Поиск пакета по текстовому описанию:
% pkg search <some_text>
3. Установка пакета по его имени:
% sudo pkg install <package>
# переустановка:
% sudo pkg install -f <package>
4. Апгрейд пакета на его более новую версию:
% sudo pkg upgrade <package>
5. Снос пакета:
% sudo pkg delete <package>
6. Просмотр списка установленных пакетов:
% pkg info
7. Просмотр информации об установленном пакете:
% pkg info <package>
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
rz@butterfly:~ % pkg info zip-3.0_1 zip-3.0_1 Name : zip Version : 3.0_1 Installed on : Mon Mar 14 03:48:02 2022 +05 Origin : archivers/zip Architecture : FreeBSD:13:amd64 Prefix : /usr/local Categories : archivers Licenses : BSD3CLAUSE Maintainer : ler@FreeBSD.org WWW : http://infozip.sourceforge.net/Zip.html Comment : Create/update ZIP files compatible with PKZIP Options : DOCS : on Annotations : FreeBSD_version: 1300139 cpe : cpe:2.3:a:info-zip_project:zip:3.0:::::freebsd13:x64:1 repo_type : binary repository : FreeBSD Flat size : 739KiB Description : Zip is a compression and file packaging utility. It is compatible with PKZIP 2.04g (Phil Katz ZIP) for MSDOS systems. There is a companion to zip called unzip (of course) which you can also install from the ports/package system. WWW: http://infozip.sourceforge.net/Zip.html |
К слову, порты тоже отслеживают зависимости, поэтому запустив сборку, скажем, firefox из портов Вы рискуете выкачать и скомпилировать весь богатый мир СПО на своей машине, будьте готовы к такому повороту событий. 😉
Для прочтения хэндбука и посещения web сайтов из терминала нам понадобится утилита lynx которая представляет собой консольный web браузер. Установим её следующей командой:
1 2 3 4 5 6 7 8 |
rz@butterfly:~ % pkg search lynx ja-lynx-2.8.9.r1 Console WWW client (browser) with multi-byte encoding support ja-lynx-current-2.9.0.d4 Console WWW client (browser) with multi-byte encoding support (development release) libretro-beetle_lynx-0.20220327 Standalone port of Mednafen Lynx to libretro, itself a fork of Handy lynx-2.8.9.1_1,1 Non-graphical, text-based World-Wide Web client lynx-current-2.9.0d10 Console-based web browser (current/development version) rz@butterfly:~ % sudo pkg inst lynx-2.8.9.1_1,1 |
9. Замечание по структуре каталогов в ОС FreeBSD
Небольшое замечание по структуре дерева каталогов. В ОС FreeBSD идеологически постулируется, что всё, что устанавливается или изменяется суперпользователем должно располагаться в подкаталоге /usr/local. Так, бинарные файлы устанавливаемые утилитой pkg кладутся в подкаталог /usr/local/bin или /usr/local/sbin, библиотеки кладутся в /usr/local/lib, а файлы настроек и скриптов автозапуска в /usr/local/etc/ и /usr/local/etc/rc.d. Иными словами, данные пользователя не перемешиваются с данными системы. На первый взгляд это кажется несущественным, но это важный принципиальный момент, который отличает ОС FreeBSD от большинства дистрибутивов Linux.
Следствие у этого принципа такое: почти все конфигурационные файлы от устанавливаемых отдельно утилит (пакетов или портов) находятся в подкаталоге /usr/local/etc/, а не /etc/ как это принято в других подобных ОС.
10. Установка компилятора
Как любая UNIX-совместимая операционная система, операционные системы группы BSD разрабатывались программистами для программистов. А это означает, что основным инструментом пользователя, после командной оболочки, являются компиляторы с языков C, C++, FORTRAN и assembler, а так же утилиты для работы с ними. ОС FreeBSD унаследовала этот идеологический момент и преумножила его: предполагается, что всё, что окружает пользователь в системе должно быть собираемо из исходных кодов, от самого компилятора и ядра ОС до библиотек, системных утилит и приложений пользователя. Существование портов, собственно, и подтверждает данный тезис.
Одной из давних особенностей системы является то, что Вы можете установить самый минимум операционной системы на поддерживаемую аппаратную платформу, далее зайти в каталог /usr/src и ввести команду make buildworld, после чего система выкачает базовый компилятор, затем самые последние исходники компилятора, соберет его, а с его помощью соберет ядро и все остальные части системы, т. е. воссоздаст себя буквально из ничего. Разумеется тут есть масса нюансов и даже продвинутому пользователю вряд ли когда либо придется «создавать мир», тем не менее такая возможность имеется и она используется для тестирования нового «железа» или новой версии операционной системы на собираемость, совместимость и выносливость – если система не упала в «panic» в процессе сборки своего мира, то все в полном поряде!
Другой момент состоит в том, что некоторые редко используемые особенности системы требуют включения в ядро ОС определенных участков кода которые отключены по-умолчанию. И не смотря на то, что разработчиками ОС проделан большой труд по разделению частей монолитного ядра на отдельные загружаемые модули (Kernel Loadable Modules), пользователю всё еще может потребоваться сборка кастомного ядра и пересборка отдельных модулей/драйверов. Пересобрать ядро так же придется и при наложении определенных патчей связанных с безопасностью ОС или её стабильностью. По мимо этого, драйверы устройств для ОС FreeBSD часто поставляются в виде исходных кодов (NVIDIA).
Поэтому любому пользователю FreeBSD потребуется компилятор, точнее целый набор компиляторов и инструментария разработчика (toolchain), а так же некоторые знания как с этим добром обращаться. Начиная с версии 10-RELEASE, в ОС FreeBSD используется С/C++ toolchain на базе компилятора Clang (LLVM) вместо привычного, для многих пользователей ОС Linux, GNU Compiler Collection (GCC). Связано это в первую очередь с лицензией: лицензия GPLv3, которой покрывается компилятор GCC, противоречит идеалам BSD и создавала много трудностей для коммерческих применений FreeBSD. Цитата с известного сайта:
The primary reason for switching from GCC to Clang is the incompatibility of GCC’s GPL v3 license with the goals of the FreeBSD project. There are also political issues to do with corporate investment, as well as user base requirements. Finally, there are expected technical advantages to do with standards compliance and ease of debugging. Real world performance improvements in compilation and execution are code-specific and debatable; cases can be made for both compilers.
Откровенно говоря, тезис на счет лицензионной несовместимости весьма спорный. Почему-то лицензия GPLv3 не мешает никому предлагать свои проприетарные разработки на основе Linux даже без открытия кода, почему же это вдруг стало проблемой для BSD ? По этому поводу в интернетах написано много статей, много флейма на форумах, но ясности они не придают. Короче, в ОС FreeBSD используем Clang.
С точки зрения меня как программиста и разработчика, Сlang гораздо приятнее в обращении, но разрабатывать мне приходится всё равно под Linux и с использованием GCC.
Для установки Clang/LLVM 13.0.1 воспользуемся командой pkg search для поиска нужного нам пакета:
1 2 3 4 5 6 7 |
rz@butterfly:~ % pkg search llvm13 intel-compute-runtime-llvm13-22.24.23453 OpenCL implementation for Intel HD 5000 (Gen8) or newer intel-graphics-compiler-llvm13-1.0.11485 Intel Graphics Compiler for OpenCL llvm13-13.0.1_3 LLVM and Clang opencl-clang-llvm13-13.0.0 Clang wrapper to compile OpenCL C kernels to SPIR-V modules spirv-llvm-translator-llvm13-13.0.0 Bi-directional translation between SPIR-V and LLVM IR vc-intrinsics-llvm13-0.5.0 LLVM intrinsics for SIMD on GPU |
Видно, что в репозитории имеется несколько пакетов с подобным именем. Нас интересует сам компилятор, а значит будем устанавливать пакет llvm13-13.0.1_3:
rz@butterfly:~ % sudo pkg install llvm13-13.0.1_3
Утилита pkg проведет анализ зависимостей и предложит нам установить (или удалить и переустановить) некоторое количество пакетов от которых зависит пакет llvm13-13.0.1_3. И после получения подтверждения от пользователя запустит процесс выкачивания и установки пакетов, последним из которых будет сам llvm (Clang). Если Вы видите, что что-то пошло «не так», не бойтесь нажать Ctrl-C — ничего не сломается. В крайнем случае Вы всегда можете переустановить пакет командой pkg install -f.
После окончания установки убедимся, что компилятор присутствует в путях поиска исполняемых файлов и может быть вызван, так же не забываем про команду rehash:
1 2 3 4 5 6 7 |
rz@butterfly:~ % rehash rz@butterfly:~ % cc -v FreeBSD clang version 13.0.0 (git@github.com:llvm/llvm-project.git llvmorg-13.0.0-0-gd7b669b3a303) Target: x86_64-unknown-freebsd13.1 Thread model: posix InstalledDir: /usr/bin |
Для того, чтобы у нас была возможность вести сборку СПО, в том числе и из коллекции портов, нам потребуется утилита make, точнее её GNU разновидность (или GNU make). В ОС FreeBSD есть своя, родная утилита make родом из Berkley и известная как «BSD make» и она, как Вы догадываетесь, не совместима с «GNU make» которая сейчас широко используется в среде Linux. Так же нам потребуется еще пара широко применяемых утилит, а именно CMake и Git. Поэтому установим соответствующие пакеты одним вызовом команды pkg:
rz@butterfly:~ % sudo pkg inst gmake cmake git && rehash
Обратите внимание на то, что в данном случае я указываю только начальные строки названий пакетов, а вместо команды install даю её сокращенный вид inst. Всё это фичи утилиты pkg.
11. Проверка работоспособности компилятора и системы сборки
Проверим на сколько наша система готова к компиляции портов. Для этого пойдем в каталог /usr/ports/ и чего нибудь там соберем, например широко известную в узких кругах игру NetHack:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
rz@butterfly:~ % cd /usr/ports/games/nethack33-nox11/ rz@butterfly:/usr/ports/games/nethack33-nox11 % sudo make BATCH=yes !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! You may use the following build options: WITH_TTY_GRAPHICS=yes build with no GUI WITHOUT_X11=yes same as above By default, nethack port is built with X11 GUI. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ===> nethack33-nox11-3.3.1_11 depends on file: /usr/local/sbin/pkg - found => nethack-331.tgz doesn't seem to exist in /usr/ports/distfiles/. => Attempting to fetch https://downloads.sourceforge.net/project/nethack/nethack/3.3.1/nethack-331.tgz nethack-331.tgz 2989 kB 848 kBps 04s ===> Fetching all distfiles required by nethack33-nox11-3.3.1_11 for building ===> Extracting for nethack33-nox11-3.3.1_11 => SHA256 Checksum OK for nethack-331.tgz. ===> Patching for nethack33-nox11-3.3.1_11 ===> Applying FreeBSD patches for nethack33-nox11-3.3.1_11 from /usr/ports/games/nethack33-nox11/../nethack33/files ===> nethack33-nox11-3.3.1_11 depends on package: gmake>=4.3 - found ===> Configuring for nethack33-nox11-3.3.1_11 Copying Makefiles. ===> Building for nethack33-nox11-3.3.1_11 … … install -m 444 nethack.6 /usr/ports/games/nethack33-nox11/work/stage/usr/local/man/man6/nethack33.6 install -m 444 lev_comp.6 /usr/ports/games/nethack33-nox11/work/stage/usr/local/man/man6/lev_comp33.6 install -m 444 dgn_comp.6 /usr/ports/games/nethack33-nox11/work/stage/usr/local/man/man6/dgn_comp33.6 install -m 444 recover.6 /usr/ports/games/nethack33-nox11/work/stage/usr/local/man/man6/recover33.6 install -m 444 dlb.6 /usr/ports/games/nethack33-nox11/work/stage/usr/local/man/man6/dlb33.6 install -m 0644 /usr/ports/games/nethack33-nox11/work/nethack-3.3.1/doc/Guidebook.txt /usr/ports/games/nethack33-nox11/work/stage/usr/local/share/doc/nethack33 ====> Compressing man pages (compress-man) |
Из вывода видно, что по команде make BATCH=yes были прослежены зависимости, выкачаны и распакованы соответствующие distfiles – архивы с исходными кодами затаренные гнутым зипом, выкачаны и приложены ряд патчей, после чего запущена сборка и подготовка к инсталляции собранного порта.
Параметр BATCH=yes указывает системе сборки на то, что на все глупые вопросы следует отвечать утвердительно (Yes Man) и не отвлекать пользователя от наслаждения чашечкой горячего чая.
Далее, для того чтобы установить собранный порт выполним команду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
rz@butterfly:/usr/ports/games/nethack33-nox11 % sudo make install BATCH=yes ===> Installing for nethack33-nox11-3.3.1_11 ===> Checking if nethack33-nox11 is already installed ===> Registering installation for nethack33-nox11-3.3.1_11 Installing nethack33-nox11-3.3.1_11... ===> SECURITY REPORT: This port has installed the following binaries which execute with increased privileges. /usr/local/share/nethack33/recover /usr/local/share/nethack33/nethack33 If there are vulnerabilities in these programs there may be a security risk to the system. FreeBSD makes no guarantee about the security of ports included in the Ports Collection. Please type 'make deinstall' to deinstall the port if this is a concern. For more information, and contact details about the security status of this software, see the following webpage: http://www.nethack.org/ |
В процессе инсталляции, утилита install выдает нам сообщение о том, что ряд исполняемых файлов в составе этого порта могут выполняться с привилегиями отличными от пользовательских, что может быть небезопасно в случае обнаружения уязвимостей.
Выясним, что за привилегии:
1 2 3 |
rz@butterfly:/usr/ports/games/nethack33-nox11 % ll /usr/local/share/nethack33/recover /usr/local/share/nethack33/nethack33 -rwxr-sr-x 1 games games 1713664 Jul 9 17:01 /usr/local/share/nethack33/nethack33* -rwxr-sr-x 1 games games 19744 Jul 9 17:01 /usr/local/share/nethack33/recover* |
Видно, что установлен атрибут SGID, присвоены пользователь и группа games, т. е. игра NetHack исполняется от эффективного имени пользователя games. Будем считать что это относительно безопасно.
Если какой-то из установленных портов Вам покажется небезопасным, то его можно легко де-инсталлировать командой make deinstall из этого же каталога.
Любой порт можно установить повторно, дабы исправить поврежденные файлы, командой make reinstall (аналог команды pkg install -f для пакетов).
Проверим, запускается ли игра:
1 2 3 4 5 6 7 8 9 |
rz@butterfly:/usr/ports/games/nethack33-nox11 % rehash rz@butterfly:/usr/ports/games/nethack33-nox11 % nethack NetHack, Copyright 1985-2000 By Stichting Mathematisch Centrum and M. Stephenson. See license for details. Shall I pick a character for you? [ynq] q |
Вроде бы все в порядке, игра запускается, а значит компилятор и система сборки у нас работают нормально. Выйдем из NetHack нажав клавишу q и продолжим заниматься установкой и настройкой ОС FreeBSD.
К игре NetHack мы еще вернемся когда начнем устанавливать X11 и графическую оболочку Xfce. Так как процесс их установки не быстрый, то NetHack позволит нам немного расслабиться и провести время с пользой.
12. Утилита sysrc
Утилита sysrc позволяет безопасно (без внесения синтаксических ошибок) отредактировать системный конфигурационный файл из командной стоки. Вот, что сообщает нам страница системной документации по этой утилите:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
rz@butterfly:~ % man sysrc SYSRC(8) FreeBSD System Manager's Manual SYSRC(8) NAME sysrc – safely edit system rc files SYNOPSIS sysrc [-cdDeEFhinNqvx] [-s name] [-f file] [-j jail | -R dir] name[[+|-]=value] ... sysrc [-cdDeEFhinNqvx] [-s name] [-f file] [-j jail | -R dir] -a | -A sysrc [-E] [-s name] [-f file] -l sysrc [-eEqv] -L [name ...] DESCRIPTION The sysrc utility retrieves rc.conf(5) variables from the collection of system rc files and allows processes with appropriate privilege to change values in a safe and effective manner. |
Что-ж, очень полезно, возмём на вооружение!
13. Проблема с загрузчиком
В процессе установки одного из требуемых мне драйверов неожиданно обнаружилось, что во FreeBSD 13.0 и 13.1 есть баг приводящий к зависанию начального загрузчика (booloader-а) если в его конфиге (в файле /boot/loader.conf) присутствуют ссылки на любые модули. Честно сказать я не стал сильно долго разбираться с причинами такого поведения bootloader-а на моём ноутбуке, но сделал вывод, что загружать модули из /boot/loader.conf нельзя. Вместо этого я буду загружать их из rc скриптов, т. е. буду добавлять имена нужных мне для загрузки модулей в файл /etc/rc.conf в строку kld_list разделяя пробелом.
На случай если кто-то из будущих фрюховодов случайно наткнулся на эту проблему (то есть Ваша система намертво подвисла сразу после старта загрузчика или после загрузки какого-то «нерадивого» модуля), то сообщаю, что имеется способ загрузить «голое» ядро системы без попытки загрузки модулей загрузчиком. Делается это так:
- При загрузке в меню выбрать «3. Escape to loader prompt».
- В появившемся промпте Ok от загрузчика ввести следующие команды:
unload
load /boot/kernel/kernel
илиload /boot/GENERIC/kernel
Это проинструктирует загрузчик о том, что всё, что было записано и загружено через loader.conf нужно выгрузить и загрузить «голое» ядро GENERIC установленное при инсталляции ОС. Более подробно о процессе загрузки ОС FreeBSD и командах загрузчика читайте в статье хэндбука: https://docs.freebsd.org/en/books/handbook/boot/
14. Управление электропитанием
Управление электропитанием на ПК типа ноутбук является немаловажным компонентом системы и в ОС FreeBSD имеются все необходимые для этого средства. В частности, FreeBSD поддерживает промышленный стандарт управления электропитанием «Advanced Configuration and Power Management» (ACPI), для чего в ядре ОС имеется специальный драйвер — acpi.
14.1 Настройка режимов «сна»
Прежде всего ознакомимся со страницей руководства по драйверу acpi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
rz@butterfly:~ % man acpi ACPI(4) FreeBSD Kernel Interfaces Manual ACPI(4) NAME acpi – Advanced Configuration and Power Management support SYNOPSIS device acpi options ACPI_DEBUG options DDB DESCRIPTION The acpi driver provides support for the Intel/Microsoft/Compaq/Toshiba ACPI standard. This support includes platform hardware discovery (superseding the PnP and PCI BIOS), as well as power management (superseding APM) and other features. ACPI core support is provided by the ACPI CA reference implementation from Intel. Note that the acpi driver is automatically loaded by the loader(8), and should only be compiled into the kernel on platforms where ACPI is mandatory. SYSCTL VARIABLES The acpi driver is intended to provide power management without user intervention. If the default settings are not optimal, the following sysctls can be used to modify or monitor acpi behavior. Note that some variables will be available only if the given hardware supports them (such as hw.acpi.acline). |
Как следует из документации, драйвер acpi подгружается автоматически начальным загрузчиком (boot loader-ом), а текущие настройки и состояние подсистемы ACPI можно выяснить с помощью команды sysctl просмотрев дерево переменных MIB в ветке hw.acpi, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
rz@butterfly:~ % sysctl -a hw.acpi hw.acpi.acline: 1 # ←-- указывает на наличие внешнего электропитания. hw.acpi.battery.info_expire: 5 hw.acpi.battery.units: 1 hw.acpi.battery.state: 0 hw.acpi.battery.rate: 0 hw.acpi.battery.time: -1 hw.acpi.battery.life: 95 hw.acpi.cpu.cx_lowest: C8 hw.acpi.thermal.tz0._TSP: 20 hw.acpi.thermal.tz0._TC2: 2 hw.acpi.thermal.tz0._TC1: 1 hw.acpi.thermal.tz0._ACx: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 hw.acpi.thermal.tz0._CRT: 125.1C hw.acpi.thermal.tz0._HOT: -1 hw.acpi.thermal.tz0._PSV: -1 hw.acpi.thermal.tz0.thermal_flags: 0 hw.acpi.thermal.tz0.passive_cooling: 0 hw.acpi.thermal.tz0.active: -1 hw.acpi.thermal.tz0.temperature: 54.1C hw.acpi.thermal.user_override: 0 hw.acpi.thermal.polling_rate: 10 hw.acpi.thermal.min_runtime: 0 hw.acpi.reset_video: 0 hw.acpi.handle_reboot: 1 hw.acpi.disable_on_reboot: 0 hw.acpi.verbose: 0 hw.acpi.s4bios: 0 hw.acpi.sleep_delay: 1 hw.acpi.suspend_state: S5 hw.acpi.standby_state: NONE hw.acpi.lid_switch_state: NONE hw.acpi.sleep_button_state: S3 hw.acpi.power_button_state: S5 hw.acpi.supported_sleep_state: S3 S4 S5 |
Данная команда предоставляет много интересной информации о поведении операционной системы при различных условиях. Видно, что система и аппаратура поддерживает ряд состояний энергосбережения для режима «suspend» (режима «сна»), а именно состояния S3, S4 и S5. Из той же страницы руководства man acpi можно выяснить, что это за состояния:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
hw.acpi.supported_sleep_state Suspend states (S1–S5) supported by the BIOS. S1 Quick suspend to RAM. The CPU enters a lower power state, but most peripherals are left running. S2 Lower power state than S1, but with the same basic characteristics. Not supported by many systems. S3 Suspend to RAM. Most devices are powered off, and the system stops running except for memory refresh. S4 Suspend to disk. All devices are powered off, and the system stops running. When resuming, the system starts as if from a cold power on. Not yet supported by FreeBSD unless S4BIOS is available. S5 System shuts down cleanly and powers off. |
Т.е. операционная система и аппаратура на данном ноутбуке поддерживает состояния: «Suspend to RAM», «Suspend to disk» и «Power off» для команды перехода в режим «сна».
Настроим режим «сна» для нашей ОС. Состояние «Suspend to disk» (S4) в ОС FreeBSD не поддерживается если в ПК не установлен соответствующий BIOS, да и на системах с небольшим SSD это состояние мало интересно, так как потребуется зарезервировать огромную часть диска для образа RAM, а запись содержимого RAM на диск в процессе перехода в режим «сна» может занять достаточно длительное время. В общем, для режима «сна» у нас имеется практически только один вариант – «Suspend to RAM» (S3), поэтому установим значение MIB переменной hw.acpi.suspend_state в значение S3 следующей командой:
1 2 |
rz@butterfly:~ % sudo sysctl -w hw.acpi.suspend_state=S3 hw.acpi.suspend_state: S5 -> S3 |
Для того, чтобы эта переменная устанавливалась в нужное значение каждый раз при загрузки ОС, добавим эту переменную в файл /etc/sysctl.conf:
1 2 |
rz@butterfly:~ % su root@butterfly:/home/rz # echo hw.acpi.suspend_state=S3 >> /etc/sysctl.conf |
Так же я хочу установить значение переменной hw.acpi.power_button_state равное S3 чтобы мой ноутбук переходил в состояние «Suspend to RAM» при нажатии на кнопку питания (power button):
1 2 3 |
root@butterfly:/home/rz # echo hw.acpi.power_button_state=S3 >> /etc/sysctl.conf root@butterfly:/home/rz # sysctl -w hw.acpi.power_button_state=S3 hw.acpi.power_button_state: S5 -> S3 |
Аналогичным образом можно установить значение переменной hw.acpi.lid_switch_state которая задает состояние системы при закрывании крышки ноутбука. Для себя я оставлю эту переменную в состоянии NONE, т. е. без реакции — люблю слушать музыку с закрытым ноутбуком, чтобы дети по кнопкам не давили. 🙂
Проверим что у нас получилось. Сначала выполним два раза команду sync — ритуальное действие направленное на то, чтобы сбросить содержимое кэша файловой системы на диск на случай если операционная система решит «повеситься на мертво». После этого однократно и кратковременно нажмем кнопку «Power» на корпусе ноутбука. Примерно через 2 секунды мы увидим, что операционная система выдала ряд системных сообщений в dmesg, тут же погасила экран и подсветку клавиатуры, т. е. перешла в режим «сна». Попытаемся пробудить систему еще одним кратковременным нажатием кнопки «Power» – и, о чудо, через 1-2 секунды операционная система полностью возобновила работу и вернулась к состоянию «до сна». Таким образом мы успешно проделали цикл операций suspend/resume. Скажу честно, проблема пробуждения после операции suspend во FreeBSD ранних версий работала крайне отвратительно, но с версии 13.0-RELEASE ситуация радикально поменялась в лучшую сторону. Правда, и тут не обходится без нюансов — некоторые проприетарные драйверы, например от NVIDIA, до сих пор не поддерживают операции suspend/resume, но об этом будет сказано далее.
Очень часто случается, что операционная система зависает (или вовсе не реагирует) при попытке перехода в состояние «сна». Чтобы выяснить какой из драйверов или компонентов системы ведет себя неподабающим образом можно установить значение переменной hw.acpi.verbose в 1. В этом случае ОС при переходе в режим «сна» будет выводить в dmesg подробную информацию о том, как каждый из загруженных драйверов отреагировал на операцию suspend, что может помочь выявить проблемный элемент и, при необходимости, ликвидировать его. Если Вы столкнулись с такой проблемой, то рекомендую прочитать статью https://wiki.freebsd.org/SuspendResume.
Отправить систему в состояние «сна» можно и из командной строки выполнив команду: sudo zzz, вот что написано в странице руководства об этой команде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
rz@butterfly:~ % man zzz ZZZ(8) FreeBSD System Manager's Manual ZZZ(8) NAME zzz – suspend an ACPI or APM system SYNOPSIS zzz DESCRIPTION The zzz utility checks for ACPI or APM support and then suspends the system appropriately. 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. |
14.2 Настройка управления частотой центрального процессора
Подавляющее большинство современных микропроцессоров и систем-на-кристалле обладают возможностью динамического регулирования основных частот тактирования своих подсистем, в том числе и частоты центрального процессора. Делается это для уменьшения энергопотребления — на меньших частотах кремниевые микро- и нано-структуры во-первых потребляют меньший ток, а во-вторых — могут быть запитаны от меньшего напряжение, что в сумме дает меньшую потребляемую мощность. Очевидно, что на устройствах с батарейным питанием данная возможность оказалась весьма к месту — зачем потреблять электроэнергию и зазря разряжать батарею, если пользователь уснул за компьютером. Подавляющее большинство современных операционных систем имеют средства для непрерывного контроля нагрузки на ОС и динамического подстраивания тактовой частоты (или группы частот) с одновременным регулированием напряжения питания для всех подсистем на кристалле микропроцессора. В ОС FreeBSD этой задачей занимается отдельный фоновый процесс — демоном (от слова «daemon»), который непрерывно мониторит нагрузку на систему посредством анализа группы счетчиков dev.cpu.*.cx_usage_counters и подает в систему команды через драйвер acpi. По-умолчанию данная функция в операционной системе отключена, т. е. демон не запущен и вычислительная система работает на номинальной тактовой частоте. В базовый комплект ОС входит демон powerd, и, в целом, он неплохо справляется со своей задачей, но настоящие фрюховоды устанавливают powerd++ (powerdxx) который имеет несколько больший функционал и содержит в комплекте две полезные утилиты: loadrec и loadplay. Эти утилиты позволяют произвести «запись» нагрузочных показателей системы за определенный интервал времени и в последствии «проиграть» (просимулировать) нагрузку, проанализировать поведение системы и оценить работу настроек демона powerdxx. Сейчас я не буду рассказывать о тонкостях этого процесса, просто покажу как установить демона:
1 2 3 4 |
rz@butterfly:~ % sudo pkg inst --yes powerdxx rz@butterfly:~ % sudo sysrc -f /etc/rc.conf powerdxx_enable="YES" powerdxx_flags="-a maximum -b adaptive" powerdxx_enable: -> YES powerdxx_flags: -> -a maximum -b adaptive |
Параметры запуска (флаги) -a maximum и -b adaptive задают поведение демона при работе от источника переменного тока (AC) и от батареи соответственно. В данном случае я хочу, чтобы при питании от AC мой ноутбук работал на максимальной частоте, а при питании от батареи переходил на адаптивную схему управления тактовой частотой. Под «адаптивной» подразумевается, что демон будет отслеживать наличие нагрузки и плавно понижать или повышать тактовую частоту в некоторых (заданных по-умолчанию) пределах.
После установки и внесения его настроек в системный конфиг, запустим демона командой:
1 2 |
rz@butterfly:~ % sudo service powerdxx start Starting powerdxx. |
после чего быстро пробежимся взглядом по страницам руководства:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
rz@butterfly:~ % man powerdxx powerd++(8) FreeBSD System Manager's Manual powerd++(8) NAME powerd++ – CPU clock speed daemon SYNOPSIS powerd++ -h powerd++ [-vfN] [-a mode] [-b mode] [-n mode] [-m freq] [-M freq] [-F freq:freq] [-A freq:freq] [-B freq:freq] [-H temp:temp] [-t sysctl] [-p ival] [-s cnt] [-P file] DESCRIPTION The powerd++ daemon monitors the system load and adjusts the CPU clock speed accordingly. It is a drop-in replacement for powerd(8) and supports two modes of operation, a load feedback control loop or fixed frequency operation. … TOOLS The loadrec(1) and loadplay(1) tools offer the possibility to record system loads and replay them. IMPLEMENTATION NOTES This section describes the operation of powerd++. Both powerd(8) and powerd++ have in common, that they work by polling kern.cp_times via sysctl(3), which is an array of the accumulated loads of every core. By subtracting the last cp_times sample the loads over the polling interval can be determined. This information is used to set a new CPU clock frequency by updating dev.cpu.0.freq. Initialisation After parsing command line arguments powerd++ assigns a clock frequency controller to every core. I.e. cores are grouped by a common dev.cpu.%d.freq handle that controls the clock for all of them. Due to limitations of cpufreq(4) dev.cpu.0.freq is the controlling handle for all cores, even across multiple CPUs. However powerd++ is not built with that assumption and per CPU, core or thread controls will work as soon as the hardware and kernel support them. |
Руководство по powerdxx ссылается на два других руководства: man loadrec и man loadplay. Предоставлю читателю удовольствие ознакомиться с ними и немного поэкспериментировать самостоятельно. Так же в руководстве по powerdxx сказано, что узнать текущую частоту тактирования вычислительных ядер можно следующей командой:
1 2 |
rz@butterfly:~ % sysctl dev.cpu.0.freq dev.cpu.0.freq: 3300 |
15. Настройка шедулера и прочих параметров ядра ОС
Раз уж мы взялись за тонкую настройки системы, то продолжим в этом же духе. Для эксплуатации ОС FreeBSD на персональном рабочем месте я рекомендую установить перечисленные ниже MIB переменные в соответствующие значения.
- Так как я не собираюсь заниматься отладкой приложения для ОС FreeBSD на этом ноутбуке, то особой надобности в «корках» у меня нет. Отключить запись «корки» при падении пользовательских и системных процессов можно установив в ноль значение переменной kern.coredump, ровно как и мгновенно включить эту фичу обратно можно установив переменную в значение 1:
sysctl -w kern.coredump=0
- На системах с графическим интерфейсом пользователя рекомендуется увеличить порог срабатывания шедулера при принудительном вытеснении процессов, что увеличит отзывчивость системы:
sysctl -w kern.sched.preempt_thresh=224
- Выключим PC speaker — его назойливый звук при работе в консоли меня раздражает:
sysctl -w kern.vt.enable_bell=0
- На система с SSD рекомендуется увеличить «read-ahead» – параметр указывающий объем считываемых наперед данных при работе с диском:
sysctl -w vfs.read_max=128
- Так как я собираюсь монтировать сетевые диски, то имеет смысл разрешить всем пользователям системы выполнять операцию монтирования если они являются владельцем точки монтирования. Это позволит мне выполнять команду mount без sudo, не светя лишний раз свой пароль, да и просто меньше кнопок давить:
sysctl -w vfs.usermount=1
- Имеет смысл увеличить размеры входных сетевых буферов для того, чтобы видео-стриминговые сервисы и VoIP приложения не теряли пакеты:
sysctl -w net.inet.udp.recvspace=128000
sysctl -w kern.ipc.maxsockbuf=8388608
Разумеется, чтобы операционная система устанавливала значения этих переменных каждый раз при загрузке необходимо добавить их в файл /etc/sysctl.conf, вот как его содержимое выглядит в моей системе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
rz@butterfly:~ % cat /etc/sysctl.conf # $FreeBSD$ # # This file is read when going to multi-user and its contents piped thru # ``sysctl'' to adjust kernel values. ``man 5 sysctl.conf'' for details. # # Uncomment this to prevent users from seeing information about processes that # are being run under another UID. #security.bsd.see_other_uids=0 # Do not write cores kern.coredump=0 # Context switching: higher - more switches, les GUI lag. good for Youtube watching. kern.sched.preempt_thresh=224 # Disable system bell (PC speaker) on VT kern.vt.enable_bell=0 # Allow user who own mount points to perform mount file systems vfs.usermount=1 # Enable shared memory kern.ipc.shm_allow_removed=1 # Increase VFS read-ahead (better disk performance - particularly for SSDs) # FreeBSD Default: 64 vfs.read_max=128 # Suspend to RAM by default hw.acpi.suspend_state=S3 # Suspend to RAM when power button pressed hw.acpi.power_button_state=S3 # Increase UDP buffer space and IPC socket buf space for Video streaming net.inet.udp.recvspace=128000 kern.ipc.maxsockbuf=8388608 |
16. Запуск Wi-Fi
В главе «3. Установка ОС FreeBSD и первые звоночки» я писал, что сетевой Wi-Fi адаптер MediaTek MT7961 в ОС FreeBSD на данный момент не поддерживается и единственное решение здесь — заменить этот адаптер на что-то более распространенное и от более известного производителя. В ноутбуке Lenovo Ideapad 3 Gaming Wi-Fi адаптер устанавливается в стандартный слот M.2, так что с заменой проблемы быть не должно — нужно только выяснить как разобрать корпус ноутбука не разворотив и не сломав нежные пластиковые детали. Ответ на данный вопрос был быстро получен через Youtube — вот видео с разборкой Lenovo Ideapad 3 Gaming.
С выбором Wi-Fi адаптера пришлось немного повозиться. В процессе чтения форумов я пришел к выводу, что нужно искать адаптер производства Intel — с ними менее всего шансов нарваться на проблемы. Пробежавшись по известным интернет-магазинам я обнаружил единственный доступный в наличии вариант: Intel(R) Dual Band Wireless AC 7265, который по счастливой случайности поддерживается во FreeBSD, поэтому тут же его заказал вместе с доставкой. Данный сетевой адаптер работает в двух диапазонах 2.4 ГГц и 5 ГГц, поддерживает стандарты 802.11a/b/g/n/ac, что в теории могло позволить работать со скоростью 500 Mbit/s.
Пока приобретенный мной адаптер доставляется, я решил потратить один вечер на более плотное изучение «драйверного» вопроса. И вот, что я выяснил. Для этого адаптера в ОС FreeBSD существуют два разных драйвера: iwm и iwlwifi.
Драйвер iwm это «родной» фрюшный драйвер, достаточно старый и хорошо отлаженный, но есть одна ложка дёгтя — он не поддерживает стандарт 802.11ac, а значит скорость выше 54 Mbit/s на нём не получить. Вот, что написано в системном руководстве на сей счет:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
rz@butterfly:~ % man iwm IWM(4) FreeBSD Kernel Interfaces Manual IWM(4) NAME iwm – Intel IEEE 802.11ac wireless network driver ... DESCRIPTION The iwm driver provides support for: Intel Dual Band Wireless AC 3160 Intel Dual Band Wireless AC 3165 Intel Dual Band Wireless AC 3168 Intel Dual Band Wireless AC 7260 Intel Dual Band Wireless AC 7265 Intel Dual Band Wireless AC 8260 Intel Dual Band Wireless AC 8265 Intel Dual Band Wireless AC 9260 Intel Dual Band Wireless AC 9270 Intel Dual Band Wireless AC 946X Intel Dual Band Wireless AC 9560 iwm supports station mode operation. Only one virtual interface may be configured at any time. For more information on configuring this device, see ifconfig(8). This driver requires the firmware built with the iwmfw module to work. Currently, iwm only supports 802.11b and 802.11g modes. It will not associate to access points that are configured to operate only in 802.11n or 802.11ac modes. |
Второй драйвер – iwlwifi, сначала показался мне более интересным, но позже выяснилось, что это не так. Этот драйвер появился в ОС FreeBSD путем портирования одноименного драйвера из ядра Linux посредством фреймворка LinuxKPI (об этом фреймворке я расскажу чуть более подробно при установке и настройки драйверов графических ускорителей и подсистемы DRM).
Драйвер iwlwifi появился совсем недавно, с версии FreeBSD 13.1-RELEASE, т. е. его разработка активно ведется и сам автор на страничке https://wiki.freebsd.org/WiFi/Iwlwifi утверждает, что драйвер сыроват, а следовательно возможен «спонтанный выброс глюка». Помимо этого в системном руководстве имеется следующее замечание:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
rz@butterfly:~ % man iwlwifi iwlwifi(4) FreeBSD Kernel Interfaces Manual iwlwifi(4) NAME iwlwifi – Intel IEEE 802.11a/b/g/n/ac/ax wireless network driver ... DESCRIPTION The iwlwifi driver is derived from Intel's Linux iwlwifi driver and provides support for all chipsets supported by the mvm part of that driver. iwlwifi will be a successor to iwm(4) and may superseed that driver in the future. It still complements the iwn(4) driver which supports older chipsets. The driver uses the linuxkpi_wlan and linuxkpi compat framework to bridge between the Linux and native FreeBSD driver code as well as to the native net80211(4) wireless stack. While iwlwifi supports all 802.11 a/b/g/n/ac/ax the compatibility code currently only supports 802.11 a/b/g modes. Support for 802.11 n/ac is to come. 802.11ax and 6Ghz support are planned. BUGS Certainly. SEE ALSO iwlwififw(4), iwm(4), iwn(4), wlan(4), ifconfig(8), wpa_supplicant(8) HISTORY The iwlwifi driver first appeared in FreeBSD 13.1. |
Иными словами, получить соединение с сетью Wi-Fi на скоростях выше 54 Mbit/s у меня прямо сейчас с этим Wi-Fi адаптером не выйдет — оба драйвера не поддерживают стандарт 802.11ac.
Что-ж, дареному коню, как известно… В общем я решил попробовать оба драйвера и понять, какой из них более пригоден для повседневной работы.
16.1 Установка и настройка сетевого драйвера iwm
Эксперименты я начал с установки и настройки родного фрюшного драйвер для Wi-Fi адаптеров производства Intel. Установка в данном случае слишком громкое слово, данный драйвер установлен в ОС FreeBSD что называется «из коробки». Для его включения достаточно подгрузить модули if_iwm (сам драйвер) и iwm7265fw (прошивка для адаптера), после чего настроить соответствующим образом wpa_supplicant и сетевой интерфейс.
Проделаем это по-шагам.
Прежде всего добавим загрузку «ядрёных» модулей драйвера в системный конфигурационный файл /etc/rc.conf указав их имена в списке в переменной kld_list. Сделаем это с помощью утилиты sysrc:
1 2 |
rz@butterfly:~ % sudo sysrc -f /etc/rc.conf kld_list+="if_iwm iwm7265fw" kld_list: -> if_iwm iwm7265fw |
После чего необходимо ассоциировать драйвер iwm с сетевым интерфейсом wlan0, для этого в этот же файл /etc/rc.conf необходимо добавить стоку wlans_iwm0=”wlan0″ . Сделаем это следующей командой:
1 2 |
rz@butterfly:~ % sudo sysrc -f /etc/rc.conf wlans_iwm0="wlan0" wlans_iwm0: -> wlan0 |
Далее нужно настроить IP адрес для интерфейса wlan0 или указать системе, что данный интерфейс должен получать IP адрес по протоколу DHCP. Делается это путем задания строки в /etc/rc.conf вида: ifconfig_wlan0=”XXX” где XXX — перечень параметров интерфейса в том виде, как они передаются утилите ifconfig (на всякий случай рекомендую к прочтению страницу системной документации man ifconfig).
В моё случае я хочу, чтобы система запрашивала IP адрес по протоколу DHCP, а вся работа с обслуживанием ассоциаций в сети Wi-Fi проводилась с помощью системного демона wpa_supplicant, поэтому еще раз воспользовавшись утилитой sysrc укажу следующее:
1 2 |
rz@butterfly:~ % sudo sysrc -f /etc/rc.conf ifconfig_wlan0="WPA DHCP" ifconfig_wlan0: -> WPA DHCP |
Теперь займемся настройками непосредственно Wi-Fi, т. е. ассоциируем адаптер с Wi-Fi точкой доступа. Для этого необходимо создать конфигурационный файл /etc/wpa_supplicant.conf следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
rz@butterfly:~ % cat /etc/wpa_supplicant.conf ctrl_interface=/var/run/wpa_supplicant eapol_version=2 ap_scan=1 fast_reauth=1 network={ ssid="GUEST_NETWORK1" scan_ssid=1 psk="password1" priority=5 } network={ ssid="GUEST_NETWORK2" scan_ssid=1 psk="password2" priority=1 } |
Здесь блоками network={…} описываются отдельные точки доступа или имена Wi-Fi сетей. Внутри блоков задается имя сети (ssid), пароль (psk), приоритет при выборе (priority) и ряд других опциональных параметров. Параметр scan_ssid указывает на то, что данную сеть нужно опрашивать по имени (а не просто слушать эфир), так как точка доступа организующая эту сеть настроена в режиме «радиомолчания».
Все готово к подъему сетевого интерфейса. Загрузить модули драйвера без перезагрузки ОС можно следующей командой:
rz@butterfly:~ % sudo kldload if_iwm iwm7265fw
При этом, в dmesg должны появится следующие сообщения:
1 2 3 |
pci3: <network> at device 0.0 (no driver attached) iwm0: <Intel(R) Dual Band Wireless AC 7265> mem 0xd1600000-0xd1601fff at device 0.0 on pci3 iwm0: hw rev 0x210, fw ver 22.361476.0, address 10:02:b5:b7:b1:e6 |
Создать и поднять сетевой интерфейс wlan0 можно командой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
rz@butterfly:~ % sudo service netif restart wlan0 Created wlan(4) interfaces: wlan0. Starting wpa_supplicant. Starting Network: wlan0. wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 10:02:b5:b7:b1:e6 groups: wlan ssid "" channel 1 (2412 MHz 11g) regdomain FCC country US authmode WPA1+WPA2/802.11i privacy MIXED deftxkey UNDEF txpower 30 bmiss 10 scanvalid 60 protmode CTS wme roaming MANUAL bintval 0 parent interface: iwm0 media: IEEE 802.11 Wireless Ethernet autoselect (autoselect) status: no carrier nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> |
Видно, что система создала новый сетевой интерфейс wlan0 и запустила демона wpa_supplicant для обслуживания этого интерфейса. В dmesg наблюдаем сообщения:
1 2 |
wlan0: Ethernet address: 10:02:b5:b7:b1:e6 wlan0: link state changed to UP |
Через несколько секунд с помощью утилиты ifconfig можно посмотреть, удалось ли wpa_supplicant-у ассоциироваться с какой либо из заданных Wi-Fi точек доступа и какой IP адрес нам выдали:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
rz@butterfly:~ % ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 10:02:b5:b7:b1:e6 inet 192.168.168.230 netmask 0xffffff00 broadcast 192.168.168.255 groups: wlan ssid GUEST_NETWORK1 channel 4 (2427 MHz 11g) bssid 52:ff:20:58:f8:23 regdomain FCC country US authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 2:128-bit txpower 30 bmiss 10 scanvalid 60 protmode CTS wme roaming MANUAL parent interface: iwm0 media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g status: associated nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> |
Из вывода утилиты ifconfig видно, что установлено соединение по протоколу 802.11g на частоте 2427 МГц с точкой доступа MAC адрес которой 52:ff:20:58:f8:23 и мне выдали IP адрес 192.168.168.230. Сетевой интерфейс wlan0 связан с родительским интерфейсом драйвера iwm0.
Не смотря на то, что моя домашняя точка доступа поддерживает режим 802.11ac, видно что в данном случае этот режим не доступен. Попробуем использовать во благо то, что есть.
16.2 Тестирование сетевого интерфейса с драйвером iwm
Настало время немного протестировать получившееся сетевое соединение при работе с драйвером iwm. Для этого установим утилиту iperf3:
rz@butterfly:~ % sudo pkg inst --yes iperf3
На другом хосте в локальной сети установим и запустим эту же утилиту с параметром -s (в режиме сервера):
1 2 3 4 |
rz@devbox:~$ iperf3 -s ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- |
Запустим тест на ноутбуке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
rz@butterfly:~ % iperf3 -c devbox Connecting to host devbox, port 5201 [ 5] local 192.168.168.230 port 34461 connected to 192.168.169.6 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 3.00 MBytes 25.1 Mbits/sec 0 202 KBytes [ 5] 1.00-2.00 sec 2.69 MBytes 22.5 Mbits/sec 0 221 KBytes [ 5] 2.00-3.00 sec 2.63 MBytes 22.1 Mbits/sec 0 238 KBytes [ 5] 3.00-4.00 sec 2.70 MBytes 22.6 Mbits/sec 0 254 KBytes [ 5] 4.00-5.00 sec 2.72 MBytes 22.8 Mbits/sec 0 268 KBytes [ 5] 5.00-6.00 sec 2.60 MBytes 21.8 Mbits/sec 0 282 KBytes [ 5] 6.00-7.00 sec 2.65 MBytes 22.2 Mbits/sec 0 295 KBytes [ 5] 7.00-8.00 sec 2.65 MBytes 22.2 Mbits/sec 0 308 KBytes [ 5] 8.00-9.00 sec 2.65 MBytes 22.2 Mbits/sec 0 321 KBytes [ 5] 9.00-10.00 sec 2.66 MBytes 22.3 Mbits/sec 0 332 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 26.9 MBytes 22.6 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 26.6 MBytes 22.3 Mbits/sec receiver iperf Done. |
Результат на лицо — суммарная скорость передачи данных (туда+обратно) составляет 22.6 + 22.3 = 44.9 Mbits/s, что очень близко к теоритически возможным 54Mbit/s для режима 802.11g учитывая сетевой оверхэд.
Меня интересовало как драйвер iwm будет работать с сетями 5 ГГц, поэтому я подключился в админский интерфейс к своей домашней точке доступа и заблокировал у неё режим 2.4 ГГц, т. е. оставил только 5 ГГц. Через несколько секунд сетевой интерфейс на моём ноутбуке переподключился и вот что я наблюдал по команде ifconfig wlan0:
1 2 3 4 5 6 7 8 9 10 11 12 |
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 10:02:b5:b7:b1:e6 inet 192.168.168.230 netmask 0xffffff00 broadcast 192.168.168.255 groups: wlan ssid GUEST_NETWORK1 channel 149 (5745 MHz 11a) bssid 50:ff:20:78:f8:23 regdomain FCC country US authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 2:128-bit txpower 23 bmiss 10 mcastrate 6 mgmtrate 6 scanvalid 60 wme roaming MANUAL parent interface: iwm0 media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11a status: associated nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> |
Видно, что сетевой адаптер успешно ассоциировался с точкой доступа по протоколу 802.11a (не путать с 802.11ac) на скорости 54Mbit/s что, согласно руководству, является максимально возможным для драйвера iwm.
Запустим iperf3 еще раз и протестируем сетевое соединение в таком режиме:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
rz@butterfly:~ % iperf3 -c devbox Connecting to host devbox, port 5201 [ 5] local 192.168.168.230 port 22358 connected to 192.168.169.6 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 3.08 MBytes 25.8 Mbits/sec 0 205 KBytes [ 5] 1.00-2.00 sec 2.74 MBytes 23.0 Mbits/sec 0 224 KBytes [ 5] 2.00-3.00 sec 2.70 MBytes 22.6 Mbits/sec 0 241 KBytes [ 5] 3.00-4.00 sec 2.75 MBytes 23.0 Mbits/sec 0 257 KBytes [ 5] 4.00-5.00 sec 2.72 MBytes 22.8 Mbits/sec 0 272 KBytes [ 5] 5.00-6.00 sec 2.73 MBytes 22.9 Mbits/sec 0 286 KBytes [ 5] 6.00-7.00 sec 2.73 MBytes 22.9 Mbits/sec 0 299 KBytes [ 5] 7.00-8.00 sec 2.74 MBytes 23.0 Mbits/sec 0 312 KBytes [ 5] 8.00-9.00 sec 2.77 MBytes 23.2 Mbits/sec 0 325 KBytes [ 5] 9.00-10.00 sec 2.72 MBytes 22.8 Mbits/sec 0 336 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 27.7 MBytes 23.2 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 27.3 MBytes 22.9 Mbits/sec receiver iperf Done. |
Результат стабильно одинаковый, что не может не радовать.
А теперь самый сложный тест: проверка на то, как драйвер iwm поддерживает режим «сна» и на сколько успешно выходит из него (цикл операций suspend/resume).
Однократное нажатие кнопки «Power» и… через пару секунд экран и подсветка клавиатуры ноутбука потухла. Делаю вывод, что система ушла в спячку успешно, поэтому пытаюсь пробудить её повторным нажатием кнопки «Power», и… чудо-чудное, система мгновенно пробуждается и возвращается к исходному состоянию.
Посмотрим какие у нас появились сообщения в dmesg относительно сетевого интерфейса и драйвера его обслуживающего:
1 2 3 4 5 |
rz@butterfly:~ % dmesg | grep 'iwm\|wlan\|acpi' ... wlan0: link state changed to DOWN acpi0: cleared fixed power button status wlan0: link state changed to UP |
Никаких сообщений об ошибках или таймаутах нет, всё логично. Я еще пару раз проделал этот тест с кнопкой «Power», дабы убедиться в повторяемости эффекта — всё в норме и это прекрасно!
16.3 Установка, настройка и тестирование драйвера iwlwifi
Как я уже упомянул выше, драйвер iwlwifi появился в ОС FreeBSD с версии 13.1-RELEASE, а это означает, что его так же просто установить «из коробки» как и драйвер iwm, но есть нюанс. Так, как данный драйвер находится в активной разработке, вместе с фреймворком LinuxKPI, то с момента выхода релиза ОС драйвер претерпел ряд изменений. И действительно, заглянув Git репозиторий исходных кодов ОС я обнаружил с десяток коммитов в дерево этого драйвера с даты релиза ОС. Что же тут предпринять ?
Во-первых, можно игнорировать эти изменения и попробовать то, что поставляется с релизом ОС. Во-вторых, можно проапгрейдить ОС FreeBSD до версии 13-STABLE, т. е. перейти на ветку -STABLE. Попробуем оба варианта последовательно.
Первый вариант осуществить достаточно просто. Для этого нужно добавить модуль ядра if_iwlwifi в список lkd_list в системном конфигурационном файле /etc/rc.conf, при этом не забыть убрать из него модули if_iwm и iwm7265fw от драйвера iwm – два драйвера хоть и могут сосуществовать вместе, но для чистоты эксперимента выполним:
1 2 3 4 5 |
rz@butterfly:~ % sudo sysrc -f /etc/rc.conf kld_list-="if_iwm iwm7265fw" kld_list: if_iwm iwm7265fw -> rz@butterfly:~ % sudo sysrc -f /etc/rc.conf kld_list+="if_iwlwifi" kld_list: -> if_iwlwifi |
Далее, необходимо ассоциировать сетевой интерфейс wlan0 с устройством iwlwifi0:
1 2 |
rz@butterfly:~ % sudo sysrc -f /etc/rc.conf wlans_iwlwifi0="wlan0" wlans_iwlwifi0: -> wlan0 |
Собственно на этом все настройки заканчиваются — интерфейс wlan0 и wpa_supplicant уже были ранее законфигурированы при настройки драйвера iwm. Поэтому можно либо перезагрузить систему командой sudo reboot, либо выгрузить модули предыдущего драйвера вручную и загрузить новый, после чего перезапустить сетевой интерфейс. Я, пожалуй, в данном случае предпочту перезагрузиться.
После перезагрузки операционной системы в dmesg я обнаружил следующие сообщения от драйвера iwlwifi:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
rz@butterfly:~ % dmesg | grep iwl iwlwifi0: <iwlwifi> mem 0xd1600000-0xd1601fff at device 0.0 on pci3 iwlwifi0: successfully loaded firmware image 'iwlwifi-7265D-29.ucode' iwlwifi0: Found debug destination: EXTERNAL_DRAM iwlwifi0: Found debug configuration: 0 iwlwifi0: loaded firmware version 29.4063824552.0 7265D-29.ucode op_mode iwlmvm iwlwifi0: Detected Intel(R) Dual Band Wireless N 7265, REV=0x210 iwlwifi0: Applying debug destination EXTERNAL_DRAM iwlwifi0: Allocated 0x00400000 bytes for firmware monitor. iwlwifi0: base HW address: 10:02:b5:b7:b1:e6, OTP minor version: 0x0 iwlwifi0: Applying debug destination EXTERNAL_DRAM iwlwifi0: Applying debug destination EXTERNAL_DRAM iwlwifi0: FW already configured (0) - re-configuring |
из чего я сделал вывод, что драйвер успешно загрузился и проинициализировал сетевой адаптер.
И действительно, не успел я войти в систему, как сетевой интерфейс wlan0 был уже ассоциирован с Wi-Fi сетью и IP адрес был назначен по DHCP. Вот, что я увидел в ответ от утилиты ifconfig:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
rz@butterfly:~ % ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 10:02:b5:b7:b1:e6 inet 192.168.168.230 netmask 0xffffff00 broadcast 192.168.168.255 groups: wlan ssid GUEST_NETWORK1 channel 149 (5745 MHz 11a) bssid 50:ff:20:78:f8:23 regdomain FCC country US authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 23 bmiss 7 mcastrate 6 mgmtrate 6 scanvalid 60 wme roaming MANUAL parent interface: iwlwifi0 media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11a status: associated nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> |
Из вывода ifconfig видно, что сетевой интерфейс wlan0 использует родительский интерфейс iwlwifi0, а связь с точкой доступа Wi-Fi произведена по протоколу 802.11a на скорости 36Mbits. И тут встает вопрос – почему скорость всего 36Mbits ? Точка доступа находится от моего ноутбука в 2х метрах. Я пробовал крутить антенны, передвигать ноутбук в другое место, «стучать по колёсам и плевать под капот» – всё безрезультатно. Ок, спишем это на «электромагнитную несовместимость».
Запустив утилиту iperf3 я наблюдал еще более странный результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
rz@butterfly:~ % iperf3 -c devbox Connecting to host devbox, port 5201 [ 5] local 192.168.168.230 port 19754 connected to 192.168.169.6 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 622 KBytes 5.09 Mbits/sec 0 41.2 KBytes [ 5] 1.00-2.01 sec 567 KBytes 4.62 Mbits/sec 0 56.9 KBytes [ 5] 2.01-3.00 sec 623 KBytes 5.13 Mbits/sec 0 69.7 KBytes [ 5] 3.00-4.00 sec 525 KBytes 4.29 Mbits/sec 0 79.7 KBytes [ 5] 4.00-5.00 sec 628 KBytes 5.15 Mbits/sec 0 89.7 KBytes [ 5] 5.00-6.00 sec 569 KBytes 4.66 Mbits/sec 0 98.3 KBytes [ 5] 6.00-7.00 sec 574 KBytes 4.71 Mbits/sec 0 107 KBytes [ 5] 7.00-8.00 sec 569 KBytes 4.66 Mbits/sec 0 114 KBytes [ 5] 8.00-9.00 sec 580 KBytes 4.75 Mbits/sec 0 120 KBytes [ 5] 9.00-10.00 sec 580 KBytes 4.75 Mbits/sec 0 127 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 5.70 MBytes 4.78 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 5.56 MBytes 4.66 Mbits/sec receiver iperf Done. |
т. е. эффективная скорость передачи по Wi-Fi сети получается 5.7 + 5.56 = 11.26 Mbit/sec. Я провел еще несколько вариантов тестов с утилитой iperf3 и все они показывали, что сеть работает крайне медленно и наблюдается существенная ассиметрия — «на прием» сетевой интерфейс работает в два раза быстрее, чем «на передачу», но существенно медленней чем со старым фрюшным драйвером iwm.
Еще один малоприятеный эффект — сетевой адаптер периодически теряет связь с точкой доступа, а в dmesg появляются вот такие сообщения:
1 2 3 4 5 6 7 8 |
iwlwifi0: No beacon heard and the time event is over already... wlan0: link state changed to DOWN wlan0: link state changed to UP iwlwifi0: No beacon heard and the time event is over already... wlan0: link state changed to DOWN wlan0: link state changed to UP iwlwifi0: No beacon heard and the time event is over already... wlan0: link state changed to DOWN |
Попытка проверить драйвер на устойчивость к suspend/resume с помощью кнопки «Power» показала следующее: система успешно уходит в «сон» и возвращается из него, но сетевой интерфейс становится неработоспособным, а в dmesg наблюдается масса сообщений от драйвера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
timeout waiting for hardware access (CSR_GP_CNTRL 0x080403d8) iwlwifi0: iwlwifi transaction failed, dumping registers iwlwifi0: iwlwifi device config registers: iwlwifi iwlwifi: 0000 86 80 5a 09 06 04 10 00 59 00 80 02 10 00 00 00 |..Z.....Y.......| iwlwifi iwlwifi: 0010 04 00 60 d1 00 00 00 00 00 00 00 00 00 00 00 00 |..`.............| iwlwifi iwlwifi: 0020 00 00 00 00 00 00 00 00 00 00 00 00 86 80 00 50 |...............P| iwlwifi iwlwifi: 0030 00 00 00 00 c8 00 00 00 00 00 00 00 ff 01 00 00 |................| ... iwlwifi0: iwlwifi device AER capability structure: iwlwifi iwlwifi: 0000 01 00 01 14 00 00 00 00 00 00 00 00 31 20 46 00 |............1 F.| iwlwifi iwlwifi: 0010 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 |..... ..........| iwlwifi iwlwifi: 0020 00 00 00 00 00 00 00 00 00 00 00 00 |............ | iwlwifi0: iwlwifi parent port (iwlwifi) config registers: iwlwifi iwlwifi: 0000 86 80 5a 09 06 04 10 00 59 00 80 02 10 00 00 00 |..Z.....Y.......| iwlwifi iwlwifi: 0010 04 00 60 d1 00 00 00 00 00 00 00 00 00 00 00 00 |..`.............| iwlwifi iwlwifi: 0020 00 00 00 00 00 00 00 00 00 00 00 00 86 80 00 50 |...............P| …. iwlwifi0: Queue 4 is active on fifo 2 and stuck for 10000 ms. SW [60, 62] HW [90, 90] FH TRB=0x05a5a5a5a |
Попытка выгрузить и и повторно загрузить модуль драйвера приводит к появлению еще большей «портянки» в dmesg, но сетевой интерфейс это не реанимирует. В общем, я сделал заключение, что данная версия драйвер iwlwifi – не жилец.
Но у нас есть еще один вариант — перейти на FreeBSD 13-STABLE, и мы обязаны его попробовать.
16.4 Апгрейд ядра ОС FreeBSD до 13-STABLE и обратно до 13.1-RELEASE
Переход на ветку -STABLE или -CURRENT возможен только путем выкачивания полного репозитория исходных кодов ОС и их последующей локальной сборки и установки. Для проверки драйвера iwlwifi мне будет достаточно собрать ядро и модули, всю остальную часть системы я менять не собираюсь.
Для того, чтобы осуществить задуманное, клонируем часть репозитория исходных кодов, укажем имя ветки stable/13 и глубину в 1 коммит – дабы сильно не пригружать удаленный сервер и Сеть выкачиванием бесполезной информации:
1 |
rz@butterfly:~ % git clone --depth 1 -b stable/13 https://git.freebsd.org/src.git freebsd-stable-13 |
Далее зайдем в каталог с репозиторием, осмотримся:
1 2 3 4 5 6 7 |
rz@butterfly:~ % cd freebsd-stable-13/ rz@butterfly:~/freebsd-stable-13 % git status On branch stable/13 Your branch is up to date with 'origin/stable/13'. nothing to commit, working tree clean |
и запустим сборку ядра:
1 2 |
rz@butterfly:~/freebsd-stable-13 % make -j8 buildkernel … |
…пока идет сборка ядра, а процесс этот долгий, переключимся в другой терминал нажатием Ctrl-Alt-F2 и попробуем пройти пару уровней в игре NetHack, периодически переключаясь в первый терминал, нажимая Ctrl-Alt-F1,для наблюдения за процессом компиляции…]
Окончание сборки выглядит вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- kernel.full --- linking kernel.full ctfmerge -L VERSION -g -o kernel.full ... text data bss dec hex filename 23118796 1838765 4446976 29404537 0x1c0ad79 kernel.full --- kernel.debug --- objcopy --only-keep-debug kernel.full kernel.debug --- kernel --- objcopy --strip-debug --add-gnu-debuglink=kernel.debug kernel.full kernel -------------------------------------------------------------- >>> Kernel build for GENERIC completed on Wed Aug 17 05:41:58 +05 2022 -------------------------------------------------------------- >>> Kernel(s) GENERIC built in 278 seconds, ncpu: 12, make -j12 -------------------------------------------------------------- |
Инсталлируем собранное ядро и модули:
1 2 3 4 5 |
rz@butterfly:~/freebsd-stable-13 % sudo make installkernel … -------------------------------------------------------------- >>> Installing kernel GENERIC completed on Wed Aug 17 05:42:56 +05 2022 -------------------------------------------------------------- |
Командой sudo reboot выполним перезагрузку системы и посмотрим что у нас получилось.
Сразу после перезагрузки, войдя в систему, посмотрим на версию ядра ОС:
1 2 |
rz@butterfly:~ % uname -a FreeBSD butterfly 13.1-STABLE FreeBSD 13.1-STABLE #0 stable/13-66ea3876d: Wed Aug 17 05:41:50 +05 2022 rz@butterfly:/usr/obj/usr/home/rz/freebsd-stable-13/amd64.amd64/sys/GENERIC amd64 |
Вроде бы замена ядра прошла успешно, а что же с драйвером iwlwifi ? Напомню, что все настройки у нас остались прежние и если с драйвером всё в порядке, то сетевой интерфейс должен подняться автоматически и без проблем. Выясним, так ли это:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
rz@butterfly:~ % ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 10:02:b5:b7:b1:e6 inet 192.168.168.230 netmask 0xffffff00 broadcast 192.168.168.255 groups: wlan ssid FABMICRO_GUEST channel 149 (5745 MHz 11a) bssid 50:ff:20:78:f8:23 regdomain FCC country US authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 23 bmiss 7 mcastrate 6 mgmtrate 6 scanvalid 60 wme roaming MANUAL parent interface: iwlwifi0 media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11a status: associated nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> |
Действительно, интерфейс wlan0 поднят и сетевой адаптер присоединился к точке доступа на скорости 54Mbits, что как бы намекает на благополучный исход, но…
Очередной тест пропускной способности с помощью iperf3 показал всё тот же вялый результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
rz@butterfly:~ % iperf3 -c devbox Connecting to host devbox, port 5201 [ 5] local 192.168.168.230 port 15978 connected to 192.168.169.6 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 871 KBytes 7.12 Mbits/sec 0 156 KBytes [ 5] 1.00-2.00 sec 609 KBytes 5.00 Mbits/sec 0 161 KBytes [ 5] 2.00-3.00 sec 518 KBytes 4.24 Mbits/sec 0 166 KBytes [ 5] 3.00-4.00 sec 600 KBytes 4.91 Mbits/sec 0 171 KBytes [ 5] 4.00-5.00 sec 585 KBytes 4.79 Mbits/sec 0 176 KBytes [ 5] 5.00-6.00 sec 553 KBytes 4.52 Mbits/sec 0 180 KBytes [ 5] 6.00-7.00 sec 601 KBytes 4.94 Mbits/sec 0 184 KBytes [ 5] 7.00-8.00 sec 574 KBytes 4.70 Mbits/sec 0 188 KBytes [ 5] 8.00-9.00 sec 568 KBytes 4.66 Mbits/sec 0 193 KBytes [ 5] 9.00-10.00 sec 576 KBytes 4.72 Mbits/sec 0 197 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 5.91 MBytes 4.96 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 5.71 MBytes 4.79 Mbits/sec receiver iperf Done. |
Хотя, по ощущениям сеть Wi-Fi работать стала стабильнее — самопроизвольно не отваливается от точки доступа и ругательств в dmesg не производит.
Проверим как «улучшенный» вариант драйвера относится к циклу suspend/resume нажав кнопку «Power»… Система уходит в «сон» и пробуждается нормально, но в dmesg присутствует та же портянка с регистрами и сообщениями об ошибках:
1 2 3 4 5 6 7 8 9 10 11 |
Timeout waiting for hardware access (CSR_GP_CNTRL 0x080403d8) … iwlwifi0: Queue 4 is active on fifo 2 and stuck for 10000 ms. SW [52, 74] HW [90, 90] FH TRB=0x05a5a5a5a iwlwifi0: Error sending MCAST_FILTER_CMD: enqueue_hcmd failed: -5 iwlwifi0: mcast filter cmd error. ret=-5 iwlwifi0: Error sending ECHO_CMD: enqueue_hcmd failed: -5 iwlwifi0: Failed to synchronize multicast groups update iwlwifi0: Error sending MCAST_FILTER_CMD: enqueue_hcmd failed: -5 iwlwifi0: mcast filter cmd error. ret=-5 iwlwifi0: Error sending ECHO_CMD: enqueue_hcmd failed: -5 iwlwifi0: Failed to synchronize multicast groups update |
Что-ж, мы с Вами на практике убедились, что драйвер iwlwifi пока еще не достаточно хорош и пора откатиться обратно на ядро версии 13.1-RELEASE и вернуться к драйверу iwm.
Для того, чтобы вернуться на ядро ветки -RELEASE перейдем в каталог /usr/src/ – тут находятся исходные коды ядра ОС устанавливаемые при инсталляции системы и поддерживаемые утилитой freebsd-update, из них и соберем себе ядро:
1 2 |
rz@butterfly:~ % cd /usr/src rz@butterfly:/usr/src % sudo make -j12 buildkernel && sudo make installkernel |
По окончанию сборки и установки ядра вернём настройки интерфейса wlan0 на использование драйвера iwm:
1 2 3 4 5 6 7 8 9 10 |
rz@butterfly:~ % sudo sysrc -f /etc/rc.conf kld_list-="if_iwlwifi" kld_list: if_iwlwifi -> rz@butterfly:~ % sudo sysrc -f /etc/rc.conf kld_list+="if_iwm iwm7265fw" kld_list: -> if_iwm iwm7265fw rz@butterfly:~ % sudo sysrc -x -f /etc/rc.conf wlans_iwlwifi0 rz@butterfly:~ % sudo sysrc -f /etc/rc.conf wlans_iwm0="wlan0" wlans_iwm0: -> wlan0 |
И отправим систему на перезагрузку:
1 |
rz@butterfly:/usr/src % sudo reboot |
После загрузки зайдем в систему и убедимся, что загружено ядро нужной нам ветки -RELEASE:
1 2 |
rz@butterfly:~ % uname -a FreeBSD butterfly 13.1-RELEASE-p1 FreeBSD 13.1-RELEASE-p1 GENERIC amd64 |
На этом изыскания с драйверами к Wi-Fi адаптеру я хочу закончить и плавно перейти к более интересным делам — к настройке графической подсистемы.
17. Установка графической подсистемы X11
В ОС FreeBSD, следуя лучшим традициям, используется графическая подсистема X Window System на базе протокола X11. Безусловно, ведутся эксперименты с запуском Wayland (и даже с Mir), но его использование во многих смыслах не является каноническим и по этому мной не рассматривается принципиально.
Прежде чем мы перейдем непосредственно к установке требуемых пакетов, я хотел бы немного рассказать о том, что такое X Window System и почем это есть хорошо и правильно, а всё остальное — от лукавого.
Графический интерфейс пользователя в UNIX системах появился не сразу, где-то спустя полтора десятка лет, а именно в 1984 году в стенах MIT был запущен проект под названием «X Window System» или просто «X» (в простонародье «Иксы»). До этого конечно же были и другие потуги в создании GUI для UNIX систем, но все они не оказались столь популярными по причине своей мелкотравчатости, т. е. не глубокой концептуальной продуманности. А еще, по причине того, что Иксы с нулевого дня были с открытым исходным кодом и к проекту могли подключаться другие разработчики по мери его развития.
X Window System предполагает концепцию типа «клиент-сервер» в составе которой имеются следующие сущности:
1) X сервер (X Server) — устройство ввода и отображения информации. Является отдельной, независимой от основной (хост) системы сущностью. X сервер в рамках X Window System может быть как отдельно стоящим аппаратным устройством (в конце 80-х и 90-х так оно и было), так и просто процессом на хост системе.
2) Устройство (Device) — физическая сущность которой располагает и оперирует X сервер: графический дисплей, графический акселератор, клавиатура, мышь, манипуляторы «joystick», и т. д.
3) Ресурс (Resource) — блок информации который можно загрузить на X сервер или попросить X сервер загрузить самостоятельно из файла. К ресурсам относятся графические файлы (битмапы), различные шрифты (fonts), файлы данных и т. д.
4) X клиент (X Client) — пользовательский процесс, который функционирует на хост системе и с помощью специального сетевого протокола может иметь доступ к X серверам, отправлять в них запросы на манипуляцию ресурсами и устройствами, т. е. отображать графическую информацию на один и более X серверов, получать от X серверов ввод пользователя (нажатия клавиш клавиатуры, перемещение мыши, отклонение манипуляторов типа «joystick» и т. д.).
5) X протокол (X protocol) — сетевой протокол, позволяет вести обмен данными между X клиентами и X серверами. X протокол позволяет одному клиенту общаться сразу с несколькими X серверами (несколькими физическими дисплеями), а одному X серверу — обслуживать запросы сразу от нескольких X клиентов независимо от того где они физически располагаются. В качестве транспорта в X протоколе используется либо TCP для разнесенных клиента и сервера, либо UNIX-сокеты – в случае, когда клиент и сервер исполняются на одном хосте. Разумеется, что в X протоколе предусматривается протокол авторизации (XAuth) позволяющий серверам регламентировать доступ клиентов к своим устройствам и ресурсам. Стандартный протокол авторизации XAuth достаточно примитивен и поэтому считается небезопасным, но существует воз и маленькая тележка расширений под общим названием X Access Control Extension (XACE). Более того, всеми любимый протокол SSH имеет «от рождения» возможность пробрасывать (туннелировать) X сеанс через себя и эту его фичу часто используют для доступа к вычислительным системам в крупных корпоративных сетях. Здесь вся авторизация ложится на плечи SSH.
Для полноты следует еще упомянуть про существование такой сущности как X Font Server (сервер шрифтов или xfs), но в этой статье мне не хочется так глубоко погружаться в X11. К тому же, подавляющее большинство приложений сейчас рендерят шрифты на стороне клиента.
Первая спецификация X Window System вышедшая в июне 1984 года имела протокол версии X1, далее протокол быстро развивался и к 1987 году достиг версии X11. Так номер версии с тех пор и закрепился в его названии, а настоящий номер версия (номер релиза) добавляется через букву R. На данный момент самая последняя версия протокола X11 имеет номер X11R7.7 и была она выпущена в июне 2012 года.
Среди обывателей бытует мнение, что протокол X11 не развивается, давно устарел и его нужно списать на свалку истории, но я считаю что это не так! Графическая подсистема X Window System, выстроенная за несколько десятков лет на его основе, очень мощная и с очень объемной экосистемой, хоть местами и с изъянами. Любые попытки «переосмыслить» и изобрести что-то новое и более идеологически правильное, в конечном счете напарываются на все те же сложности, и в результате становятся еще более убогими и конкретно недопиленными (привет Wayland).
Статья и дискуссия: https://ajaxnwnk.blogspot.com/2020/10/on-abandoning-x-server.html
Еще дискуссия: https://news.ycombinator.com/item?id=24921806
Таким образом, для того чтобы в нашей системе появился графический интерфейс нам необходимо установить следующее:
- Набор библиотек реализующих протокол X11. На данный момент широко используются Xlib и XCB.
- Одну из немногих реализаций X сервера. На данный момент это Xorg. Подробнее о нём чуть ниже.
- Менеджер окон (Window Manager – WM) — X клиент реализующий одну из множества оконных систем.
- Менеджер дисплеев (Display Manager – DM) — графическая утилита (тоже X клиент), которая обеспечивает авторизацию пользователя у конкретного X сервера и организует сеанс. Чтобы было более понятно, DM это то первое графическое приложение с которым взаимодействует пользователь при входе (логине) в систему.
Пара замечаний про свободный X сервер.
С 1991 по 2004 год на платформе x86 широко использовался X сервер от проекта XFree86, но в феврале 2004 у проекта возникли проблемы с Free Software Foundation из-за кусков кода закрытых лицензией GPL. В результате был сделан «fork» под названием X.org и создана новая некоммерческая организация разрабатывающая и поддерживающая эту реализацию X сервера и по сей день. X.org так же ведет разработку и поддерживает набор библиотек Xlib и XCB (X for C bindings) и на данный момент является стандартом «де-факто», причем не только на x86.
X сервер Xorg состоит из двух частей: аппаратно независимой (Device Independent X) и части зависимой от конкретной видео карты или видео ускорителя (Device Dependent X). В свою очередь DDX часть требует наличия в системе драйвера для видео карты реализующего Direct Rendering Infrastructure (DRI). DRI был введен в ОС Linux для быстрого доступа пользовательским процессам к аппаратным ускорителям и, в частности для OpenGL. Из Linux-а DRI перекочевал во многие другие свободные ОС, в том числе и во FreeBSD. Получается, что перед тем как устанавливать Xorg сервер нам нужно озаботиться видео драйверами. Напомню, что в моём новом ноутбуке две видео карты: встроенная от AMD и дискретная от NVIDIA (и хочу заметить, что тут кроется серьезный подвох, но пока не буду раскрывать какой).
Тут так же следует сказать, что в пакете Xorg имеется «универсальный» видео драйвер позволяющей использовать видео карту без режимов аппаратного ускорения с помощью стандарта VESA — его поддерживают подавляющее большинство видеокарт. Этот драйвер (или скорее режим работы) называется scfb. Дабы заранее не усложнять себе жизнь с поиском и установкой правильных видео драйверов, я решил для начала настроить Xorg в этом режиме и получить хоть какой-то визуальный эффект радующий глаз, но об этом чуть далее.
Запустим установку требуемых нам пакетов. Сначала установим библиотеки:
1 |
rz@butterfly:~ % sudo pkg inst libX11 libxcb qt5 |
Указанные в данной команде имена пакетов на самом деле являются мета-пакетами которые содержат огромное количество зависимостей. Утилита pkg проследит, пересчитает и предложит пользователю установить их все и здесь важно, чтобы в файловой системе оказалось достаточно свободного места. Следующим этапом установим Xorg сервер:
1 |
rz@butterfly:~ % sudo pkg inst --yes xorg |
Xorg вытянет за собой оставшуюся половину интернета.
Разумеется все пакеты можно установить одной командой, последовательно перечислив их имена через пробел. Параметр –yes проинструктирует утилиту pkg не задавать лишних вопросов и со всем соглашаться.
Процесс установки этих пакетов может занять некоторое время, поэтому заварим чашку чая и пойдем в другой виртуальный видео терминал играть в NetHack — вдруг повезет раздобыть Амулет Йендора.
Чтобы переключаться между виртуальными видео терминалами (VTY) необходимо нажать Ctrl-Alt-F1 или F2, или F3 и так до F8 — всего по-умолчанию включено восемь виртуальных видео терминалов.
18. Настройка Xorg в режиме scfb
Теоретически, сразу после окончания установки Xorg можно попытаться запустить X сервер без всякой предварительной настройки – Xorg достаточно интеллектуален для того, чтобы самостоятельно определить тип видео адаптера, мыши и клавиатуры и подгрузить соответствующие аппаратно зависимые модули. Но, к сожалению, на моём ноутбуке Lenovo Ideapad 3 Gaming оказалось предостаточно аппаратных нововведений с которыми Xorg самостоятельно справится не может.
Тем не менее, посмотрим как это выглядит. Выполним команду X и посмотрим на результат:
1 |
rz@butterfly:~ % X |
В моём случае Xorg сразу завершился с сообщением об ошибке. Заглянув в файл /var/log/Xorg.0.log я обнаружил следующие сообщения: