Операционная система FreeBSD на ноутбуке Lenovo

Как стать автором Подводим итоги сезона Data Mining и награждаем лучших дата-оккультистов Все потоки Разработка Администрирование Дизайн Менеджмент Маркетинг Научпоп

checkpoint 21 августа в 03:06

Операционная система FreeBSD на ноутбуке Lenovo

Системное администрирование **nix *

✏️ Технотекст 2022

Tutorial

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

Моя статья посвященная настройке САПР КОМПАС-3D под FreeBSD получила ряд одобрительных комментариев, поэтому мне захотелось продолжить тему «FreeBSD на десктопе». К тому же, есть добрые предпосылки — недавно я приобрел новый современный ноутбук Lenovo Ideapad 3 Gaming взамен окончательно рассыпавшегося на несколько частей Asus VX7, а с ним и массу приятного и затейливого опыта установки и настройки ОС FreeBSD для работы на новом «железе». В этой статье я не будут касаться установки и настройки специализированного ПО и прочих САПР, будет рассмотрен только системный вопрос: установка операционной системы, драйверов, патчей, библиотек, настройка и борьба с железом. Будет много выдержек из системного руководства (мануала – man) — уж сильно я к нему пристрастился за последние 130 лет.

Ссылка на статью в формате PDF для “офф-лайн” прочтения

В этом выпуске:

1. Аппаратный вопрос

2. О версиях ОС FreeBSD

3. Установка ОС FreeBSD и первые звоночки

4. Апдейт и апгрейд ОС FreeBSD

5. «Фатальная» особенность оболочки tcsh

6. Несколько слов о системной документации

7. Про FreeBSD Handbook

8. Менеджмент пакетов в ОС FreeBSD

9. Замечание по структуре каталогов в ОС FreeBSD

10. Установка компилятора

11. Проверка работоспособности компилятора и системы сборки

12. Утилита sysrc

13. Проблема с загрузчиком

14. Управление электропитанием

14.1 Настройка режимов «сна»

14.2 Настройка управления частотой центрального процессора

15. Настройка шедулера и прочих параметров ядра ОС

16. Запуск Wi-Fi

16.1 Установка и настройка сетевого драйвера iwm

16.2 Тестирование сетевого интерфейса с драйвером iwm

16.3 Установка, настройка и тестирование драйвера iwlwifi

16.4 Апгрейд ядра ОС FreeBSD до 13-STABLE и обратно до 13.1-RELEASE

17. Установка графической подсистемы X11

18. Настройка Xorg в режиме scfb

19. Заставляем работать TouchPad

20. Установка WM и DM

21. Настройка раскладки клавиатуры в Xfce4

22. Проблема потери настроек клавиатуры после suspend/resume

23. Запуск 3D акселераторов

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 ускорителей

25. Настройка web-камеры

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:

Немного погуглив, я выяснил, что поддержка адаптера MT7961 появилась в ядре Linux совсем недавно, с версии 5.13, а это давало понять, что во FreeBSD её можно не ждать в ближайшие годы. Очевидно, что в таком случае самый простой способ сделать поддержку Wi-Fi на этом ноутбуке это купить новый Wi-Fi адаптер (из списка подерживаемых) и попросту заменить, благо ноутбук легко разбирается и карта адаптера доступна для замены.

Тем временем решил двигаться далее. Легким движением руки настроил сеть путем добавления в системный конфигурационный файл /etc/rc.confодной строки ifconfig_re0=”DHCP”, для этого воспользовался следующими командами:

А чтобы система приняла мои изменения, я выполнил команду:

по завершению которой убедился в готовности сетевого интерфейса командой ifconfig re0:

и принялся доустанавливать систему и инсталлировать требуемые мне пакеты.

О системе пакетов я расскажу более подробно чуть позже, а сейчас установлю первый пакет – это будет утилита 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). Если же на Вашей машине используется своё, кастомное ядро, то сборку ядра и его установку после обновления придется выполнить вручную, но утилита выкачает и применит все необходимые патчи к исходным кодам ядра.

Выкачивание критических обновлений осуществляется по команде:

