Haiku: погружение

Привет! Эта запись пишется в Haiku, установленной на ноутбуке. ZeroNet взят из git. Для его запуска понадобилось поставить пару модулей через pip, с указанием библиотеки сетевых функций:

-> LIB=-lnetwork pip install msgpack gevent

Сам текст набирается в консольной версии emacs, с включённым flyspell-mode. Правда, чтобы это стало возможным, мне пришлось внести правки в порты aspell и emacs.


В общем, как вы видите, я продолжаю играть с “гайкой”, поэтому я решил поделиться опытом, который я получил с этой ОС. В качестве формата, чтобы долго не думать, я выбрал стиль “бортового журнала”. Я просто примерно опишу то, что я делал всё это время, и это наверное будет своеобразной демонстрацией ОС.

Апология

Зачем? Если ответить лаконично, то я чувствую, что как программист я давно не нужен Linux’у. Linux уже продолжительное время не испытывает недостатка ни в фичах, ни в разработчиках. Haiku напротив, остро нуждается в поддержке.

Я не буду пытаться убеждать читателя, что Haiku лучше какой-то другой операционной системы и рассказывать чем именно. С моей стороны это было бы лукавством. Но дело в том, что меня не очень интересует “потребительская” сторона вопроса, когда я занимаюсь ИТ.

Например, я пользуюсь Emacs (а до этого — Vim) не потому, что это лучший редактор на свете (хотя наверное, это близко к действительности). А просто потому, что изучение таких вещей как Vim и Emacs не даёт расслабиться. Хотя, если вы ищете прагматической пользы, то и она при желании, конечно же, найдется. Но для меня необходимости в таком поиске — нет.

Итак, моя апология проста — Haiku интересная ОС!

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

Миниатюрность

Haiku обладает изяществом. На моём далеко не новом ноутбуке установлена Ubuntu и Haiku. Давайте замеряем скорость загрузки.

-> shutdown -r
# прошло немного времени...

Ubuntu загружалась 30 секунд до GDM и еще где-то 7 секунд до рабочего стола. Haiku загрузилась до рабочего стола примерно за 20 секунд.

У меня есть второй древний ноутбук на Pentium. Haiku стартует на нём примерно за те же 20 секунд.

Haiku не поддерживает никакого режима сна. Но скорость загрузки (и моментальное выключение) это частично компенсирует.

Я уже писал, что исходные коды системы занимают пару сотен мегабайт.

Я был не вполне прав. Часть редко изменяемых компонентов (например, WebKit) поставляются в виде готовых собранных пакетов, что сильно ускоряет сборку. Тем не менее, как и в случае с BSD, вся система представляет из себя единый проект, что упрощает её изучение.

Несмотря на лаконичность, система все-таки поддерживает основное оборудование. По крайней мере на ноутбуке заработал звук, wifi, проводная сеть. Можно установить яркость подсветки (на intel).

Итак, система миниатюрна. Но ей вполне можно пользоваться на реальном железе (если, конечно, заработает ваше оборудование). Откровенно говоря, я всё еще испытываю проблемы с некоторым железом. Что, правда, не мешает мне пользоваться этой ОС.

Однопользовательская система

Да, система однопользовательская. Да, можно написать rm -rf / и я думаю, это приведёт к проблемам, так как сотрёт пакеты и на следующей загрузке они не подмонтируются. С другой стороны, в Unix можно стереть свой домашний каталог, а это ведь и есть самые важные файлы в системе. :)

Зато это, в каком то смысле, упрощает жизнь. По крайней мере, я это ощутил. Просто запустил и работаешь. Никаких sudo, никакой мороки с правами. Никаких авторизаций. :) Пишу это и прямо вижу как трясёт бывалого Unix-оида. Понимаю, и мне даже нечем вас утешить, кроме того, что я сам Unix-оид. :)

Впечатления от использования

