Как устроена разработка ReactOS, зачем в неё контрибьютить и почему она уже 20 лет в альфе

в 13:13, , рубрики: reactos, Блог компании Skillbox, операционные системы, системное программирование, Софт
Как устроена разработка ReactOS, зачем в неё контрибьютить и почему она уже 20 лет в альфе - 1

Виктор Перевёрткин, cистемный разработчик в «Лаборатории Касперского» и активный участник комьюнити разработчиков ReactOS о том, как устроена и кем создаётся ReactOS и работают ли в ней HOMM III. Статья написана на основе выпуска подкаста «Люди и код» от Skillbox Media (март 2022 года).

— Как возникла ReactOS и что значит «свободный клон Windows»?

— ReactOS — это операционная система, которую мы хотим сделать максимально совместимой с Windows. Сейчас мы ориентируемся на довольно старые версии — Windows XP и Windows 2003. Так удобнее для разработки: нужно зафиксировать какую-то версию, поскольку Windows тоже развивается, а нам с нашими небольшими ресурсами довольно тяжело за её развитием угнаться.

Начался проект ReactOS примерно так же, как ядро Linux: в 1996 году собрались энтузиасты, решившие создать свободный клон операционной системы Windows. В то время целью была совместимость с Windows 95 (и проект сначала назывался FreeWin95), затем, через пару лет, фокус сместился на совместимость с Windows NT. Тогда же появилось название ReactOS.

— Под какой лицензией делается проект?

— Основная лицензия — GPLv2, но кроме неё у нас есть довольно большое количество кода под другими лицензиями — BSD и MIT. Хотя если кто-то пишет какой-нибудь компонент, который предполагается использовать в других open-source-проектах, разработчик может его лицензировать под любой совместимой с GPL лицензией.

— Почему используется именно вторая версия GPL, а не третья? Например, Столлман везде говорит: «Используйте третью». И даже Линус Торвальдс, хотя он довольно консервативен, в какой-то момент перевёл ядро Linux на третью.

— У нас как-то исторически сложилось, что мы везде пишем «GPLv2 или выше». Когда-то в проекте были участники, которые специализировались на юридических моментах, — они разбирались в тонкостях, в том числе исследовали ReactOS на предмет возможных претензий со стороны Microsoft. Именно при них и выбрали GPLv2. 

— Для чего нужна ReactOS и как ее применять?

— Основная идея — сделать ядро, которое по архитектуре похоже на семейство Windows NT, а наша конечная цель — чтобы операционная система была легковесной заменой Windows для некоторых сценариев применения, например, для запуска GUI-программ на десктопе и Windows-специфичных устройствах.

Что касается фактического применения прямо сейчас, основные сценарии, которые мы видим на конференциях, в общении с нашими пользователями, в средствах коммуникации — это реверс-инжиниринг Windows. Раньше это было интересно в том числе с позиции секьюрити-ресёрча, но со временем мы довольно сильно отстали от свежих версий «винды» в плане безопасности. Всё-таки проект находится на стадии альфы уже больше 20 лет.

Те, кто хочет узнать, как устроена Windows, очень часто заглядывают в наши исходники. Когда надо понять, как работает тот или иной компонент в Windows, в ответах часто можно увидеть ссылки на исходный код ReactOS. Даже разработчики, которые пишут драйверы под Windows, пользуются нашими исходниками для изучения некоторых нюансов. 

На последней очной FOSDEM к нам подходил разработчик драйвера WireGuard для Windows и очень нас благодарил, потому что, посидев несколько ночей над нашим кодом, он смог разобраться, как всё работает, и написать хороший драйвер под Windows.

— Подскажи, есть какое-нибудь интересное железо, на котором запускается ReactOS? Например, я знаю, что энтузиасты любят устанавливать всё подряд на Raspberry Pi или Arduino. С ReactOS кто-то так экспериментирует?

— Сейчас единственная платформа, на которой мы работаем, — это x86. Какую-то особую экзотику вспомнить трудно. Впрочем, есть два необычных порта: на оригинальный Xbox c процессором Pentium III и на японское семейство компьютеров PC-98. Эти компьютеры довольно сильно отличаются от привычных х86 по периферии (хотя и имеют внутри совместимый процессор). Правда, компьютеры PC-98 остановились где-то на Pentium или Pentium II. То есть мы работаем только на самом-самом последнем поколении этих железок.

Единственная проблема — таких устройств осталось не так уж много и все они существуют в основном в Японии. Тем не менее есть человек, который пишет драйверы и под такое экзотическое железо.

