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

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

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

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

e4af83f14c204793c4c35aa78d8030c4.png

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

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:

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

	root@butterfly:/home/rz # echo 'ifconfig_re0="DHCP"' >> /etc/rc.conf 

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

	root@butterfly:/home/rz # /etc/netstart

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

root@butterfly:/home/rz # ifconfig re0 
re0: flags=8843 metric 0 mtu 1500 
	options=8209b 
	ether 7c:8a:e1:a5:9e:03 
	inet 192.168.172.110 netmask 0xffffff00 broadcast 192.168.172.255 
	media: Ethernet autoselect (100baseTX ) 
	status: active 
	nd6 options=29 

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

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

root@butterfly:/home/rz # pkg inst --yes sudo && rehash

После установки sudo необходимо подредактировать конфигурационный файл с помощью специальной утилиты visudo (устанавливается вместе с пакетом sudo), в файле требуется раскомментировать или добавить строку вида:

%wheel ALL=(ALL: ALL) ALL

После чего сохранить изменения и выйти из visudo. Если Вы используете редактор vi, что наиболее вероятно, то требуется нажать следующую последовательность клавиш: : wq

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

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

Сразу после установки базового комплекта ОС FreeBSD, не плохо бы проапгрейдиться до последней версии, так как развернутый образ системы на моей USB флешки уже слегка залежавшийся. Для этих целей во FreeBSD имеется специальной средство — утилита freebsd-update, которая является универсальным средством для обновления системы. Данная утилита позволяет выполнять следующие задачи:

  • Обновить текущую систему и установить критические обновления (патчи) без смены номера версии ОС.

  • Обновить систему на более новую версию (minor version update).

  • Обновить систему на более новую ветку (major version update).

Во все случаях утилита freebsd-update выкачивает и устанавливает набор обновлений к ядру ОС, к системным утилитам и системным библиотекам в бинарном виде. Происходит это в два этапа: 1) выкачивание патчей и подготовка новых версий ядра, утилит и библиотек к установке, и 2) собственно установка, и, по необходимости, перезагрузка системы и дальнейшая доустановка.

Небольшое замечание: устанавливать обновление к ядру ОС утилита freebsd-update будет только в том случае, если Вы используете конфигурацию ядра по-умолчанию (ядро GENERIC). Если же на Вашей машине используется своё, кастомное ядро, то сборку ядра и его установку после обновления придется выполнить вручную, но утилита выкачает и применит все необходимые патчи к исходным кодам ядра.

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

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

	@dailyrootfreebsd-update cron

Здесь это символ табуляции. Сохранить изменения и выйти из редактора 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 можно командой:

rz@butterfly:~ % freebsd-version 
13.1-RELEASE 

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

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

rz@butterfly:~ % rehash

rz@butterfly:~ % cc
cc: error: no input files

Для пользователей Linux это может показаться безрассудным, но на самом деле это не так и я объясню почему. Представьте, что Вы работаете на относительно медленной аппаратуре и у Вас в файловой системе располагаются сотни тысяч файлов (привет embedded разработчикам). Каждый раз когда Вы вводите команду, или нажимаете клавишу TAB, оболочка bash проводит поиск исполняемого файла по всем подкаталогам указанным в переменной окружения $PATH. Если файлов много, то это выражается в явной задержке, иногда очень даже надоедливой. В оболочке tsch по-умолчанию включен поиск по hash-таблице и поэтому tcsh выглядит более динамично (особенно при активном использовании клавиши TAB). Поиск по таблице можно выключить командой unhash или снова включить командой hash, а обновить таблицу командой rehash. О оболочке bash все строго наоборот.

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

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 установленный в моём новом ноутбуке и как вообще этот драйвер называется. Для этого введем команду:

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:

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

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

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, цитата:

rz@butterfly:~ % man pkg
PKG(8)                  FreeBSD System Manager's Manual                 PKG(8) 

NAME 
     p
    
            

© Habrahabr.ru