Пользоваться системой можно. Типовые программы, которыми я пользуюсь чаще всего:

  • терминал;
  • emacs (flyspell, w3m);
  • Браузеры Qupzilla и Dooble (в целом, адекватны современному
    интернету);
  • Telegram клиент;
  • Vision (irc клиент);
  • LibreOffice;
  • ZeroNet;
  • qbittorrent;
  • MediaPlayer;
  • Mail;
  • INSTEAD.

Чего нет, и я это заметил:

  • gimp (вообще, нет ничего gtk-шного, так как этот тулкит не
    перенесён. Но есть Krita);
  • inkscape;
  • darktable;
  • firefox.

В плане энергопотребления, система ест точно не больше Ubuntu.

Пакеты и обновление системы

Я переключился на ночные сборки репозиториев. Это можно сделать через GUI или прямо в консоли. После этого, обновление делается просто:

-> pkgman update
-> shutdown -r # если обновилась система

Я уже писал, что установка пакета — это его монтирование. Это, кроме красоты, несёт и полезное свойство — возможность откатываться к прошлым состояниям. Например, после одного из обновлений системы, мой второй ноутбук стал виснуть на загрузке. Чтобы вернуться к рабочему состоянию, я просто нажал “пробел” в момент работы загрузчика и выбрал предыдущее состояние из списка… То-есть, система поддерживает журнал состояний системы в смысле установленных пакетов. Правда, если этот журнал разростётся, это начнёт замедлять работу загрузчика.

Состояния записываются в /boot/system/packages/administrative и вы можете их почистить.

Часто бывает нужно заменить какой-то один из компонентов пакета. Например, драйвер. Для этого предусмотрен каталог /boot/system/non-packaged. Например, таким образом я отлаживал драйвер wifi. Чтобы не пересобирать всю систему, я собирал только драйвер и клал его в non-packaged.

Разработка портов

Я внёс несколько изменений в некоторые порты. В частности, одно из изменений позволило мне писать этот текст в emacs. На самом деле, для разработки портов порог вхождения совсем не высок.

Вы забираете дерево haikuports и haikuporter из github. Читаете инструкцию и вот, вы уже готовы собирать пакеты из исходников.

Если нужно изменить какой-то пакет, то к вашим услугам функции haikuporter по автоматическому созданию патчсетов. Добавить новый порт — тоже не проблема. Дальше — делаем PR и ждем…

Есть, конечно, свои нюансы и вопросы:

  • как должна выглядеть структура каталогов пакета;
  • как создать векторную иконку;
  • где хранить настройки программы;
  • и т.д.

Но во всём этом несложно разобраться, а описание процесса создания пакета — отдельная история.

В качестве примера, вот как выглядит рецепт для INSTEAD.

К счастью, когда я писал эту статью появилась подробная статья по портам от EXL. Вы можете прочитать её здесь.

Сборка системы

Систему очень просто собрать. Причём сделать это можно как изнутри самой Haiku, так и на Linux-машине. Во втором случае вам придётся собрать сначала тулчейн. Но сделать это нужно будет один раз. Сборка на Debian не вызвала проблем. На i7 она прошла довольно быстро. Для собрки образа, который можно записать на флешку используйте цель @nightly-anyboot.

-> jam -q @nightly-anyboot

Вообще, система сборки очень простая. Например, когда я что-то исправляю в системе, я собираю на самой системе только то, что нужно:

-> jam -q iprowifi4965
-> cp objects/haiku/x86_64/release/add-ons/kernel/drivers/network/wlan/iprowifi4965/ipro
wifi4965 /system/non-packaged/add-ons/kernel/drivers/bin/iprowifi4965

Вот и весь цикл разработки. В общем, это всё создаёт приятное ощущение того, что ты владеешь системой. То чувство, которого почти не осталось в Linux. Я приведу пару примеров.

Пример 0: xhci

Когда я только поставил систему на ноут и сделал:

-> tail -f /var/log/syslog