— Я правильно понимаю, что большинство юзкейсов сейчас — это всё-таки установка в виртуальной машине?

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

— Допустим, получится довести ReactOS до какого-то уже хорошего, не альфа-состояния, с поддержкой большого количества устройств. Какие юзкейсы ты видишь для ReactOS? Какое ПО можно использовать на этой ОС?

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

— А прямо сейчас какие популярные виндовые программы, которых нет на Linux, можно гонять на ReactOS?

— На ReactOS запускается большинство программ, которые работают на Windows XP. Сейчас в разработке слой совместимости с пользовательской частью других версий Windows. Как раз для того, чтобы запускать программы, которые работают на Windows 7, на Windows 10 и так далее. 

— А третьих «Героев» я смогу запустить?

— Да. Мы только недавно запустили драйвер звуковых карт AC’97, который Microsoft зарелизила под свободной лицензией, и теперь у нас даже есть встроенный звук — его раньше не было, и на это все жаловались. 

— А как вообще работаете над популяризацией системы? Какие-то контесты проводятся, митапы, PR-проекты и так далее?

— Мы стараемся участвовать в конференциях по свободному ПО. Например, недавно прошла FOSDEM 2022. Скоро мы будем участвовать ещё в одной конференции, которая обычно проходила в очном формате, но пока ещё к этому не вернулась. Это CLT. 

По-немецки конференция называется Chemnitzer Linux-Tage. Проходит она в Германии, в городе Хемнице. Она посвящена в первую очередь Linux, но исторически так сложилось, что мы уже лет десять в ней участвуем. Очень интересно бывает поговорить с людьми, которые находятся по другую сторону open-source-ПО. 

И ещё мы последние лет шесть участвуем в программе Google Summer of Code. Именно через неё когда-то в проект пришёл и я. 

— С какой критикой чаще всего сталкиваетесь? Может быть, на конференциях задают какие-то острые вопросы о ReactOS? 

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

Мы традиционно на многих конференциях стоим рядом с разработчиками операционной системы Haiku. И часто тоже с ними обмениваемся мнениями по поводу того, что и как нам стоит развивать дальше. А на форумах основной вопрос, который задают люди: «Прошло больше 20 лет, а вы до сих пор в альфе?» И второй: «Зачем вообще нужна ReactOS?»

— Ожидаемо. А как давно ты в проекте? Почему решил присоединиться именно к нему? Какую выгоду от участия в проекте для себя видишь? Не материальную, а вообще? 

— Как я уже сказал, я пришёл в проект через программу Google Summer of Code. Это было в 2018 году. Я как раз оканчивал университет и уже несколько лет следил за проектом. Трудно сказать, почему меня заинтересовал именно он. Мне идея понравилась.

Сначала я следил за Wine, а потом узнал про ReactOS и моё внимание переключилось туда. Потому что я решил: пусть ReactOS и берёт многие компоненты из Wine, но при этом ядро у проекта собственное, то есть это более самостоятельный проект. 

Также, если смотреть именно проекты, связанные с операционными системами, то ReactOS в этом плане даёт очень хорошие возможности для обучения. Многие концепции, которые уже были реализованы в Linux, BSD-системах, ещё не реализованы у нас — просто из-за нехватки свободных рук. 

А значит, если вы хотите узнать, как что-то работает в современных операционных системах, и обучиться этому — ReactOS будет самым подходящим проектом. Потому что, когда человек приходит, например, в Linux, там уже нужно «двигать науку», разрабатывать какие-то новые концепции. Но перед этим неплохо бы освоить те, что уже есть сейчас. У нас это можно сделать.

— Какие компоненты системы ты писал сам или над какими работаешь? Есть ли у тебя какая-то специализация в этом плане? Или берёшься за любые открытые задачи?

— Вначале я попробовал себя в довольно большом количестве вещей: и в пользовательском пространстве кое-какие сетевые библиотеки писал, и провёл то ли Paint, то ли калькулятор — я уже сейчас не вспомню. 

Однако теперь моя основная специализация — ядро и драйверы. Я занимался стеком хранения: это драйверы жёстких дисков и файловых систем. В ядре я занимаюсь той его частью, которая отвечает за управление драйверами. Плюс ко всему я являюсь одним из мейнтейнеров ядра, следовательно, беру в работу и другие части тоже — не все, но многие за мной закреплены. 