Прежде всего утилита 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 и предложит Вам отредактировать пустой файл, в него нужно добавить строку вида:

Здесь <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 можно командой:

либо традиционным способом:

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, которую следует вводить каждый раз при появлении в путях нового исполняемого файла, вот так:

Для пользователей 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, для этого введем следующую команду:

Страница по man сообщает нам формат команды man и её параметров, а так же выдает нам ряд интересной справочной информации о номерах секций системной документации и их назначении. Видно, что в системе присутствует девять секций (категорий) с различными руководствами, в том числе по разработке ядра ОС (9) и по играм (6) – как же без них! 🙂

Давайте выясним, что системе известно про сетевой адаптер RealTek 8168 установленный в моём новом ноутбуке и как вообще этот драйвер называется. Для этого введем команду:

Команда apropos производит поиск строки символов (без учета регистра) по всем man-страницам зарегистрированным в системе и выдает сокращенный список страниц на которых есть упоминание заданной строки текста. В данном случае мы получили список всех man-страниц с упоминанием про RealTek.

Из вывода команды apropos видно, что для имеющегося у меня сетевого адаптера используется два драйвера: драйвер re для самого Ethernet адаптера подключенного к шине PCIe и драйвер rgephy для управления трансивером (Ethernet PHY). В выводе команды apropos в скобках указан номер секции (категории) руководства.

Давайте посмотрим, что содержится в 4-й секции руководства по драйверу re:

Как видно, в руководстве приведена исчерпывающая информация о поддерживаемых моделях сетевых адаптеров и то, как этот драйвер установить. В данном случае предлагается два способа: 1) статический – вкомпилить драйвер в ядро операционной системы подправив конфигурационный файл ядра, и 2) динамический — дать указание загрузчику (bootloader-у) загружать соответствующий модуль. Второй вариант считается более предпочтительным, но так как в инсталлированном по-умолчанию ядре уже содержится этот драйвер, то никаких действий для его подключения от меня не потребовалось.

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

Система нам сообщает, что ничего конкретного про 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, цитирую:

Второй репозиторий содержит так называемые пакеты (packages). Это уже скомпилированные и готовые к работе пакеты программ, библиотек и всего того, что есть в портах, в бинарном виде. Пакет как правило содержит некоторое количество метаданных о себе: краткое и полное описание содержимого, адрес и имя мантейнера, а так же список зависимостей от других пакетов. Для управления пакетами предназначена утилита pkg, цитата:

Утилита pkg отслеживает список зависимостей, доустанавливает необходимые пакеты или удаляет неиспользуемые пакеты и файлы при деинсталляции какого-то пакета. Фактически это аналог RPM пакетов в ОС Linux, но есть нюансы. Один из них состоит в том, что репозиториев с пакетами не один, а целых два: latest и quarterly — первый содержит самые новые изменения в пакетах (новые пакеты, самые последние патчи и обновления к ним), а второй отстает от первого по времени на четверть года, т. е. содержит более стабильные и объезженные версии пакетов. Но и это еще не все. Для каждой поддерживаемой версии FreeBSD ведется свой набор репозиториев с пакетами (свой latest и quarterly) и они не совпадают друг с другом. Файл конфигурации /etc/pkg/FreeBSD.conf указывает какой именно репозиторий будет использован утилитой pkg:

При установке ОС FreeBSD «с нуля» соответствующий файл будет создан инсталлятором автоматически, он будет настроен на репозиторий quarterly для нашей версии FreeBSD. Так как меня интересует свежачок, то я создал аналогичный файл, но в другом месте файловой системы (обратите внимание, об этом сказано в комментарии) и в нём изменил значение параметра url на pkg+http://pkg.FreeBSD.org/${ABI}/latest”:

