Представлен отчёт о развитии проекта FreeBSD с января по март 2012 года. После выхода 13 января FreeBSD 9.0 в первые месяцы 2012 года основные усилия разработчиков были направлены на подготовку релиза FreeBSD 8.3, который был выпущен в середине апреля и кроме поддержки нового оборудования включал результаты бэкпортирования некоторых возможностей из FreeBSD 9.
Основные достижения:
- Система
- В базовую систему FreeBSD 10.0-CURRENT и 9.0-STABLE по умолчанию установлен распространяемый под лицензией BSD компилятор Clang 3.0. В FreeBSD 10.0-RELEASE принято решение задействовать Clang в качестве системного компилятора по умолчанию, GCC будет оставлен в качестве опции. В настоящее время, как минимум для FreeBSD 10.0-CURRENT обеспечена полноценная пересборка базовой системы и ядра в конфигурации GENERIC без предупреждений при сборке с опцией "-Werror" (для изменённых конфигураций ядра предупреждения пока могут наблюдаться).
В src.conf добавлена опция WITH_CLANG_IS_CC, при установке которой Clang по умолчанию будет установлен в качестве базового системного компилятора, т.е. заменит собой /usr/bin/cc, /usr/bin/c++ и /usr/bin/cpp. GCC пока остаётся в системе, даже при использовании опции WITHOUT_GCC, gcc будет доступен как /usr/bin/gcc, /usr/bin/g++ и /usr/bin/gcpp. Кроме того, в src.conf добавлена опция WITH_CLANG_EXTRAS, которая позволяет задействовать при сборке несколько дополнительных инструментов, созданных в рамках проектов LLVM и Clang, таких как 'llc' и 'opt'. Подобные утилиты могут оказаться полезными для работы с биткодом LLVM (.bc) и ассемблерными файлами LLVM (.ll).
В настоящее время все усилия разработчиков направлены на обеспечение сборки и запуска всей системы FreeBSD с использованием Clang, в том числе проверку работы как можно большего числа приложений, включая порты. Пользователи могут существенно помочь в этом начинании приняв участие в тестировании и сообщая о наблюдаемых проблемах. Что касается сборки потров с использованием Clang, то в это области также отмечается значительный прогресс: многие мэйнтейнеры уже адаптировали свои порты для работы с Clang, налажен процесс автоматической периодической проверки сборки портов с использованием Clang. Тем не менее в портах ещё можно встретить приложения, которые не могут быть собраны с Clang, как правило это очень старые программы, которые часто не собираются и с новыми версиями GCC.
Из планов упоминается работа по импортированию в систему нового снапшота Clang, на базе которого будет сформирован релиз LLVM/Clang 3.1 (релиз ожидается в ближайшие дни). В Clang 3.1 ожидается улучшение поддержки кросс-компиляции, что поможет форсировать процесс обеспечения кросс-компиляции ядра и базовой системы FreeBSD для архитектур ARM и MIPS.
- Продолжается работа по созданию для FreeBSD полноценного С++ стека, целиком распространяемого под лицензией BSD и независящего от кода проекта GNU. Проведено расширенное тестирование и добавлены новые возможности, например, поддержка ARM EABI, в библиотеки: libc++ (реализация элементов, определённых в стандарте C++11) и libcxxrt (реализация спецификации C++ ABI). Использование предварительной версии Clang 3.1 совместно с данными библиотеками демонстрирует полное прохождение тестов на совметсимость со стандартом C++11. По умолчанию библиотеки пока не используются, так как библиотека libc++ не совместима с поставляемым в базовой системе gcc и может работать только с clang. Переход на новый C++ стек ожидается во FreeBSD 10, одновременно с задействованием по умолчанию Clang.
Реализация расширенных функций для работы с локалью (xlocale), от которых зависит развиваемая проектом LLVM библиотека libc++, протестирована c множеством портов, изначально написанных для реализации xlocale от проекта Darwin. Выявленные в процессе тестирования ошибки исправлены, код библиотеки планируется выпустить в составе FreeBSD 9.1.
Во FreeBSD-CURRENT сборка libsupc++ теперь осуществлена в виде разделяемой библиотеки, что позволяет упростить замену данной библиотеки на libcxxrt от проекта LLVM. Выбор какие из библиотек использовать, GNU libsupc++ или BSD libcxxrt, осуществляется через изменение настроек в libmap.conf. Если в качестве libstdc++ используется libcxxrt, пользователь имеет возможность связывания с обоими библиотеками, использующими libstdc++ и libc++, что значительно упрощает миграцию.
Из открытых задач остаётся создание замены для некоторых частей libgcc_s и системы динамического связывания, проведение тестирования сборки портов с libc++ (большинство портов без проблем собираются, но остаются такие, которые жестко привязаны к libstdc++ или требуют патчей), переход на сборку и использование libc++ и libcxxrt по умолчанию (когда clang станет компилятором по умолчанию в базовой системе); удаление libstdc++ из базовой системы и помещение в порты для обеспечения обратной совместимости;
- Возобновлена работа над проектом FSC (FreeBSD Services Control), в рамках которого развиваются похожие на Solaris SMF и daemontools инструменты для управления и мониторинга работой системных сервисов. Для контроля за работой сервисов используется фоновый процесс fscd, сервисы добавляются при помощи утилиты fscadm. В случае аварийного завершения работы сервиса, fscd распознает падение процесса и запускает сервис вновь. По сравнению со сторонними пакетами, такими как daemontools, система FSC имеет несколько преимуществ, например fscd использует push-нотификацию вместо поллинга (отправляет уведомления, не требуя периодического опроса состояния). Кроме того, fscd является внутренней подсистемой, легко интегрируемой в rc.d-инфраструктуру FreeBSD и полностью поддерживаемой разработчиками (daemontools является неподконтрольным портом для которого можно лишь поддерживать набор патчей). В настоящее время подготовлена новая версия FSC и связанного порта со вспомогательными утилитами, поддерживающая большее число опций, добавляющая новый файл конфигурации fscd.conf, поддерживающая отладочный режим и поставляемая с обновлённым rc.d-скриптом для запуска fscd;
- Достигла стабильного состояния распространяемая под лицензией BSD утилита sort, написанная с целью замены GNU sort. Отмечается, что производительность BSD sort находится на уровне GNU sort и поддерживаются все возможности присутствующие в GNU sort 5.3.0 (данная версия поставляется во FreeBSD). Кроме того в BSD sort реализован ряд дополнительных возможностей, например, корректно поддерживаются многобайтовые кодировки, в то время как GNU sort 5.3 в этой области испытывает проблемы. Из планов на будущее отмечается интеграция новой утилиты во FreeBSD-HEAD в качестве альтернативы, устанавливаемой под именем bsdsort (после того как будет ясно, что всё работает как задумано, утилита GNU sort будет удалена, а bsdsort переименована в sort). Также планируется интеграция в BSD sort поддержки многопоточной сортировки и реализация некоторых возможностей, которые присутствуют в последней версии GNU sort 8.15;
- Ведётся работа по замене устаревшей реализации регулярных выражений в libc на библиотеку TRE, распространяемую под лицензией BSD, поддерживающую многобайтные символы, совместимую с POSIX и работающую не хуже других альтернатив. Практически завершена разработка нового эвристического метода выявления соответствий с поддержкой поиска по множественным шаблонам (multi-pattern), который отличается заметным ускорением поиска по шаблонам. Из планов на будущее отмечается реализация поддержки возможностей, специфичных для GNU grep, а также проведение тестирования на предмет соответствия стандартам и корректности работы;
- Близится к завершению работа над новой утилитой bsdconfig с набором функций по настройке компонентов дистрибутива для интеграции в новый инсталлятор bsdinstall. Интеграция bsdconfig в bsdinstall позволит довести функциональность нового инсталлятора в плане конфигурирования системы до возможностей устаревшего инсталлятора sysinstall. В настоящее время разработка завершена на 70%, ожидается, что размер кода bsdconfig составит приблизительно 20 тысяч строк на shell. Среди незавершённых задач: создание набора модулей к bsdinstall для загрузки/установки бинарных пакетов и дополнительных наборов программ, а также создание модуля для настройки запускаемых сервисов;
- Доведён до конца проект по созданию демона auditdistd, нацеленного на обеспечение безопасного и надёжного способа передачи логов системного аудита поверх TCP/IP сети от локального демона аудита к демону аудита на удалённом сервере. Система аудита FreeBSD позволяет организовать ведение полного лога событий, который, в частности, может быть полезен для анализа причин и последствий инцидентов, связанных с нарушением безопасности. Необходимость создания auditdistd продиктована желанием обеспечить возможность надёжного хранения логов аудита на внешнем сервере, что позволит защитить данные аудита от модификации злоумышленником в случае взлома локальной системы (сейчас ядро передаёт события аудита напрямую в файл или через устройство /dev/auditpipe, так как лог сохраняется локально, злоумышленнику не составляет труда удалить лог или почистить в нём следы своей деятельности);
- В базовую систему FreeBSD 10.0-CURRENT и 9.0-STABLE по умолчанию установлен распространяемый под лицензией BSD компилятор Clang 3.0. В FreeBSD 10.0-RELEASE принято решение задействовать Clang в качестве системного компилятора по умолчанию, GCC будет оставлен в качестве опции. В настоящее время, как минимум для FreeBSD 10.0-CURRENT обеспечена полноценная пересборка базовой системы и ядра в конфигурации GENERIC без предупреждений при сборке с опцией "-Werror" (для изменённых конфигураций ядра предупреждения пока могут наблюдаться).
- Системы хранения и файловые системы
- Близится к завершению проект по реализации возможности увеличения размера файловых систем UFS и ZFS без размонтирования дискового раздела. Указанная возможность позволит существенно упростить поддержание виртуализированных окружений на базе FreeBSD. С практической стороны администратор сможет вначале изменить размер смонтированного на запись дискового раздела при помощи утилиты gpart, а затем изменить размер ФС с использованием growfs. Все операции выполняются без отмонтирования раздела, в том числе и для корневой ФС. В рамках проекта подготовлен новый GEOM-класс, внесены необходимые изменения в код ФС и драйвера da. В тестовых целях возможность изменения размера также добавлена в mdconfig и обеспечена поддержка изменения размера LUN в CAM Target Layer. В настоящее время вся запланированная функциональность работает и началась подготовка к интеграции кода в ветку FreeBSD-HEAD. Из планов на будущее отмечается адаптация инфраструктуры для выполнения tunefs и fsck для примонтированных на запись разделов;
- Готовятся для включения во FreeBSD-HEAD стек и ФС для накопителей NAND Flash, переданные сообществу FreeBSD компаниями Juniper и Semihalf. Среди компонентов, готовящихся к интеграции: Устойчивая к сбоям файловая система, основанная на механизме представления структур в форме лога и обеспечивающая равномерное использование блоков данных для снижения износа NAND Flash; Фреймворк для создания драйверов и набор драйверов для контроллеров NAND и чипов памяти; Cимулятор NAND-устройств; набор драйверов с поддержкой NAND Flash контроллеров (NFC) для NAND Simulator и Marvell MV-78100 (ARM); Набор сопутствующих утилит, инструментов и документации, необходимых для работы с NAND Flash и интеграции поддержки данной технологии в пользовательские приложения;
- Сетевая инфраструктура
- Выполнена работа по анализу производительности IPv6-стека FreeBSD. Если ранее основное внимание уделялось стабильности и корректности работы IPv6, то проект по анализу эффективности IPv6-стека направлен на концентрацию внимания на оценке производительности стека IPv6. Проведённая работа позволила выявить источники проблем, проявляющихся в понижении производительности при использовании IPv6 вместо IPv4. Разработанный в рамках проекта тестовый набор также может быть использован для оценки появления регрессивных изменений и для проверки качества внесённых оптимизаций.
В процессе начального анализа результатов измерения производительности были внесены улучшения в реализацию системы блокировок для обработчиков UDP, оптимизирован поиск маршрутов в таблицах, добавлена реализация отложенного вычисления контрольных сумм, обеспечена поддержка TSO6 и LRO для IPv6, включено offload-ускорение проверки контрольных сумм для loopback-интерфейса, оптимизировано использование кэшей и внесены многочисленные мелкие доработки, которые в некоторых случаях затронули и IPv4 стек. В результате удалось добиться заметного повышения производительности IPv6 для физических и loopback-интерфейсов при использовании offload-акселерации. Увеличить производительность UDP и повышена скорость работы IPv6-стека в общем виде, но в некоторые ситуациях IPv6 по прежнему медленнее IPv4, что в основном связано с отсутствием должных оптимизаций;
- В реализации множественных таблиц маршрутизации (Multi-FIB) добавлена поддержка IPv6. Для IPv6 поддержка Multi-FIB была добавлена ещё в 2008 году, сейчас данная возможность стала доступна и для IPv6. Используя Multi-FIB возможно определение правил, по которым к пакету будет применена одна из альтернативных таблиц маршрутизации, например, можно организовать "policy based" маршрутизацию с несколькими исходящими интерфейсами или привязать отдельную таблицу маршрутизации к Jail окружению. Разработка выполнена при поддержке компании Cisco Systems. Кроме того, отмечается обеспечение поддержки включения Multi-FIB через опцию на этапе загрузки без необходимости пересборки ядра, что позволяет использовать Multi-FIB с ядром GENERIC. Сокеты маршрутизации (routing sockets) теперь принимают во внимание FIB-ы и показывают сообщения маршрутизации только адресованные к привязанному FIB, что позволяет программам управления маршрутизацией и демонам маршрутизации производить выборочные обновления определенного FIB. В настоящее время поддержка IPv6 в Multi-FIB уже добавлена в ветку HEAD и бэкпортирована для веток STABLE-9 и STABLE-9 (отдельно подготовлен порт для STABLE-7).
- Выполнена работа по анализу производительности IPv6-стека FreeBSD. Если ранее основное внимание уделялось стабильности и корректности работы IPv6, то проект по анализу эффективности IPv6-стека направлен на концентрацию внимания на оценке производительности стека IPv6. Проведённая работа позволила выявить источники проблем, проявляющихся в понижении производительности при использовании IPv6 вместо IPv4. Разработанный в рамках проекта тестовый набор также может быть использован для оценки появления регрессивных изменений и для проверки качества внесённых оптимизаций.
- Поддержка оборудования
- В звуковом драйвере HDA (snd_hda) улучшена поддержка вывода звука через порты HDMI и DisplayPort. В частности добавлено получение EDID-подобных данных от кодеков и видеодрайверов c информацией о звуковых возможностях устройства отображения. Реализована возможность установки специфичных для HDMI и DisplayPort опций кодеков, таких как число каналов, конфигурация громкоговорителей и маппинг каналов. Добавлена поддержка дополнительных многоканальных форматов, для HDMI и DisplayPort поддерживаются каналы 2.0, 2.1, 3.0, 3.1, 4.0, 4.1, 5.0, 5.1, 6.0, 6.1, 7.0 и 7.1. Добавлена поддержка проброса сжатых звуковых потоков с интенсивностью в диапазоне 6.144 - 24Mbps, таких как s DTS-HD Master Audio или Dolby TrueHD. Добавлена поддержка мультиплексирования шины HDA для обеспечения высокоскоростных потоков (например, 92 и 184 Mbps), что позволяет обрабатывать одновременно 192/24/8 LPCM-потоков. Указанная функциональность успешно протестирована для видеокарт NVIDIA GT210 и GT520 с драйвером nvidia 290.10. Отчеты об успешном использовании HDMI также получены для карт Intel c экспериментальным KMS-драйвером, а также для ограниченного числа старых карт AMD/ATI. Для старых карт NVIDIA ION и Geforce 8300 поддержка HDMI пока не работает. В настоящее время код уже принят в ветки HEAD и 9-STABLE;
- Обеспечена полнофункциональная поддержка 802.11n в режиме станции и точки доступа (hostap) для беспроводного оборудования на базе чипов Atheros. Поддерживается агрегация линков, обработка BAR TX и программная повторная отправка кадров, но пока не реализованы энергосберегающие режимы hostap. Кроме релизации режимов энергосбережения среди открытых задач отмечается проведение тестирования и выявления ошибок, реализация в драйвере возможности фильтрации кадров, устранение проблем с потерей трафика во время операций сканирования сетей (scan/bgscan, при тестировании рекомендуется использовать опцию "-bgscan" для запрета фонового сканирования);
- Разработан новый драйвер isci для SAS-контроллеров, интегрированных в чипсеты Intel C600. Драйвер isci уже включён в состав релиза FreeBSD 8.3 и интегрирован в ветки head, stable-9, stable-8 и stable-7;
- Во FreeBSD/arm отмечается прогресс поддержки SoC компании Texas Instruments, таких как OMAP3, OMAP4 и AM335x. Обеспечена поддержка таких компонентов процессора Cortex-A, как GIC (Generic Interrupt Controller), PL310 L2 Cache Controller и SCU. Для PandaBoard (TI OMAP4430) и PandaBoard ES (OMAP4460) на базе двухядерного процессора ARM Cortex-A9 в настоящее время реализована поддержка USB, проброса Ethernet поверх USB, GPIO, I2C и MMC/SD. Для платы BeagleBone (TI AM3358/AM3359), основанной на одноядерном ARM Cortex-A8, поддерживается Ethernet, кэш L2, GPIO и I2C. На указанных платах FreeBSD успешно запускается в многопользовательском режиме с корневым разделом через NFS. Среди компонентов, поддержка которых пока не доведена до конца: SMP, DMA, SPI, MMC/SD, Video, Audio;
- Улучшение во FreeBSD/powerpc поддержки процессоров Freescale QorIQ, идущих на смену семейству PowerQUICC (MPC85xx). QorIQ базируется на архитектуре DPAA (Data Path Acceleration Architecture), которая подразумевает интеграцию в SoC функций обработки пакетов. За отчётный период добавлена поддержка SoC QorIQ P5020 в 32-разрядном режиме, обеспечено полноценное функционирование Ethernet (в режиме DPAA Regular Mode) и начальная поддержка расширенного SDHC;
- Переработана поддержка hwpmc(9) для архитектуры MIPS. Код msip24k объединён с кодом, специфичным для CPU и аппаратной архитектуры, что упростило процесс добавления поддержки новых процессоров. Добавлена поддержка процессоров Octeon PMC;
- Основная часть системы динамической отладки DTrace портирована для архитектуры MIPS (поддерживается ABI o32 и n64, пока не протестирована работа с n32). Реализация DTrace для MIPS в настоящее время проходит 853 из 927 проверок тестового набора DTrace. Пока не поддерживаются DTrace-провайдер fbt и пользовательский инструментарий DTrace. Ведётся работа по портированию для архитектуры ARM.
- Изолированные окружения, эмуляторы, безопасность и ограничения ресурсов
- Подготовлен новый порт linux_base с набором компонентов для работы Linux-эмуляции, основанный на CentOS 6 (старый порт был основан на устаревшей версии Fedora Linux). В настоящее время новый порт пока пригоден только для использования в тестовых окружениях, так как в нём присутствуют зависимости от функций свежих версий ядра Linux, которые пока не реализованы в linuxulator. В настоящее время готовится к включению в дерево портов новый порт на базе CentOS и проводится работа по устранению конфликтов с другими портами linux_base;
- В состав FreeBSD-CURRENT включён модуль с реализацией статического провайдера DTrace для эмулятора Linux (linuxulator), обеспечивающий специфичные для linuxulator контрольные вызовы (probes). Для демонстрации использования подобных контрольных вызовов подготовлено несколько D-скриптов, позволяющих оценить функционирование различных частей linuxulator и что может быть использовано для выявления ошибок (например, проблем с блокировками) как во внутренних компонентах эмулятора, так и в работающих под его управлением приложениях.
- Приложения и система портов
- Отмечается прогресс в адаптации новых версий десктоп-оболочки KDE и Qt для FreeBSD. В порты помещены свежие релизы: KDE SC 4.7.4 (4.8.2 в экспериментальном репозитории area51), Qt 4.8.1 (в area51), CMake 2.8.7, PyQt 4.9.1, KDevelop: 2.3.0, KDevPlatform: 1.3.0 (в area51), Calligra 2.3.87 (в area51). Уже портированы, но требуют дополнительного тестирования, KDE SC 4.8.2, менеджер персональной информации KDE PIM 4.8.2, офисный пакет Calligra, бэкенды phonon-gstreamer, phonon-xine и phonon-vlc;
- Ведётся работа по наведению порядка с работоспособностью perl-модулей в портах - выявляются и исправляются модули для которых завершается ошибкой выполнение встроенных тестовых сценариев. Обновлены многие порты, у которых проблемы были вызваны отсутствием в зависимостях необходимых модулей. Решены проблемы с работой при сборке perl с поддержкой многопоточного режима (опция "-pthread"). Изначальная проверка всех "p5-*" портов показала, что только 61% модулей корректно проходят тесты, сейчас число таких модулей доведено до 90%, конечной целью проекта является исправление всех выявленных проблем. Из планов отмечается создание патчей для ещё не решённых проблем и инициирование подобной работы для тестировния других категорий портов, например, с дополнениями к python и ruby. Отмечается также намерение создать специальный фреймворк для тестирования портов и автоматизированного запуска тестов после обновления портов;
- Обновлены порты, связанные с языком программирования Haskell. Обновлены ключевые порты: Haskell Platform 2011.4.0.0 и GHC 7.0.4. Число связанных с Haskell портов превысило 300. Среди новых портов web-фреймворки Yesod и Happstack, а также система профилирования ThreadScope и пакеты wxHaskell, gitit. В рамках проекта hsporter началась разработка системы для автоматического создания и обновления портов на основе .cabal-файлов. Из задач которые предстоит выполнить отмечено тестирование работы GHC с clang/LLVM и обеспечение сборки порта lang/ghc с использование уже установленного компилятора ghc без загрузки отдельного архива с компилятором, добавление новых портов;
- Ведётся работа по подготовке новой версии дистрибутива для быстрого развёртывания сетевого хранилища (NAS, Network-Attached Storage) - FreeNAS 8.2.0. В новой версии ожидается расширение средств управления ZFS в GUI и поддержка плагинов, позволяющий автоматизировать запуск произвольных приложений в изолированных Jail-окружениях. После выхода FreeNAS 8.2 оперативно планируется выпустить версию 8.3, которая будет отличаться обновлением драйверов и переходом на ZFS v28.
- Дерево портов FreeBSD преодолело отметку в 23 тысячи портов, число незакрытых PR держится на уровне 1100. Ведутся подготовительные работы для обеспечения гладкой миграции дерева портов с CVS на систему контроля версий Subversion. Из проводимых работ отмечаются: проверка портов на работу в окружении FreeBSD; обновление bison, libtool и libiconv; задействование java/opendjdk6 в качестве реализации java по умолчанию; адаптация портов для обеспечения сборки с использованием компилятора Clang; обновление devel/boost, audio/sdl, devel/ruby1[8|9], postresql, apr, security/gnutls; проверка нового порта x11/xorg; задействование Pkgng (pkg_install нового поколения) для проверки целостности текущей инфраструктуры портов.