— Есть ли какая-то иерархия в проекте и какое положение ты в ней занимаешь? Есть ли у тебя какие-то «лычки»?

— У проекта довольно долгая история. Действительно, раньше там выбирались и координаторы проекта, и люди, которые занимаются сетевой инфраструктурой, и так далее. Сейчас сообщество стало чуть поменьше. Именно разработчиков у нас человек десять — максимум пятнадцать.

Люди приходят в проект, выбирают область, которая им нравится. И, скорее всего, будет один или два человека, с которыми придётся обсуждать свои задачи, — в итоге всё как бы само собой строится на демократических принципах. Сейчас нужды в какой-то такой иерархии просто нет.

— На каком языке или языках пишется ReactOS? Используются ли фреймворки, интересные библиотеки? 

— Основной язык — C, как и в большинстве операционных систем. Ядро у нас написано на C, большинство драйверов используют C. Кстати, значительное количество user-mode-компонентов написано на С++ — правда, пока это довольно старый C++. Мы все ждём волонтёра, который портирует под наши нужды стандартную библиотеку из современных «плюсов» (C++17, C++20). 

В качестве билд-системы мы используем CMake. Причём мы его адаптировали уже давно, больше 10 лет назад. ReactOS был одним из первых больших open-source-проектов, в инфраструктуру которого включили CMake. Кстати, на главной странице CMake до сих пор есть ссылка на ReactOS как на проект, который использует эту билд-систему. 

А вот среди библиотек трудно что-то выделить. Мы, как я уже сказал, используем довольно много кода из Wine. Это в первую очередь всякие DLL-библиотеки. Также в качестве SDK у нас используется код проекта MinGW. Точнее, даже не его самого, а его форка — MinGW-w64, который сейчас является основным. Для тех, кто не знает, я скажу, что это SDK для разработки под Windows с помощью опенсорсного тулчейна GCC или LLVM.

— Помимо разных версий FAT и NTFS что-то поддерживаете?

— С NTFS есть некоторые проблемы. Драйвер файловой системы — это вообще довольно сложная штука. Он у нас в принципе есть, но работает только в режиме чтения. Но зато можно «подложить» драйвер из Windows, и он будет работать.

Помимо FAT32 и NTFS, у нас есть поддержка файловых систем EXT: Ext2, Ext3 и Ext4, также поддерживается файловая система Btrfs. Правда, все эти проекты не наши, и за них следует сказать спасибо людям, которые поддерживают эти драйверы непосредственно для Windows. Мы же просто затащили их в свою сборку по умолчанию и время от времени засылаем разработчикам небольшие патчи. 

Также многие драйверы файловых систем, которые мы используем, взяты из примеров, выложенных самой Microsoft. Последние лет шесть компания потихоньку выкладывала многие компоненты Windows в свой GitHub-репозиторий, который называется Windows Driver Samples. И поскольку лицензия позволяет, мы их используем. Так что в ReactOS есть ещё и код, написанный Microsoft. 

— Интересны отношения с Microsoft. Есть ли какие-то тёрки? Или какое-то официальное сотрудничество? Например, я помню, была история, когда они обещали Столлману выложить исходники Windows XP. И он ждал-ждал, не дождался — и в итоге послал жёсткий диск с запиской: «У вас, видимо, не хватает жёстких дисков, чтобы скинуть исходники. Вот, я вам даю свой. Пожалуйста, пришлите обратно с исходниками XP, как обещали». 

— Официальных отношений у нас нет. Это уже дела давно минувших дней, но одно время проект был заморожен из-за того, что его проверяли на использование утёкшего кода из Windows. А ещё до этого, году в 2004-м, была утечка кода Windows 2000, которая попортила нам репутацию.

Иногда выходят статьи от индивидуальных разработчиков Microsoft, где они либо хвалят, либо, наоборот, хают проект, говоря, что невозможно, не подсматривая в «ворованный» код настоящей Windows, написать нашу систему вот так. На что мы всегда посмеиваемся, потому что используем только тот код от Microsoft, который корпорация выкладывает под open-source-лицензиями. 

Я думаю, Microsoft не видит в нас серьёзного конкурента. В первую очередь потому, что Windows, судя по всему, уже не основной их бизнес. Да и мы метим только в определённую аудиторию пользователей Windows, даже не во всю.

— Как вообще вы понимаете, из каких компонентов состоит Windows, как работает, пользуетесь ли реверс-инжинирингом?

