Содержание статьи
«Конечно, оно работает на NetBSD» — таков официальный слоган операционки, которой посвящен сегодняшний обзор. Долгое время NetBSD держала первенство как самая портабельная ОС в мире и, если говорить о технической стороне вопроса, до сих пор продолжает лидировать. Это единственная BSD, способная запускать драйверы, файловую систему и сетевой стек в пространстве пользователя, а сами драйверы здесь можно писать на скриптовом языке Lua. Компоненты этой системы ты можешь найти везде, начиная от роутеров и заканчивая смартфонами и игровыми консолями.
Истоки
NetBSD — первая из доживших до наших дней BSD-система, отпочковавшаяся от 386BSD. В 1993 году группа разработчиков, в составе которой был Тео де Раадт, скопировала исходный код 386BSD, интегрировала в него неофициальные патчи и другие наработки, а также некоторые компоненты BSD Net/2 и выпустила NetBSD 0.8. Девизом новой ОС стала полностью открытая модель разработки, высокое качество кода и хорошая портируемость, а слово Net в начале имени означало ориентированность ОС на применение в сети Интернет и распределенный принцип разработки.
Сегодня NetBSD уже доросла до версии 7.0, и ее развитие все больше ускоряется. В том или ином виде NetBSD можно встретить повсюду, включая многие модели роутеров и встраиваемой электроники. На NetBSD основана операционка карманной игровой консоли Sony PSP, высокоуровневые части системы используются в MINIX 3, Android (toolbox — набор инструментов командной строки, правда недавно он был заменен на Toybox), DragonFly BSD (система управления портами/пакетами pkgsrc) и огромном количестве других систем.
Но почему NetBSD до сих пор жива как цельная система и кому нужно ее развитие, когда все силы можно бросить на разработку той же FreeBSD? Тут все дело в банальной философии разработчиков и векторе развития проекта. Разработчики NetBSD пропагандируют написание кода с оглядкой на максимальную переносимость и, как следствие, качество и модульность, без всяких поблажек. И если с командой OpenBSD их интересы в основном пересекаются, то FreeBSD, которая уже давно превратилась из идейной академической ОС в мейнстримовый продукт, точно идет совсем другим путем.
В целом люди работают над NetBSD ради фана и получения опыта, а сама система — это очень хороший полигон для экспериментов и опробования идей. И появившаяся в последних версиях экспериментальная система rump-ядер и скриптинга ядра — самое красноречивое тому доказательство. NetBSD — это чисто академическая ОС, которая тем не менее отличается высоким качеством кода, простотой и стабильностью. А компактность и простота портирования на новое железо делает ее прекрасным решением для встраиваемой электроники.
Переносимость
Сборки NetBSD 7.0 доступны для 58 архитектур, включая 16 различных семейств CPU, а в списке поддерживаемых присутствуют все популярные платы для разработчиков, в том числе Raspberry Pi 2, ODROID-C1, BeagleBoard и Cubieboard2.
Ты можешь сказать, что в сравнении с тем, где работает Linux, 58 архитектур — это ерунда, и будешь прав. Но только отчасти. Дело в том, что между терминами «переносимость» и «количество поддерживаемых платформ» существуют коренные различия. Linux доступен для такого большого числа платформ не потому, что он так прекрасно и просто портируется, а из-за банальной популярности. Любой, кто плотно работал с кодом ядра Linux, знает, что, несмотря на то что в ядре, в общем-то, соблюдается разделение на платформенно зависимый/независимый код, зачастую оно нарушается, а само ядро представляет собой большой запутанный комок кода. Код NetBSD, напротив, четко структурирован и имеет несколько слоев абстракций от железа.
Драйверы в NetBSD полностью абстрагированы от платформы, включая такие ее компоненты, как шина ввода-вывода, DMA, прерывания или что угодно еще. Драйвер работает исключительно с абстрактными сущностями, что позволяет использовать его на любой архитектуре вообще без модификаций. Более того, один и тот же драйвер можно брать для разных версий периферии, подключаемой к разным шинам. На странице NetBSD приводится пример драйвера fxp для сетевых карт Intel. Один и тот же драйвер используется для архитектур alpha, arc, cats, cobalt, i386, macppc, prep, и он же — для PCI- и Cardbus-версий сетевой карты без всякого дополнительного кода. На самом деле ядро NetBSD настолько грамотно разделено на независимые слои, что даже процесс портирования на новую архитектуру здесь значительно проще, чем в других ОС. Портирование NetBSD на x86_64 в свое время заняло всего месяц, тогда как у разработчиков Linux на это ушло полгода. А теперь представь, насколько разные по количеству участников команды это делали!
Rump-ядро
Одним из побочных эффектов разделения кода NetBSD на независимые слои стала концепция так называемых rump-ядер. Технология позволяет запустить сильно урезанный и облегченный вариант ядра NetBSD в пространстве пользователя как обычный процесс или даже собрать его в форме разделяемой библиотеки. При этом в таком ядре могут работать почти любые драйверы или подсистемы (стек TCP/IP, например), запросы которых к оборудованию будут происходить с помощью специальных гипервызовов к основному ядру.
Если не вдаваться в детали, это означает, что, по сути, из NetBSD можно сделать нечто вроде микроядерной ОС, в которой драйверы, файловые системы и ключевые компоненты ядра будут работать в обособленных процессах (список компонентов, которые можно вынести в пространство пользователя). В случае с драйверами такой подход позволяет получить защиту от ошибок (ошибка в драйвере, работающем в отдельном процессе, не приведет к падению всей ОС целиком), а в случае с другими компонентами — возможность использовать измененные варианты подсистем ядра для разных приложений.
Например, rump позволяет собрать Firefox, подключив к нему сетевой стек NetBSD как библиотеку. Смысл здесь в том, что сетевой стек можно затюнинговать исключительно для Firefox, тогда как другое приложение может быть собрано с другим вариантом сетевого стека, пригодным именно для него. Более того, интерфейс гипервызовов, через который rump-ядра «общаются» с основным ядром и железом, можно использовать напрямую, что позволяет создавать по-настоящему быстрые приложения с минимальным оверхедом на обработку запроса к оборудованию.
Ну а самое интересное, что rump-ядра можно использовать не только в NetBSD, но и в Linux, Android, NetBSD, FreeBSD, OpenBSD, DragonFly BSD, Solaris и даже Windows. Все, что нужно, — это специальный модуль ядра (драйвер), который будет обрабатывать гипервызовы. В любой из этих систем можно использовать rump-ядро, то есть запускать драйверы, сетевой стек, файловые системы или даже брандмауэр NetBSD как обычные процессы или включать эти компоненты в другие приложения в форме разделяемой библиотеки.
Lua в ядре
Lua — очень простой скриптовый язык, предназначенный для встраивания в другие приложения. Особенной популярностью Lua пользуется у разработчиков игр (ярчайший пример — World of Warcraft), с его помощью они скриптуют сцены из игры, дают возможность создавать моды или вообще реализуют большую часть игры (как в случае с Grim Fandango, например). Поддержку Lua можно найти и во многих настольных приложениях (Adobe Lightroom, Apache, Snort, Wireshark), где этот язык служит для расширения функциональности и/или написания плагинов.
В NetBSD язык Lua можно использовать для скриптинга ядра. В теории возможность скриптинга позволяет тонко настраивать ядро под себя, реализовывать различные алгоритмы энергосбережения, обработки пакетов или даже быстро прототипировать драйверы. Вот, например, код простейшего алгоритма энергосбережения, который можно быстро затюнинговать под свои нужды без необходимости пересобирать ядро:
up = 80
down = 30
overheated = 100
function throttle (cpu, cur, max, min)
-- Текущая нагрузка на процессор
local load = get_load(cpu)
-- Температура
local temp = acpi.get_temp(cpu)
if temp >= overheated then
-- Снижаем частоту процессора на 20%
cpufreq.target(cpu, cur*80/100, '<=')
else
if load > up then
-- Увеличиваем частоту до максимальной
cpufreq.target(cpu, max, '>=')
elseif load < down then
-- Снижаем частоту на 20%
cpufreq.target(cpu, cur*80/100, '<=')
end
end
end
В реальности пока поддержка Lua в ядре реализована только для логирования событий (модуль systm) и управления энергосбережением (pmf), все остальные функции недоступны, но могут быть легко экспортированы в Lua с помощью обычного модуля ядра и пары сотен строк кода на си.
pkgsrc
Как и в любой другой BSD-системе, в NetBSD есть собственная система управления так называемыми портами, а если по-простому — набор скриптов для быстрой сборки приложений из исходников и формирования пакетов для установки в систему. В NetBSD система портов носит имя pkgsrc, однако ее отличие от других подобных реализаций в том, что, как и сама ОС, pkgsrc обладает крайне высокой портируемостью. Pkgsrc из коробки работает практически в любой UNIX-подобной ОС, включая все BSD-системы, Solaris, OS X, QNX и Linux. Более того, она может работать даже в Windows (cygwin) и Haiku (бывшая OpenBeOS).
В базе pkgsrc находится более 16 тысяч пакетов, а сама система уже давно зарекомендовала себя как удобное средство установки пакетов *nix в не слишком относящихся к UNIX операционных системах, таких, например, как OS X. Более того, pkgsrc долго использовалась как основная система портов в DragonFly BSD и до сих пор используется в MINIX 3, а в разное время существовали Linux-дистрибутивы, где pkgsrc служила единственным способом установки приложений (свежий пример — DracoLinux). Ну и конечно же, как и код самой NetBSD, код pkgsrc очень четко структурирован и просто красив. В этом смысле система портов FreeBSD — просто запутанный ад.
Выводы
Во всем остальном NetBSD достаточно стандартна и должна быть понятна любому, кто до этого работал с другими BSD-системами. В системе есть все, чтобы использовать ее как в продакшене, так и дома: журналируемая ФС (FFS + WAPBL), программный RAID, ZFS, поддержка SMP без глобальной блокировки, брандмауэры NPF и OpenBSD pf, активированные по умолчанию средства защиты от срыва стека (ASLR, mprotect, GCC ProPolice), 3D-ускорение с использованием открытых драйверов, поддержка любых графических сред и графических приложений и решенная проблема 2038!
Основная же область, где хорошо покажет себя NetBSD, — это, конечно же, встраиваемая электроника. Здесь среди полноценных ОС ей просто нет равных. Компактный и хорошо организованный код NetBSD также отлично подходит для изучения принципов работы операционных систем, да и для повышения навыков программирования тоже.