Здесь переменная ${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>

Пример использования:

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

Для прочтения хэндбука и посещения web сайтов из терминала нам понадобится утилита lynx которая представляет собой консольный web браузер. Установим её следующей командой:

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 для поиска нужного нам пакета:

Видно, что в репозитории имеется несколько пакетов с подобным именем. Нас интересует сам компилятор, а значит будем устанавливать пакет 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:

Для того, чтобы у нас была возможность вести сборку СПО, в том числе и из коллекции портов, нам потребуется утилита 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:

Из вывода видно, что по команде make BATCH=yes были прослежены зависимости, выкачаны и распакованы соответствующие distfiles – архивы с исходными кодами затаренные гнутым зипом, выкачаны и приложены ряд патчей, после чего запущена сборка и подготовка к инсталляции собранного порта.

Параметр BATCH=yes указывает системе сборки на то, что на все глупые вопросы следует отвечать утвердительно (Yes Man) и не отвлекать пользователя от наслаждения чашечкой горячего чая.

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

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

Выясним, что за привилегии:

Видно, что установлен атрибут SGID, присвоены пользователь и группа games, т. е. игра NetHack исполняется от эффективного имени пользователя games. Будем считать что это относительно безопасно.

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

Любой порт можно установить повторно, дабы исправить поврежденные файлы, командой make reinstall (аналог команды pkg install -f для пакетов).

Проверим, запускается ли игра:

Вроде бы все в порядке, игра запускается, а значит компилятор и система сборки у нас работают нормально. Выйдем из NetHack нажав клавишу q и продолжим заниматься установкой и настройкой ОС FreeBSD.

К игре NetHack мы еще вернемся когда начнем устанавливать X11 и графическую оболочку Xfce. Так как процесс их установки не быстрый, то NetHack позволит нам немного расслабиться и провести время с пользой.

12. Утилита sysrc

Утилита sysrc позволяет безопасно (без внесения синтаксических ошибок) отредактировать системный конфигурационный файл из командной стоки. Вот, что сообщает нам страница системной документации по этой утилите:

Что-ж, очень полезно, возмём на вооружение!

13. Проблема с загрузчиком

В процессе установки одного из требуемых мне драйверов неожиданно обнаружилось, что во FreeBSD 13.0 и 13.1 есть баг приводящий к зависанию начального загрузчика (booloader-а) если в его конфиге (в файле /boot/loader.conf) присутствуют ссылки на любые модули. Честно сказать я не стал сильно долго разбираться с причинами такого поведения bootloader-а на моём ноутбуке, но сделал вывод, что загружать модули из /boot/loader.conf нельзя. Вместо этого я буду загружать их из rc скриптов, т. е. буду добавлять имена нужных мне для загрузки модулей в файл /etc/rc.conf в строку kld_list разделяя пробелом.

На случай если кто-то из будущих фрюховодов случайно наткнулся на эту проблему (то есть Ваша система намертво подвисла сразу после старта загрузчика или после загрузки какого-то «нерадивого» модуля), то сообщаю, что имеется способ загрузить «голое» ядро системы без попытки загрузки модулей загрузчиком. Делается это так:

  1. При загрузке в меню выбрать «3. Escape to loader prompt».
  2. В появившемся промпте Ok от загрузчика ввести следующие команды:unloadload /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:

Как следует из документации, драйвер acpi подгружается автоматически начальным загрузчиком (boot loader-ом), а текущие настройки и состояние подсистемы ACPI можно выяснить с помощью команды sysctl просмотрев дерево переменных MIB в ветке hw.acpi, как показано ниже:

Данная команда предоставляет много интересной информации о поведении операционной системы при различных условиях. Видно, что система и аппаратура поддерживает ряд состояний энергосбережения для режима «suspend» (режима «сна»), а именно состояния S3, S4 и S5. Из той же страницы руководства man acpi можно выяснить, что это за состояния:

Т.е. операционная система и аппаратура на данном ноутбуке поддерживает состояния: «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 следующей командой:

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

Так же я хочу установить значение переменной hw.acpi.power_button_state равное S3 чтобы мой ноутбук переходил в состояние «Suspend to RAM» при нажатии на кнопку питания (power button):

Аналогичным образом можно установить значение переменной 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, вот что написано в странице руководства об этой команде:

14.2 Настройка управления частотой центрального процессора

Подавляющее большинство современных микропроцессоров и систем-на-кристалле обладают возможностью динамического регулирования основных частот тактирования своих подсистем, в том числе и частоты центрального процессора. Делается это для уменьшения энергопотребления — на меньших частотах кремниевые микро- и нано-структуры во-первых потребляют меньший ток, а во-вторых — могут быть запитаны от меньшего напряжение, что в сумме дает меньшую потребляемую мощность. Очевидно, что на устройствах с батарейным питанием данная возможность оказалась весьма к месту — зачем потреблять электроэнергию и зазря разряжать батарею, если пользователь уснул за компьютером. Подавляющее большинство современных операционных систем имеют средства для непрерывного контроля нагрузки на ОС и динамического подстраивания тактовой частоты (или группы частот) с одновременным регулированием напряжения питания для всех подсистем на кристалле микропроцессора. В ОС FreeBSD этой задачей занимается отдельный фоновый процесс — демоном (от слова «daemon»), который непрерывно мониторит нагрузку на систему посредством анализа группы счетчиков dev.cpu.*.cx_usage_counters и подает в систему команды через драйвер acpi. По-умолчанию данная функция в операционной системе отключена, т. е. демон не запущен и вычислительная система работает на номинальной тактовой частоте. В базовый комплект ОС входит демон powerd, и, в целом, он неплохо справляется со своей задачей, но настоящие фрюховоды устанавливают powerd++ (powerdxx) который имеет несколько больший функционал и содержит в комплекте две полезные утилиты: loadrec и loadplay. Эти утилиты позволяют произвести «запись» нагрузочных показателей системы за определенный интервал времени и в последствии «проиграть» (просимулировать) нагрузку, проанализировать поведение системы и оценить работу настроек демона powerdxx. Сейчас я не буду рассказывать о тонкостях этого процесса, просто покажу как установить демона:

Параметры запуска (флаги) -a maximum и -b adaptive задают поведение демона при работе от источника переменного тока (AC) и от батареи соответственно. В данном случае я хочу, чтобы при питании от AC мой ноутбук работал на максимальной частоте, а при питании от батареи переходил на адаптивную схему управления тактовой частотой. Под «адаптивной» подразумевается, что демон будет отслеживать наличие нагрузки и плавно понижать или повышать тактовую частоту в некоторых (заданных по-умолчанию) пределах.

После установки и внесения его настроек в системный конфиг, запустим демона командой:

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

Руководство по powerdxx ссылается на два других руководства: man loadrec и man loadplay. Предоставлю читателю удовольствие ознакомиться с ними и немного поэкспериментировать самостоятельно. Так же в руководстве по powerdxx сказано, что узнать текущую частоту тактирования вычислительных ядер можно следующей командой:

15. Настройка шедулера и прочих параметров ядра ОС

Раз уж мы взялись за тонкую настройки системы, то продолжим в этом же духе. Для эксплуатации ОС FreeBSD на персональном рабочем месте я рекомендую установить перечисленные ниже MIB переменные в соответствующие значения.

  1. Так как я не собираюсь заниматься отладкой приложения для ОС FreeBSD на этом ноутбуке, то особой надобности в «корках» у меня нет. Отключить запись «корки» при падении пользовательских и системных процессов можно установив в ноль значение переменной kern.coredump, ровно как и мгновенно включить эту фичу обратно можно установив переменную в значение 1: sysctl -w kern.coredump=0
  2. На системах с графическим интерфейсом пользователя рекомендуется увеличить порог срабатывания шедулера при принудительном вытеснении процессов, что увеличит отзывчивость системы: sysctl -w kern.sched.preempt_thresh=224
  3. Выключим PC speaker — его назойливый звук при работе в консоли меня раздражает: sysctl -w kern.vt.enable_bell=0
  4. На система с SSD рекомендуется увеличить «read-ahead» – параметр указывающий объем считываемых наперед данных при работе с диском:sysctl -w vfs.read_max=128
  5. Так как я собираюсь монтировать сетевые диски, то имеет смысл разрешить всем пользователям системы выполнять операцию монтирования если они являются владельцем точки монтирования. Это позволит мне выполнять команду mount без sudo, не светя лишний раз свой пароль, да и просто меньше кнопок давить:sysctl -w vfs.usermount=1
  6. Имеет смысл увеличить размеры входных сетевых буферов для того, чтобы видео-стриминговые сервисы и VoIP приложения не теряли пакеты:sysctl -w net.inet.udp.recvspace=128000 sysctl -w kern.ipc.maxsockbuf=8388608

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

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 на нём не получить. Вот, что написано в системном руководстве на сей счет:

Второй драйвер – iwlwifi, сначала показался мне более интересным, но позже выяснилось, что это не так. Этот драйвер появился в ОС FreeBSD путем портирования одноименного драйвера из ядра Linux посредством фреймворка LinuxKPI (об этом фреймворке я расскажу чуть более подробно при установке и настройки драйверов графических ускорителей и подсистемы DRM).

Драйвер iwlwifi появился совсем недавно, с версии FreeBSD 13.1-RELEASE, т. е. его разработка активно ведется и сам автор на страничке https://wiki.freebsd.org/WiFi/Iwlwifi утверждает, что драйвер сыроват, а следовательно возможен «спонтанный выброс глюка». Помимо этого в системном руководстве имеется следующее замечание:

Иными словами, получить соединение с сетью 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:

После чего необходимо ассоциировать драйвер iwm с сетевым интерфейсом wlan0, для этого в этот же файл /etc/rc.conf необходимо добавить стоку wlans_iwm0=”wlan0″ . Сделаем это следующей командой:

Далее нужно настроить IP адрес для интерфейса wlan0 или указать системе, что данный интерфейс должен получать IP адрес по протоколу DHCP. Делается это путем задания строки в /etc/rc.conf вида: ifconfig_wlan0=”XXX” где XXX — перечень параметров интерфейса в том виде, как они передаются утилите ifconfig (на всякий случай рекомендую к прочтению страницу системной документации man ifconfig).

В моё случае я хочу, чтобы система запрашивала IP адрес по протоколу DHCP, а вся работа с обслуживанием ассоциаций в сети Wi-Fi проводилась с помощью системного демона wpa_supplicant, поэтому еще раз воспользовавшись утилитой sysrc укажу следующее:

Теперь займемся настройками непосредственно Wi-Fi, т. е. ассоциируем адаптер с Wi-Fi точкой доступа. Для этого необходимо создать конфигурационный файл /etc/wpa_supplicant.conf следующего содержания:

Здесь блоками network={…} описываются отдельные точки доступа или имена Wi-Fi сетей. Внутри блоков задается имя сети (ssid), пароль (psk), приоритет при выборе (priority) и ряд других опциональных параметров. Параметр scan_ssid указывает на то, что данную сеть нужно опрашивать по имени (а не просто слушать эфир), так как точка доступа организующая эту сеть настроена в режиме «радиомолчания».

Все готово к подъему сетевого интерфейса. Загрузить модули драйвера без перезагрузки ОС можно следующей командой:

rz@butterfly:~ % sudo kldload if_iwm iwm7265fw

При этом, в dmesg должны появится следующие сообщения:

Создать и поднять сетевой интерфейс wlan0 можно командой:

Видно, что система создала новый сетевой интерфейс wlan0 и запустила демона wpa_supplicant для обслуживания этого интерфейса. В dmesg наблюдаем сообщения:

Через несколько секунд с помощью утилиты ifconfig можно посмотреть, удалось ли wpa_supplicant-у ассоциироваться с какой либо из заданных Wi-Fi точек доступа и какой IP адрес нам выдали:

Из вывода утилиты 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 (в режиме сервера):

Запустим тест на ноутбуке:

Результат на лицо — суммарная скорость передачи данных (туда+обратно) составляет 22.6 + 22.3 = 44.9 Mbits/s, что очень близко к теоритически возможным 54Mbit/s для режима 802.11g учитывая сетевой оверхэд.

Меня интересовало как драйвер iwm будет работать с сетями 5 ГГц, поэтому я подключился в админский интерфейс к своей домашней точке доступа и заблокировал у неё режим 2.4 ГГц, т. е. оставил только 5 ГГц. Через несколько секунд сетевой интерфейс на моём ноутбуке переподключился и вот что я наблюдал по команде ifconfig wlan0:

Видно, что сетевой адаптер успешно ассоциировался с точкой доступа по протоколу 802.11a (не путать с 802.11ac) на скорости 54Mbit/s что, согласно руководству, является максимально возможным для драйвера iwm.

Запустим iperf3 еще раз и протестируем сетевое соединение в таком режиме:

Результат стабильно одинаковый, что не может не радовать.


А теперь самый сложный тест: проверка на то, как драйвер iwm поддерживает режим «сна» и на сколько успешно выходит из него (цикл операций suspend/resume).

Однократное нажатие кнопки «Power» и… через пару секунд экран и подсветка клавиатуры ноутбука потухла. Делаю вывод, что система ушла в спячку успешно, поэтому пытаюсь пробудить её повторным нажатием кнопки «Power», и… чудо-чудное, система мгновенно пробуждается и возвращается к исходному состоянию.

Посмотрим какие у нас появились сообщения в dmesg относительно сетевого интерфейса и драйвера его обслуживающего:

Никаких сообщений об ошибках или таймаутах нет, всё логично. Я еще пару раз проделал этот тест с кнопкой «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 – два драйвера хоть и могут сосуществовать вместе, но для чистоты эксперимента выполним:

Далее, необходимо ассоциировать сетевой интерфейс wlan0 с устройством iwlwifi0:

Собственно на этом все настройки заканчиваются — интерфейс wlan0 и wpa_supplicant уже были ранее законфигурированы при настройки драйвера iwm. Поэтому можно либо перезагрузить систему командой sudo reboot, либо выгрузить модули предыдущего драйвера вручную и загрузить новый, после чего перезапустить сетевой интерфейс. Я, пожалуй, в данном случае предпочту перезагрузиться.

После перезагрузки операционной системы в dmesg я обнаружил следующие сообщения от драйвера iwlwifi:

из чего я сделал вывод, что драйвер успешно загрузился и проинициализировал сетевой адаптер.

И действительно, не успел я войти в систему, как сетевой интерфейс wlan0 был уже ассоциирован с Wi-Fi сетью и IP адрес был назначен по DHCP. Вот, что я увидел в ответ от утилиты ifconfig:

Из вывода ifconfig видно, что сетевой интерфейс wlan0 использует родительский интерфейс iwlwifi0, а связь с точкой доступа Wi-Fi произведена по протоколу 802.11a на скорости 36Mbits. И тут встает вопрос – почему скорость всего 36Mbits ? Точка доступа находится от моего ноутбука в 2х метрах. Я пробовал крутить антенны, передвигать ноутбук в другое место, «стучать по колёсам и плевать под капот» – всё безрезультатно. Ок, спишем это на «электромагнитную несовместимость».

Запустив утилиту iperf3 я наблюдал еще более странный результат:

т. е. эффективная скорость передачи по Wi-Fi сети получается 5.7 + 5.56 = 11.26 Mbit/sec. Я провел еще несколько вариантов тестов с утилитой iperf3 и все они показывали, что сеть работает крайне медленно и наблюдается существенная ассиметрия — «на прием» сетевой интерфейс работает в два раза быстрее, чем «на передачу», но существенно медленней чем со старым фрюшным драйвером iwm.

Еще один малоприятеный эффект — сетевой адаптер периодически теряет связь с точкой доступа, а в dmesg появляются вот такие сообщения:

Попытка проверить драйвер на устойчивость к suspend/resume с помощью кнопки «Power» показала следующее: система успешно уходит в «сон» и возвращается из него, но сетевой интерфейс становится неработоспособным, а в dmesg наблюдается масса сообщений от драйвера:

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

Но у нас есть еще один вариант — перейти на FreeBSD 13-STABLE, и мы обязаны его попробовать.

16.4 Апгрейд ядра ОС FreeBSD до 13-STABLE и обратно до 13.1-RELEASE

Переход на ветку -STABLE или -CURRENT возможен только путем выкачивания полного репозитория исходных кодов ОС и их последующей локальной сборки и установки. Для проверки драйвера iwlwifi мне будет достаточно собрать ядро и модули, всю остальную часть системы я менять не собираюсь.

Для того, чтобы осуществить задуманное, клонируем часть репозитория исходных кодов, укажем имя ветки stable/13 и глубину в 1 коммит – дабы сильно не пригружать удаленный сервер и Сеть выкачиванием бесполезной информации:

Далее зайдем в каталог с репозиторием, осмотримся:

и запустим сборку ядра:

…пока идет сборка ядра, а процесс этот долгий, переключимся в другой терминал нажатием Ctrl-Alt-F2 и попробуем пройти пару уровней в игре NetHack, периодически переключаясь в первый терминал, нажимая Ctrl-Alt-F1,для наблюдения за процессом компиляции…]