— Да, мы пользуемся реверс-инжинирингом. Причём здесь есть такая интересная правовая особенность: общественная организация, которую мы создали, чтобы собирать донаты и делать какие-то юридические вещи, зарегистрирована в Германии, то есть в Евросоюзе. А там некоторое время назад был разрешён реверс-инжиниринг с целью создания совместимого ПО. 

Мы используем данные, которые выкладываются самой Microsoft. Например, есть довольно много книжек про то, как внутри устроена Windows. Самая известная — Windows Internals. Есть и другие источники — например, исследователи безопасности публикуют внутренности «винды». И мы в этом им отчасти помогаем.

Тем не менее основной способ, с помощью которого мы понимаем, как что устроено, — это написание тестов. То есть мы пишем какой-то тест, который дёргает апишки на Windows, а потом уже пишем код под ReactOS.

— Какие есть коллаборации с другими свободными проектами, помимо Wine и драйвера файловых систем? И работает ли это только в одну сторону, когда вы что-то берёте из проекта? Или вы в какие-то проекты отдаёте?

— Из больших проектов, помимо Wine и файловых систем, я могу ещё назвать MinGW-w64. Кто хотя бы что-то писал под Windows, знает, что там необходимо использовать заголовки, предоставляемые операционной системой, — они идут в пакете Windows SDK, который нельзя назвать Free Software. А вот для тех, кто хочет использовать опенсорсный тулчейн или собирать виндовые программы под Linux, есть библиотека MinGW-w64. Мы её используем довольно активно. И мы туда контрибьютим, и они в нас контрибьютят. 

Раньше у нас было довольно широкое взаимодействие с Wine. Однако теперь он спонсируется многими компаниями и их разработка нас серьёзно обогнала. По мелочи есть ещё какие-то проекты и библиотеки. Кстати, мы иногда отправляем патчи в CMake и GCC; кроме того, наш след можно найти практически во всех проектах, которые мы используем.

— Используете ли какие-то готовые библиотеки, фреймворки для создания графического окружения? Или собираете графику на чём-то другом?

— Мы не используем никаких тулкитов. В основном пишем код на WinAPI. Это, кстати, довольно серьёзный вопрос для дискуссии внутри сообщества: стоит ли нам всё писать, как было написано в Windows (а там всё было написано с помощью WinAPI), либо для ускорения разработки лучше использовать какие-то тулкиты. Какого-то консенсуса по этому вопросу пока нет. 

— Какие сейчас большие цели, большие вызовы стоят перед комьюнити ReactOS? Что-то, что качественно изменит облик ReactOS или привлечёт к ней внимание ещё большего количества пользователей?

— Мы хотим решить все проблемы с нестабильностью ядра и базовых драйверов. Когда это будет сделано, скорее всего, мы наконец-то объявим, что проект ReactOS перешёл в стадию беты. 

Нам очень не хватает разработчиков ядра. Мы долго думали, как их привлечь. Сейчас новые люди, которые к нам приходят, — это в основном студенты. Ещё иногда к нам возвращаются разработчики, которые давно контрибьютили. 

— Типичный разработчик ядра ReactOS — кто он? Какой у него грейд, какие скиллы? Если бы вы публиковали вакансию, что бы там было написано?

— У нас есть возможность нанимать людей. Но, поскольку ресурсы ограничены, мы это делаем очень избирательно. Для начала всё равно придётся поконтрибьютить бесплатно. 

Если говорить о портрете разработчика ядра, то это должен быть человек, который умеет программировать на C. Он должен представлять себе, как работает операционная система, знать концепции виртуальной памяти, как функционируют устройства. Последнее скорее для тех разработчиков, которые собираются писать драйверы. В ядре есть и вещи, которые не затрагивают работу с устройствами непосредственно.

Мы всегда рады помочь обучиться новым контрибьюторам. Прямо с нуля программированию на С мы не учим, конечно. Но приходят люди, которые что-то писали в институте, и мы им кидаем материалы, которые затрагивают именно нашу специфику.

А если смотреть глубже, то нам бы подошли люди, которые занимаются разработкой под Windows, — это как раз те, кто мог бы помочь больше всего.

— Помимо разработчиков, какие ещё волонтёры нужны проекту? Пиарщики, техписатели?