То увидел постоянные сообщения от ядра системы… Мне это не понравилось. Я скачал исходный код и нашёл сообщения в коде. После этого я собрал haiku.hpkg с отладочными сообщениями xhci и начал искать проблему. Довольно быстро удалось найти ошибку и исправить её.

Кстати, это не тот syslog, что используется в Unix. Например, в него сохраняются сессии из отладчика ядра KDL.

Пример 1: iprowifi2100

После того, как я поигрался с гаечкой на своем основном ноутбуке, я попробовал поставить её на другой древний ноутбук. К сожалению, система намертво зависала на загрузке. Покопавшись несколько дней, я нашёл несколько проблем и исправил их. Интересно, что одна из проблем оказалась регрессией в кодовой базе FreeBSD. Драйвер iprowifi210, как и остальные сетевые драйверы, работает в Haiku через прослойку
совместимости.

Теперь адаптер iprowifi2100 снова работает во FreeBSD и в Haiku.

Пример 2: почта

Встроенная в Haiku почта работает довольно занятным образом. Почта забирается специальным демоном mail_daemon:

~> launch_roster info x-vnd.be-post

Почтовые сообщения складываются в виде отдельных файлов в свои каталоги. Дальше, вы открываете файловый менеджер и смотрите сообщения.

Если вы выберете какое-то из сообщений — откроется программа просмотра (и написания) почты. Красиво и просто.

К сожалению, почта у меня не работала с mail.ru и частенько валилась. После марафона отладки появилась серия патчей, которая позволяет мне пользоваться почтой на постоянной основе.

Отладка

Если ядро по какой-то причине упадёт, то вы попадаете в отладчик уровня ядра. Вы можете вызвать его и без ожидания падения, конечно. Для этого нажмите: alt+PrtSc+d. Для продолжения работы наберите cont. Я не буду подробно описывать отладчик. Если вы разработчик уровня ядра, то разберётесь. Я просто упоминаю сам факт наличия этого отладчика из коробки. Это здорово!

Для отладки пользовательского режима (процессы, службы и т.д.) есть свой отладчик. Он запускается при падении приложений, а также вы можете запустить его из меню приложений и поотлаживать какой-нибудь процесс, прицепившись к нему.

В общем, установив систему, вы сразу готовы к полезной деятельности. ;)

Рассмотрение патчей

Патчи для Haiku (ядро и окружение) принимаются через систему gerrit по адресу: https://review.haiku-os.org,

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

Но на самом деле gerrit оказался удобной и полезной штукой. Кратко, алгоритм действия такой:

  • Регистрируетесь на https://review.haiku-os.org
  • Добавляете свой открытый ssh ключ
  • Забираете проект git clone ssh://user@git.haiku-os.org/haiku
  • Далее, можно пустить бранч и делать изменения
  • $ git commit
  • $ git push origin HEAD:refs/for/master

Далее, вам могут написать замечания, которые вы отрабатываете.

  • Отработали замечания
  • $ git commit -a — amend
  • Убедиться что в комментариях к коммиту есть “Change-Id: ID тикета в gerrit”
  • $ git push origin HEAD:refs/for/master

Вы можете прочитать о правилах добавления своих изменений здесь.

Также будет полезен Development FAQ.

Вместо заключения

Эта статья — долгострой. Она планировалась совсем другой. Более подробной и интересной, но… Идеальная статья, написанная никогда все-таки хуже несовершенной, но написанной сейчас. Поэтому я собрал волю в кулак и дописал статью до более-менее завершённого состояния.

Мы живём в мире, где ценность принято мерить коммерческой эффективностью. Я лично не разделяю такого взгляда на мир. История развития ИТ знает много примеров, когда отличные, красивые решения были вытеснены громоздкими и уродливыми продуктами. Похожие вещи можно найти и в других сферах человеческой деятельности… Так или иначе, Haiku — очень интересная система, которой не хватает внимания свободных разработчиков. И кто знает, может быть, вы и есть такой разработчик? :) И если моя статья вас заинтересовала — я достиг своей цели.