Окончание сборки выглядит вот так:

Инсталлируем собранное ядро и модули:

Командой sudo reboot выполним перезагрузку системы и посмотрим что у нас получилось.

Сразу после перезагрузки, войдя в систему, посмотрим на версию ядра ОС:

Вроде бы замена ядра прошла успешно, а что же с драйвером iwlwifi ? Напомню, что все настройки у нас остались прежние и если с драйвером всё в порядке, то сетевой интерфейс должен подняться автоматически и без проблем. Выясним, так ли это:

Действительно, интерфейс wlan0 поднят и сетевой адаптер присоединился к точке доступа на скорости 54Mbits, что как бы намекает на благополучный исход, но…

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

Хотя, по ощущениям сеть Wi-Fi работать стала стабильнее — самопроизвольно не отваливается от точки доступа и ругательств в dmesg не производит.

Проверим как «улучшенный» вариант драйвера относится к циклу suspend/resume нажав кнопку «Power»… Система уходит в «сон» и пробуждается нормально, но в dmesg присутствует та же портянка с регистрами и сообщениями об ошибках:

Что-ж, мы с Вами на практике убедились, что драйвер iwlwifi пока еще не достаточно хорош и пора откатиться обратно на ядро версии 13.1-RELEASE и вернуться к драйверу iwm.