— Техписатели — это было бы интересно. У нас ни разу не было людей, которые занимались бы чисто написанием документации. Да, это бы сильно помогло, потому что разработчики обычно ленятся писать доку. А когда новые люди входят в проект, очень важно, чтобы можно было не сидеть и не ковыряться в коде, — даже несмотря на то, что мы стараемся поддерживать ядро в таком состоянии, чтобы код было легко читать. Всё же, когда речь идёт о таких сложных сущностях, как операционная система, — сложных именно с инженерной точки зрения, — неплохо бы иметь какое-то видение, как все компоненты устроены и взаимодействуют между собой.

Также нам нужны девопс-инженеры. У нас есть собственная инфраструктура, которая выгоняет автотесты в сборке и вот это вот всё. Там тоже всегда есть работа по улучшению процессов.

И тестеры. Люди, которые периодически проверяют сборки на то, чтобы не сломалась работа программы. Потому что автотестами покрыть всю операционную систему всё равно невозможно — хотя, наверное, возможно, но не с нашим количеством ресурсов. 

— Если я захочу присоединиться к проекту, что мне нужно сделать, куда зайти, кому написать?

— Разработчикам я всегда рекомендую сначала определиться, с какой сферой в проекте им бы хотелось работать. Потому что в ReactOS входит вообще всё — начиная от калькулятора и заканчивая драйвером жёстких дисков. Когда человек уже выбрал сферу деятельности, которая ему нравится (звуковая подсистема, или пользовательский интерфейс, или менеджер памяти в ядре), нам будет гораздо проще ему сказать, что в этой области у нас ещё не сделано, что можно было бы сделать, с чего можно было бы начать, есть ли какие-то простые штуки, которые можно пофиксить или сделать начинающему разработчику. 

Чтобы присоединиться к команде, надо написать нам в чат на платформе Mattermost. Также у нас есть список рассылки, но его в последнее время читает всё меньше и меньше людей. Поэтому я бы рекомендовал писать сразу в чат. Кроме того, у нас довольно большое сообщество в Discord. Там, правда, сидят не все разработчики — но там вас тоже сориентируют и подскажут, к кому конкретно обращаться. Ещё есть страничка для контрибьюторов, где описан весь процесс и есть нужные контакты.

— Как у вас устроена система работы над проектом с точки зрения разработчика? Система контроля версий какая-то или репозиторий на GitHub? Как берутся задачи? Куда они отправляются? Как проводится код-ревью, если есть несколько этапов?

— Разработка ведётся в монорепозитории на GitHub. Контрибьюторы присылают патчи через пул-реквесты. Тут ничего нового я не скажу. В качестве баг-трекера используется Jira, которая пока работает на наших серверах. Возможно, это потом поменяется. Но сейчас всё вот так. По поводу код-ревью: вы присылаете пул-реквест, кто-то из мейнтейнеров его смотрит, апрувит, даёт комментарии.

Однако я бы порекомендовал перед тем, как засылать какой-то патч, прийти в чат и спросить, не работает ли кто-то над такой же проблемой. Потому что будет обидно, если вы пришлёте патч, а кто-то уже над ним работал. У нас были даже такие ситуации, когда на одно и то же issue приходило сразу два патча. 

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

— А тем, кто интересуется ReactOS, что бы ты посоветовал почитать? Какие-то статьи, книги? Какие-то блоги, может, есть по этой теме? На кого подписаться в Twitter или в ещё каких-то соцсетях?

— Первая книжка, которую мы всем рекомендуем прочитать, — «Windows Internals». Возможно, не полностью, а какие-то основные первые главы, где объясняются ключевые аспекты устройства операционной системы. 

Каких-то конкретных блогов я не назову, но есть очень большое количество секьюрити-ресёрчеров, которые публикуют много интересных вещей о том, как устроена операционная система. Первое, что приходит на ум, — твиттер Алекса Ионеску, который когда-то тоже был разработчиком ReactOS. Он частенько публикует всякие интересные штуки о том, что и как происходит (правда, в современной Windows).

— А что ты сам читаешь, на кого подписан, за кем следишь? Не обязательно это должно касаться ReactOS — вообще в программировании, разработке, других технических областях.

— Я, как человек, который занимается в той или иной степени организацией open-source-проекта, слежу за блогами, которые связаны с этим. Например, мне нравится блог Нейта Грэхема, который является одним из мейнтейнеров проекта KDE. Он периодически постит интересные статьи о том, как устроен проект KDE, как там происходит управление и всякие такие организационные штуки. 

С технической точки зрения я также слежу за проектом LLVM и за микроядерными операционными системами, в первую очередь seL4. Интересно бывает посмотреть за новостями проектов Haiku OS и SerenityOS.

Автор:
habrahuser

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js