Доступен отчёт о развитии проекта FreeBSD с октября по декабрь 2015 года.
Основные достижения:
- Система
- Началась работа по добавлению в ядро средств для автоматической загрузки модулей, необходимых для работы оборудования, для которого отсутствуют загруженные драйверы. На основании информации в модулях построена карта для сопоставления драйверов и устройств PC Card, USB и PCI, которая сохранена в отдельном файле. После доведения проекта до конца пользователю будет предоставлена возможность загрузки минимального ядра, аналогичного сборке в конфигурации MINIMAL, с динамической загрузкой всех драйверов устройств по мере необходимости;
- Во FreeBSD-HEAD принят переработанный механизм вытеснения процессов в ситуации нехватки виртуальной памяти в системе (OOM, Out of Memory). В отличие от старого обработчика OOM, оперирующего текущим состоянием виртуальной памяти (снижение свободного места в разделе подкачки и небольшой остаток свободных страниц памяти), новый механизм пытается анализировать динамику изменения потребления памяти, принимая решение о принудительном завершении процессов только в случае реальной угрозы возникновения блокировки. Кроме того, изменён алгоритм выбора процесса для принудительного закрытия, который теперь не ограничивается учётом числа элементов в таблицах распределённых станиц памяти, но и пытается оценивать реальное число страниц, которое высвободится в результате принудительного завершения процесса, что позволяет более точно выбирать потенциально проблемные процессы;
- Во FreeBSD 11 принята новая реализация системного вызова sendfile, предназначенного для организации прямой передачи данных между файловым дескриптором и сокетом. Новая реализация разработана компаниями Netflix и NGINX Inc и отличается значительным увеличением производительности — файл теперь можно направлять в сокет в асинхронном режиме без ожидания завершения чтения с диска. Ранее при использовании флага O_NONBLOCK не блокировался только сокет, но продолжало блокироваться чтение с диска. В новой реализации можно асинхронно отправлять и читать данные. Реализация полностью обратно совместима с ранее доступными приложениями и может использоваться в качестве прозрачной замены, не требуя пересборки. Кроме увеличения производительности в новой реализации также добавлены новые флаги, предоставляющие дополнительный контроль над отправкой данных. Например, флаг SF_NOCACHE запрещает кэширование передаваемых данных, а при помощи макроса SF_READAHEAD() можно установить размер буфера упреждающего чтения;
- В рамках проекта relaunchd ведётся работа по созданию аналога системного менеджера Launchd (OS X), пригодного для использования во FreeBSD. В единый демон relaunchd сведены функции процесса init, системы стартовых скриптов rc.d и init.d, демонов inetd, atd, crond, и watchdogd. Из дополнительных функций отмечается управление запуском программ в jail-окружениях, передача дескрипторов сокетов из окружения хоста в jail, запуск программ в предопределённом sandbox на базе технологии capsicum. Формат файлов конфигурации основан на UCL, что позволяет определять параметры заданий в JSON и других форматах, поддерживаемых UCL. Relaunchd уже содержит всю базовую функциональность Launchd и добавлен в дерево портов, но пока позиционируется как экспериментальная разработка. Из планов по дальнейшему развитию отмечается поддержка перезапуска заданий в случае их краха, эмуляция cron, поддержка отслеживания изменений файлов и директорий, доведение до финального вида механизмов работы с jail;
- Продолжена разработка системного менеджера 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.
Доступны возможности для определения порядка запуска сервисов, организации зависимостей между сервисами, обеспечения параллельного выполнения сервисов, автоматической ротации логов, отслеживания работы сервисов и применения kevent для обеспечения событийно-ориентированного параллелизма. Система переносимая, не зависит от особенностей ядра и может применяться как в BSD-системах, так и в Linux.
С момента публикации прошлого отчёта в Nosh реализованы инструменты для экспорта логов cyclog/multilog в удалённые обработчики логов, поддерживающие RFC 5426 (например, logstash). В подсистему работы с виртуальным терминалом добавлена возможность прямого обращения к USB-устройствам ввода, без задействования sysmouse. Добавлена полная поддержка систем, на которых имеются только разделы ZFS. Обеспечено преобразование настроек приоритетов из unit-файлов systemd для использования с rtprio/idprio. Добавлена поддержка mfs для /tmp. Для полной замены rc.d из 157 отмеченных в плане задач остаётся выполнить 27.
- Разработчики FreeBSD рассматривают возможность замены подсистем init и rc на более современную систему инициализации и управления сервисами, которая позволит сократить время загрузки благодаря распараллеливанию запуска сервисов, повысить надёжность работы за счёт автоматического перезапуска в случае сбоя, упростить управление зависимостями через такие техники как активация по обращению к сокету, обеспечить возможность запуска сервисов по мере необходимости и завершать их при длительной неактивности, увеличить безопасность сократив число компонентов, работающих под пользователем root. В настоящее время решение по замене пока не принято. На звание нового системного менеджера претендуют три проекта: relaunchd (написанная с нуля реализация API launchd), развиваемый проектом NextBSD порт launchd из OS X (реализован через прослойку с реализаций механизма межпроцессного взаимодействия микроядра Mach) и nosh, оригинальная разработка по мотивам launchd, systemd и других систем;
- Близится к завершению проект миграции FreeBSD на инструментарий работы с исполняемыми файлами в формате ELF, эквивалентный набору GNU Binutils, но распространяемый под лицензией BSD. В настоящее время уже подготовлены BSD-версии библиотек libelf и libdwarf, а также утилит addr2line, nm, readelf, size, strings, as, ld и objdump и strip (elfcopy). Первый релиз запланирован на первый квартал 2016 года, из оставшихся задач отмечается добавление поддержки PE/COFF в elfcopy и адаптация системы сборки;
- Для платформ amd64 и arm64 по умолчанию задействован отладчик LLDB, развиваемый проектом LLVM. Из ещё не решённых задач отмечается реализация возможности использования LLDB для отладки разделяемых библиотек, портирование компонентов для удалённой отладки, возможность отладки core-дампов ядра и расширение поддержки архитектур, отличных от amd64 и arm64;
- Внесены улучшения в отладчик GDB: в настройках порта devel/gdb включена по умолчанию опция отладки ядра KGDB, улучшена поддержка кросс-отладки crashdump-ов, реализован новый режим отладки многопоточных программ;
- Переработана реализация кэша vnode, проведена оптимизация кода для распределения и чистки vnode;
- В sysctl добавлена поддержка фиксированных типов (знаковые и беззнаковые 8-, 16-, 32 и 64-разрядные целые числа). Для отображения информации о типах в утилиту sysctl добавлена новая опция «-t»;
- Изолированные окружения, эмуляторы, безопасность и ограничения ресурсов
- Усовершенствована работа FreeBSD в качестве хост-системы (dom0) для запуска гостевых окружений с использованием гипервизора Xen. В отчётный период основное внимание было уделено работе над HVMlite, новой реализацией режима PVH, который комбинирует элементы режимов паравиртуализации (PV) и полной виртуализации (HVM). Уже доступна начальная реализация режима HVMlite, который после готовности работы в качестве Dom0 заменит собой старую реализацию PVH. Патчи для поддержки HVMlite уже приняты в кодовую базу Xen будут доступны в составе Xen 4.7. Из других связанных с Xen изменений отмечается оптимизация производительности драйвера netfront и добавление поддержки unmapped IO в драйвер blkfront;
- Подготовлены патчи для организации сохранения дампов краха ядра в зашифрованном виде. Так как дамп содержит срез памяти процессов, он может включать конфиденциальные данные, такие как оставшиеся в буфере пароли. Для предотвращение утечки этих данных при попадании crash-дампа не в те руки, предлагается шифровать содержимое перед записью. Для расшифровки доступна новая утилита decryptcore;
- В состав FreeBSD 10-STABLE принято обновление пакета OpenBSM 1.2 alpha 4 с открытой реализации Sun Basic Security Module (BSM) Audit API, предоставляющего средства для управления аудитом системы и формат файлов аудита;
- Расширены возможности по работе в роли гостевой системы под управлением гипервизора Hyper-V. Увеличена производительность драйверов для синтетических сетевых адаптеров и устройств хранения Hyper-V, поставляемых в наборе FreeBSD Integration Services (BIS). В драйвер VMBus добавлена поддержка vRSS (Receive Side Scaling). Готовится к включению код для поддержки виртуальных машин с интерфейсом UEFI (Hyper-V Generation-2 VM);
- Проект HardenedBSD провёл большую работу по улучшению производительности и стабильности развиваемых для FreeBSD дополнительных механизмов защиты. Метки безопасности теперь могут быть привязаны не только к процессам, но и к отдельным потокам. Проведена реорганизация блокировок. Переработана реализация ASLR (Address Space Layout Randomization) для mmap(MAP_32BIT). Разработана новая утилита бинарного обновления системы hbsd-update, которая может использоваться для обновления окружений jail и ZFS Boot Environments (ZFS BEs). Достоверность обновлений обеспечивается сертификатами X.509. Полностью переписана утилита secadm, предназначенная для применения к приложениям дополнительных техник защиты. К сожалению у проекта HardenedBSD пока нет ресурсов для переноса наработок ASLR в основную кодовую базу FreeBSD;
- Сетевая подсистема
- Стартовал проект по переработке стека маршрутизации, в результате которого планируется поднять производительность и масштабируемость, а также подготовить задел для добавления расширенных возможностей. Основной проблемой текущего стека маршрутизации является чрезмерно большое число блокировок при обработке вывода пакетов, которые приводят к блокировке контекста при выполнении преобразования пакета в сетевой кадр, пригодный для отдачи оборудованию. В рамках инициативы подобные блокировки планируется свести к двум вызовам rmlock, что позволит добиться масштабируемости близкой к линейной;
- Доступен новый выпуск патчей с реализацией расширения Multipath TCP (MPTCP), позволяющего организовать доставку пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. Целью проекта является подготовка MPTCP-патчей для ядра FreeBSD, совместимых с эталонной реализацией MPTCP и дополнительными улучшениями;
- Системы хранения и файловые системы
- В механизм управления ресурсами RCTL добавлена возможность ограничения пропускной способности диска через задание лимитов на полосу пропускания чтения/записи (байт в секунду) и интенсивность операций ввода/вывода (число операций чтения/записи в секунду). Также представлен новый механизм придерживания запуска процессов в условиях превышения лимита. Код с реализацией нового RCTL уже в основном протестирован, обеспечена интеграция с ZFS и ожидается включение во FreeBSD 11.0;
- Подготовлен порт sysutils/fusefs-lkl с FUSE-модулем, который можно использовать для полноценного доступа к любым файловым системам, поддерживаемым ядром Linux, в том числе к ext4/3/2, XFS и BTRFS. Модуль построен с использованием наработок проекта LKL («Linux Kernel as a Library»), позволяющего скомпоновать ядро Linux в форме разделяемой библиотеки, которую можно собрать для различных платформ, в том числе для FreeBSD, и обращаться к функциям ядра из пользовательских приложений. Таким для работы с ФС используется оригинальный код драйверов из состава Linux;
- В состав FreeBSD 11-CURRENT принят код для загрузки с временным rootfs, вместо которого затем монтируется реальный корневой раздел. Процесс смены корневого раздела реализован в форме частичного завершения работы с удалением всех процессов, отмонтированием rootfs, монтированием нового rootfs, запуском процесса init и переходом к выполнению скриптов инициализации;
- При поддержке Netflix для подсистемы CAM разработан планировщик ввода/вывода CAM I/O scheduler, который будет включён в состав FreeBSD 11. Планировщик позволяет разделять различные типы ввода/вывода, давая возможность привязать ограничения к типам и характеристикам ввода/вывода (в том числе учитывать задержки при обработке недавних запросов, относительно средних показателей). Например, планировщик удобно использовать для адаптации системной нагрузки к производительности SSD-накопителей или для решения специфичных задач, таких как отдача данных для потокового вещания видео;
- Проходит рецензирование переработанный стек MMC/SD, переведённый на использование фреймворка CAM, что позволило задействовать в нём уже хорошо проверенную модель организации блокировок и средства для отладки. В настоящее время поддерживается только драйвер ti_sdhci, используемый для плат BeagleBone Black;
- Поддержка оборудования
- Подготовлен начальный порт FreeBSD для процессоров на базе архитектуры RISC-V. FreeBSD/RISC-V уже успешно загружается в многопользовательском режиме в симуляторе Spike;
- Для FreeBSD портированы библиотеки для работы с VideoCore, графическим процессором одноплатного ПК Raspberry Pi. Библиотеки обеспечивают доступ к такими возможностям VideoCore, как OpenGL, механизмы ускорения воспроизведения видео и управление HDMI. Библиотеки помещены в порт misc/raspberrypi-userland и могут быть использованы в медиацентре Kodi (XBMC). В порты также добавлен обособленный видеопроигрыватель omxplayer, использующий VideoCore API;
- Для включения в релиз FreeBSD 10.3 подготовлена серия изменений, связанных с загрузкой на системах с UEFI. Улучшена совместимость с различными реализациями UEFI. Решены проблемы с загрузкой, приводящие к выводу ошибки «ExitBootServices() returned 0x8000000000000002». Добавлена возможность установки переменных EFI из командной строки загрузчика. В UEFI-загрузчик добавлена поддержка корневых разделов с ZFS;
- Добавлена поддержка сборки релизов для дополнительных ARM-систем: BANANAPI, CUBIEBOARD и CUBIEBOARD2.
- К интеграции в FreeBSD 11-CURRENT готовится ICL-модуль с реализацией iSER Initiator с поддержкой iSCSI-расширений для RDMA (Remote Direct Memory Access), используемых в продуктах компании Mellanox. Данные расширения предоставляют доступ к средствам аппаратного ускорения перемещения данных, присутствующих в 10, 40, 56 и 100 Gigabit IB/Ethernet адаптерах Mellanox;
- В состав FreeBSD-HEAD принят новый драйвер cxgbei, позволяющий использовать средства аппаратного ускорения для iSCSI Initiator и Target при использовании карт Chelsio T5- и T4. Поддерживается ускорение операций с TCP, идентификации и извлечения iSCSI PDU из потока, генерация и проверка контрольных сумм, прямая (zero copy) передача/получение пакетов;
- Инициирован проект по добавлению во FreeBSD поддержки SoC, основанных на архитектуре MIPS и применяемых в беспроводных маршрутизаторах Ralink/Mediatek RT3050, RT3052, RT3350, RT3352, RT3662, RT3883, RT5350, RT6855, RT6856, MT7620, MT7621, MT7628 и MT7688. Из поддерживаемой функциональности отмечается: Interrupt controller, UART, GPIO, USB, PCI/PCIe, Ethernet и SPI;
- Представлена начальная реализация драйвера с поддержкой видеоподситемы SoC iMX.6, используемой в таких ARM-платах, как Hummingboard, RIoTboard и Cubox. В настоящее время при выводе через HDMI поддерживается только режим 1024×768, но после решения ряда проблем это ограничение будет снято;
- Расширены возможности драйвера ioat для устройств поддерживающих технологию Intel I/O Acceleration Technology, которые применяются в некоторых серверных системах Intel. В новой версии добавлена поддержка устройств Broadwell-EP, API расширен поддержкой операций «blockfill» и средствами выполнения операций копирования непоследовательных 8-килобайтных блоков памяти;
- Во FreeBSD 11-current и FreeBSD 10-stable добавлен драйвер mlx5 с поддержкой Ethernet и Infiniband сетевых карт Mellanox ConnectX-4, поддерживающих передачу данных на скоростях до 100GBit/s. Связанный с драйвером модуль ядра mlx5en включён по умолчанию в конфигурации GENERIC;
- Проведена работа по синхронизации состояния драйверов ntb_hw/if_ntb с кодом NTB-драйвера из ядра Linux 4.4;
- Добавлены драйверы для поддержки контроллеров сенсорных экранов, используемых в платах Raspberry Pi и Beaglebone Black (SoC AM335x);
- Ведётся работа по переводу порта ARMv6 с использования «soft float» ABI на «hardware float» ABI. После завершения перевода экспериментальный тип архитектуры armv6hf будет удалён и для ядра будет использован только «hardware float». Отличия «soft float» и «hardware float» ABI будут только на пользовательском уровне, например, будет оставлена возможность сборки библиотек в режиме soft-float через указание сборочной опции WITH_LIBSOFT. В одной системе одновременно могут находиться библиотеки, собранные с soft и hard ABI;
- Выполнено портирование FreeBSD на платформу Marvell Armada38x, в которой используется один или два CPU ARM Cortex-A9. Работа SMP-режима полностью работоспособна и протестирована на платах Marvell DB-88F6288-GP и SolidRun ClearFog. Образ корневой ФС может загружаться как с накопителей USB 3.0/2.0, так и через NFS при помощи сетевого адаптера с интерфейсом PCIe. Присутствует экспериментальная поддержка встроенного Gigabit Ethernet (NETA);
- Добавлен драйвер для Ethernet-контроллера Amlogic Meson, используемого на платах ODROID-C1 с SoC Amlogic aml8726-m8b;
- Продолжена работа по реализации поддержки 64-разрядной архитектуры ARM64 (AARCH64). Добавлена поддержка модулей ядра, совместно используемых страниц памяти (Shared page), CloudABI и большая порция мелких улучшений и исправлений;
- Добавлена начальная поддержка серверной системы SoftIron Overdrive 3000, оснащённой 8-ядерным ARMv8 CPU AMD Opteron A1100. Добавлен драйвер для PCIe и SATA-контроллера, обеспечена возможность загрузки FreeBSD. Из нерешённых задач отмечается написание драйвера для 10Gbase-T Ethernet;
- Улучшена работа ядра на системах с процессорами ARMv6/v7: поддержка KGDB, расширены возможности ptrace, улучшен код LIBUSBBOOT, поддержка Exynos EHCI, поддержка аппаратных точек останова, возможность сжатия модулей ядра методом gzip, подготовка нового кода pmap VM для включения во FreeBSD 10-STABLE;
- Приложения и система портов
- Обновлён графический стек. В портах libglapi, libGL, libEGL, libglesv2, gbm и dri задействован новый выпуск Mesa 11.0.8. Сервер X.Org обновлён до выпуска 1.17.4 (1.18 доступен для тестирования, но пока не добавлен в основные порты). Для включения в ядро почти готово очередное обновление драйвера i915;
- Внесены улучшения в инструментарий сборки базовой системы (buildworld): добавлен режим WITH_FAST_DEPEND, позволяющий ускорить сборку на 16-35% за счёт выноса фазы построения зависимостей на этап компиляции, реализована поддержка сборки с использованием ccache (WITH_CCACHE_BUILD) без необходимости замены CC в make.conf, внесены многочисленные улучшения в параллелизации процесса сборки и т.д.
- Ведётся работа по портированию для FreeBSD окружений MATE 1.12, CINNAMON 2.8 и GNOME 3.18;
- Проведена адаптация новых версий десктоп-оболочки KDE и фреймворка Qt для FreeBSD. В порты помещены релизы CMake 3.4.1, Calligra 2.9.1, PyQt5 5.5.1, PyQt4 4.11.4, QScintilla2 2.9.1, SIP 4.17, QtCreator 3.6.0. Ведётся работа по обновлению портов Qt5 и KDE до версий Qt5 5.5.1, KDE Frameworks 5.17.0, Plasma 5.5.1 и KDE Applications 15.12.0. Из основных задач отмечается включение в дерево портов KDE Frameworks 5 и Plasma 5, а также обеспечение работы QtWebEngine во FreeBSD;
- Подготовлен начальный порт с пользовательским окружением LXQt, развиваемого объединённой командой разработчиков проектов LXDE, Razor-qt и Maui/Hawaii.
- Обновлены порты, связанные с десктоп-окружением Xfce:
audio/xfce4-pulseaudio-plugin 0.2.4,
multimedia/xfce4-parole 0.8.1,
x11/xfce4-whiskermenu-plugin 1.5.2,
x11/xfce4-dashboard 0.5.4; - Продолжает развитие порт с платформой GitLab, предоставляющей средства для организации совместной работы с Git-репозиториями. В настоящее время ведётся работа по обновлению порта с GitLab 7.14 до выпуска 8.3, который использует Rails 4.2 и существенно упрощает решение проблем с зависимостями. До включения в дерево портов остаётся добавить около 5 зависимостей, что в 10 раз меньше, чем требовалось ранее;
- Последние достижения проекта NanoBSD, предоставляющего средства для формирования минималистичных сборок FreeBSD, связаны с развитием возможности работы сборочных инструментов без необходимости их запуска с правами root, упрощением процесса создания сборок и оптимизации образов для карт SD и microSD;
- Развиваются дополнительные утилиты для упрощения работы по созданию и поддержанию портов. Утилита pytoport позволяет сгенерировать каркас порта из пакета PyPI, учтя все зависимости, определив лицензию и добавив в pkg-descr. описание. Вторая утилита skog позволяет построить дерево зависимостей на основе вывода
фреймворка Ports. Третья утилита bandar формирует при помощи unionfs многослойную ФС для дерева портов, позволяющую быстро тестировать новые порты и вносить изменения в существующие; - Развивается проект по предоставлению возможности быстрой установки любых модулей к Node.js, представленных в штатном NPM-репозитории. В настоящее время проектом сформировано около 300 новых портов, включая Socket.IO и Jison;
- Дерево портов FreeBSD держится на уровне 25 тысяч портов, число незакрытых PR достигло отметки в 2000. За отчётный период закрыто около 1800 PR и внесено приблизительно 7 тысяч изменений. Из наиболее значительных обновлений портов отмечаются GCC 4.9, CMake 3.4.1, PostgreSQL 9.4 и ruby-gems 2.5.0;
- Началась работа по добавлению в систему портов поддержки определения различных вариантов приложений без разделения на отдельные порты. Например, пакет с Python-модулем может зависеть от нескольких версий интерпретатора Python (работать как с Python 2.x, так и с 3.x) или для одного приложения требуется сформировать несколько пакетов без разделения на отдельные порты (editors/vim и editors/vim-lite);
- Разное
- Во время сборки релизов прекращена генерация контрольных сумм MD5, в пользу SHA512;
- Реорганизация команды, отвечающей за устранение уязвимостей (Security Team). Команда теперь включает только двух участников: главного по безопасности (Security Officer) и его заместителя, которым делегированы функции взаимодействия с лицами и организациями, сообщающими о проблемах с безопасностью, проведения технической экспертизы и организации решения данных проблем разработчиками, отвечающими за связанные с ними подсистемы;
- Решается вопрос организации поставки в базовой системе инструментов, распространяемых под лицензией GPLv3, которые необходимы для организации сборки на вторичных архитектурах (например, arm64 и RISC-V), для которых Clang/LLVM пока недоступен, а вариант GCC под GPLv2 сильно устарел. Добавить код под GPLv3 в базовую систему проблематично из-за проявления дополнительных ограничений, которые могут быть неприемлемы для производных проектов. В качестве компромисса предлагается выделить инструменты под GPLv3 в специальные пакеты для базовой системы, которые будет поставляться в отдельном репозитории, не пересекаясь с кодом базовой системы.
- В спецификацию style(9), определяющую правила оформления исходных текстов ядра FreeBSD, добавлена поддержка типа bool, определённого в стандарте C99.