Опубликован отчёт о развитии проекта FreeBSD с октября по декабрь 2018 года.

Основные достижения:

  • Общие и системные вопросы
    • Продолжено развитие инфраструктуры непрерывной интеграции, в которой проводится регулярное автоматизированное тестирование изменений и пересборка содержимого Subversion-репозитория проекта в Travis CI и Jenkins. За отчётный период была проведена работа по расширению окружения для выполнения тестов, расширению покрытия тестами кодовой базы и налаживанию сотрудничества по совместному тестированию с внешними проектами. Из планов отмечается добавление в CI сборки drm-портов в окружении ветки CURRENT, реализация автоматических тестов на невиртуализированном оборудовании (bare metal) и добавление тестов для отдельных веток, таких как clang800-import;
    • FreeBSD Core Team одобрил план по переводу драйверов для 10 и 100 мегабитных сетевых адаптеров Ethernet в разряд устаревших;
    • Размер собранных в прошлом году пожертвований превысил 1.3 млн долларов. Наиболее значительный вклад внесли компании Juniper, Netflix и Facebook, а также проект Handshake.org
    • Трудоустроенные в организации FreeBSD Foundation инженеры выполнили работу по выявлению и исправлению узких мест в ядре и системных библиотеках, обеспечению сборки системы и портов с использованием утилиты Poudriere, добавлению встроенного в ядро загрузчика микрокода для CPU Intel, расширению изоляции системных утилит при помощи фреймворка capsicum, улучшению поддержи NUMA, внесению исправлений, связанных с компоновщиком lld (от LLVM) и компонентами инструментария ELF, обновлением OpenSSL до версии 1.1.1 и добавлением защиты Retpoline от атак Spectre;
    • В дополнение к недавно добавленной в реализацию виртуальных терминалов поддержке установки цветовых схем (kern.vt.color.X.rgb tunables) пользователям предложена готовая коллекция из примерно 200 цветовых схем для различных терминалов. Для применения схем достаточно скопировать их параметры в /boot/loader.conf или /boot/loader.conf.local;
    • Для ядра i386 предложена опция PAE_PAGETABLES, включающая поддержку нового формата таблиц страниц памяти, который ранее был доступен только в режиме PAE. Новый формат необходим для реализации поддержки не исполняемых страниц памяти (бит noexec) и увеличения адресуемой памяти (до 24G). Его применение без PAE позволит сохранить прежними структуры vm_paddr_t и bus_addr_t, т.е. обеспечить неизменными интерфейсы ядра и избежать нарушения совместимости с драйверми. Чтобы не распространять несколько сборок ядра i386 поддержка страниц памяти вынесена в отдельные модули — два модуля pmap, один для PAE и один для поддержки старых двухуровневых таблиц страниц памяти;
  • Безопасность
    • Добавлена поддержка механизма ключей защиты памяти Usermode Protection Keys, позволяющего приложениям разбить используемую память на зоны, применив к каждой зоне дополнительные ограничения, например, можно установить права при которых код может быть запущен, но не может быть прочитан. Механизм предоставляется в процессорах Intel Xeon на базе микроархитектуры Skylake;
    • В гипервизор bhyve добавлена поддержка Live-миграции гостевых окружений с одного хоста на другой. Для управления переносом в bhyvectl добавлена опция «—migrate-live». В
      bhyve также реализована функциональность Save/Restore, позволяющая заморозить гостевую систему с сохранением состояния в файл, а затем возобновить выполнение. При сохранении в разные файлы записывается образ памяти, метаданные для восстановления, состояние CPU и устройств. Для заморозки гостевой системы в bhyvectl добавлена команда «—suspend state_file», а для восстановления опция «-r» (используется вместе с «—suspend»);

    • Внесены улучшения во фреймворк Capsicum, предоставляющий механизмы ограничения использования приложениями определённых системных функций. В Casper, фоновый процесс для организации доступа к привилегированным операциям из режима повышенной изоляции, добавлен сервис fileargs для обращения к частям ФС из sandbox-окружения. Использование fileargs позволяет изолировать такие приложения, как brandelf, wc, savecore, head и strings, а также добавить в bhyve поддержку доступа к звуковым устройствам, изолированным при помощи Capsicum. Кроме того, добавлен
      Casper-сервис private и реализована sandbox-изоляция процессов rtsold и rtsol , используемых для отправки сообщений ICMPv6 Router Solicitation;

    • Добавлена поддержка устройств TPM 2.0 (Trusted Platform Module) с отдельным чипом и памятью для безопасных вычислений, которые обычно применяются для верифицированной загрузки прошивок и загрузчика ОС. Во FreeBSD TPM также может использоваться для усиления безопасности Strongswan IPsec, SSH и TLS за счёт выполнения криптографических операций на отдельном чипе;
    • Для режима верифицированной загрузки UEFI Secure Boot реализована поддержка сертификатов X509. На базе библиотеки BearSSL для загрузчика EFI подготовлен код проверки цифровых подписей. Обеспечено извлечение списка разрешённых и запрещённых сертификатов из переменных окружения UEFI. Предоставленной функциональности достаточно для верифицированной загрузки ядра с использованием цифровой подписи на основе самостоятельно сгенерированного сертификата;
    • Проходит рецензирование код с реализацией системы контроля целостности исполняемых файлов Veriexec, который скорее всего будет интегрирован с кодом для поддержки UEFI Secure Boot;
    • Библиотека
      libvdsk оптимизирована для упрощения добавления поддержки новых форматов дисковых образов. Добавлена поддержка формата QCOW2. Из планов отмечается поддержка Copy-On-Write, средства для работы с несколькими снапшотами и интеграция с bhyve;

  • Сетевая подсистема
    • Проведена оптимизация производительности pfsync, системы для синхронизации таблиц отслеживания состояния соединений нескольких пакетных фильтров. Пакетный фильтр pf может обрабатывать одновременно несколько состояний на разных ядрах CPU, но pfsync был привязан к блокировке PFSYNC_LOCK, позволявшей единовременно использовать только одно ядро CPU. Для решения данной проблемы очереди pfsync теперь разбиты на несколько сегментов с разными идентификаторами состояния и собственными независимыми блокировками. Указанное изменение позволяет одновременно обрабатывать несколько состояний на разных ядрах CPU.
      Число сегментов настраивается (по умолчанию выбирается в два раза больше, чем число CPU). В зависимости конфигурации прирост производительности составляет от 30% до 100%;

  • Поддержка оборудования
    • Продолжается развитие компонентов графического стека. Проведена работа по стабилизации портированных из ядра Linux 4.16 графических драйверов drm-kmod (порт, обеспечивающий работу DRM-модулей amdgpu, i915 и radeon, используя фреймворк linuxkpi для совместимости с DRM API (Direct Rendering Manager) ядра Linux).
      Порты с DRM-драйверами переименованы для более явной привязки к веткам (graphics/drm-current-kmod для CURRENT и graphics/drm-fbsd12.0-kmod для релиза 12.0. Добавлен новый порт graphics/drm-kmod, устанавливающий корректный драйвер в зависимости от версии FreeBSD и аппаратной архитектуры.

      Старые драйверы, портированные из ядра 4.11 и используемые в выпуске FreeBSD 11.2, помещены в порт graphics/drm-legacy-kmod и также могут использоваться во FreeBSD 12.0 и CURRENT. Намечено удаление кода drm2 из базовой системы в пользу драйверов из портов, но часть компонентов drm2 останется из-за привязки к ARM-платам NVIDIA Tegra. Проводится альфа-тестирование поддержки архитектур i386 и PowerPC 64 в драйверах drm. Добавлена поддержка проброса GPU в окружения VMware. Обновлён стек для поддержки устройств ввода. Заголовочные файлы Evdev выделены из порта multimedia/v4l_compat в отдельный порт devel/evdev-proto;

    • В ядро добавлена новая подсистема для разработки PWM-драйверов. Для настройки предложена утилита pwm. В настоящее время совместимость с новой подсистемой обеспечена только в драйвере для ARM SoC Allwinner;
    • Представлена начальная поддержка 64-разрядных SoC на базе чипов Broadcom BCM5871X с процессорами ARMv8 Cortex-A57, нацеленными на использование в маршрутизаторах, шлюзах и сетевых хранилищах. В текущем виде уже поддерживаются iProc PCIe, BNXT Ethernet, OTP (One Time Programmable memory) и crypto-движок для IPsec. Для включения в ветку HEAD код будет готов приблизительно в третьем квартале;
    • Файлы DTS (Device Tree Sources) синхронизированы с ядром Linux 4.20 для ветки HEAD и 4.19 для 12-STABLE. Обеспечена компиляция DTS для некоторых плат arm64;
    • При участии компании Amazon подготовлена новая версия драйвера ena с поддержкой второго поколения сетевых адаптеров ENAv2 (Elastic Network Adapter), используемых в инфраструктуре Elastic Compute Cloud (EC2) для организации связи между узлами EC2 на скоростях до 25 Gb/s. Перед интеграцией в основную кодовую базу остаётся только провести рецензирование и проверку кода;
    • Улучшена поддержка FreeBSD на системах Power9 (ppc64): обеспечена возможность загрузки ядра, собранного при помощи LLVM, добавлена поддержка Rust, стабилизирована реализация Superpage, адаптирован графический драйвер radeonkms, улучшена обработка прерываний;
    • Продолжена работа по реализации поддержки архитектуры RISC-V. В текущем виде FreeBSD уже успешно загружается на плате SiFive Unleashed, но пока не может использовать более одного ядра CPU;
    • Добавлена поддержка загрузки FreeBSD на SoC Marvell 8K. Подготовлены драйверы для таймера, gpio, термодатчиков и sdcard/eMMC, в разработке находятся драйверы для SATA и USB;
    • Сформирован образ SD-карты для ноутбука Pinebook;
    • Добавлена начальная поддержка чипов RockChip RK3399, используемых в платах RockPro64. Реализована возможность сетевой загрузки, добавлена поддержка RK805 и RK808 PMIC (Power Management IC) для корректного управления питанием;
  • Приложения и система портов
    • В дереве портов включена по умолчанию сборка графических приложений с поддержкой Wayland;
    • Дерево портов FreeBSD преодолело рубеж в 32900 портов, число незакрытых PR держится на отметке в 2365, из которых 500 неразобраны. За отчётный период внесено 7333 изменений от 174 разработчиков. Права коммиттера получили два новых участника. Восемь участников лишились права коммита в порты из-за длительной неактивности.

      Среди значительных обновлений версий в портах отмечаются:
      PHP 7.2, Perl 5.28, Ruby 2.5, LLVM 7.0. Обеспечена параллельная установка портов PyQt. Прекращена поддержка KDE 4 и ветки FreeBSD 10, время жизни которых истекло. Для внешнего построения портов («:outsource») по умолчанию задействован флаг «USES=cmake».

    • Из портов удалено окружение KDE 4. Удаление Qt4 ожидается в конце марта. Рабочий стол KDE Plasma обновлён до версии 5.12. Задействованы актуальные выпуски KDE Frameworks и KDE Applications. Поддержка KDE синхронизирована с upstream. Библиотека Qt5 обновлена до выпуска 5.12.
      Реализация QtWebEngine пока остаётся на уровне 5.9.5, но в конце марта будет обновлена до Qt 5.12;

    • Продолжается развитие проекта ClonOS, развивающего специализированный дистрибутив для развёртывания инфраструктуры виртуальных серверов. По решаемым задачам ClonOS напоминает такие системы, как Proxmox, Triton (Joyent), OpenStack, OpenNebula и Amazon AWS, главным отличием от которых является использование FreeBSD и возможность управления, развертывания и управления Jail-контейнерами FreeBSD и виртуальными средами на базе гипервизоров Bhyve и Xen. Из планов на будущее отмечается добавление в web-интерфейс инструментов для live-миграции Bhyve и управления окружениями на базе Xen, поддержка CEPH/GlusterFS, iSCSI для виртуальных блочных устройств XEN и bhyve, средства для обеспечения высокой доступности (HA-cluster) и автоматической балансировки нагрузки между узлами, интеграция с системами мониторинга Prometheus/Grafana/Zabbix, система автоматического обновления узлов кластера, агрегирование сетевых интерфейсов, RestAPI, расширенная система разграничения доступа с интеграцией с Active Directory, RBAC и SSO.
    • Сформирован релиз HardenedBSD 12, форка FreeBSD 12, в который интегрированы дополнительные механизмы защиты и техники противодействия методам эксплуатации уязвимостей. В новом выпуске задействован механизм проверки целостности выполнения программ Non-Cross-DSO CFI (Control Flow Integrity), обеспечена дополнительная изоляция гипервизора bhyve, отключена по умолчанию технология одновременной многопоточности (SMT или Hyper-Threading), обеспечена
      сборка приложений с оптимизациями на этапе связывания (LTO, Link-Time Optimization);

    • Продолжена разработка системного менеджера nosh, предоставляющего инструменты инициализации, загрузки, ведения логов, управления фоновыми процессами и терминалами. Nosh позиционируется как замена BSD init и NetBSD rc.d, вобравшая в себя черты таких систем, как Solaris SMF, daemontools-encore, UCSPI и средств IBM AIX по раздельному управлению системой и сервисами. Предоставляется набор прослоек для использования команд, ставших привычных в других системах, импорта существующих конфигурационных файлов /etc/fstab, /etc/rc.conf, /etc/rc.local и /etc/ttys, а также настроек изолированных окружений Jail и PC-BSD Warden. В nosh предоставляются функции для определения порядка запуска сервисов, организации зависимостей между сервисами, обеспечения параллельного запуска сервисов, автоматической ротации логов, отслеживания работы сервисов и применения kevent для обеспечения событийно-ориентированного параллелизма.

      Из изменений в nosh с момента публикации прошлого отчёта отмечается добавление поддержки bcron, появление обвязок для OpenRC rc-update и rc-service, а также некоторых утилит из набора util-linux. Реализованы новые утилиты getuidgid, userenv-fromenv, setgid-fromenv, envgid, printenv, setlogin, console-decode-ecma48, console-control-sequence, console-flat-table-viewer, console-input-method и local-stream-socket-connect. Добавлены файлы для большого числа различных сервисов. Расширены средства настройки сервисов в привязке к пользователям. Для работающих в пространстве пользователя виртуальных терминалов добавлена поддержка методов ввода. Вместо NCurses для организации вывода на экран задействована новая библиотека TerminalCapabilities, предоставляющая поддержку управляющих последовательностей ECMA-48 и DEC VT.