Для того, чтобы вернуться на ядро ветки -RELEASE перейдем в каталог /usr/src/ – тут находятся исходные коды ядра ОС устанавливаемые при инсталляции системы и поддерживаемые утилитой freebsd-update, из них и соберем себе ядро:

По окончанию сборки и установки ядра вернём настройки интерфейса wlan0 на использование драйвера iwm:

И отправим систему на перезагрузку:

После загрузки зайдем в систему и убедимся, что загружено ядро нужной нам ветки -RELEASE:

На этом изыскания с драйверами к 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 Window System.
Рис. 1. Упрощенная архитектура 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 в этом режиме и получить хоть какой-то визуальный эффект радующий глаз, но об этом чуть далее.

Запустим установку требуемых нам пакетов. Сначала установим библиотеки:

Указанные в данной команде имена пакетов на самом деле являются мета-пакетами которые содержат огромное количество зависимостей. Утилита pkg проследит, пересчитает и предложит пользователю установить их все и здесь важно, чтобы в файловой системе оказалось достаточно свободного места. Следующим этапом установим Xorg сервер:

Xorg вытянет за собой оставшуюся половину интернета.

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

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

Чтобы переключаться между виртуальными видео терминалами (VTY) необходимо нажать Ctrl-Alt-F1 или F2, или F3 и так до F8 — всего по-умолчанию включено восемь виртуальных видео терминалов.

18. Настройка Xorg в режиме scfb

Теоретически, сразу после окончания установки Xorg можно попытаться запустить X сервер без всякой предварительной настройки – Xorg достаточно интеллектуален для того, чтобы самостоятельно определить тип видео адаптера, мыши и клавиатуры и подгрузить соответствующие аппаратно зависимые модули. Но, к сожалению, на моём ноутбуке Lenovo Ideapad 3 Gaming оказалось предостаточно аппаратных нововведений с которыми Xorg самостоятельно справится не может.

Тем не менее, посмотрим как это выглядит. Выполним команду X и посмотрим на результат:

В моём случае Xorg сразу завершился с сообщением об ошибке. Заглянув в файл /var/log/Xorg.0.log я обнаружил следующие сообщения: