Будущее уже здесь или кодим прямо в браузере

Расскажу о курьезной ситуации, случившейся со мной, и о том как стать конрибьютором в известный проект.

Не так давно возился я с одной идеей: загрузка Linux непосредственно из UEFI…
Идея не нова и есть некоторое количество мануалов на эту тему. Один из них можно посмотреть тут

Собственно мои давние попытки решить этот вопрос вылились во вполне оформленное решение. Решение вполне рабочее и я его использую на части своих домашних машин. Чуть более подробно это решение описано тут.

Суть UEFI-Boot в том, что ESP (EFI System Partition) раздел совмещается с каталогом /boot. Т.е. все ядра, и образы начальной загрузки (initrd) размещаются на том самом разделе с которого UEFI может запускать исполняемые файлы и в частности запускать загрузчики системы. Но само ядро Linux уже во многих дистрибутивах собирается с опцией UEFISTUB, которая позволяют само ядро запустить из UEFI.

Есть у этого решения один неприятный момент — ESP раздел отформатирован в FAT32, на которой невозможно создать жесткие ссылки (которые система создает регулярно при обновлении initrd). И ничего особо криминального в этом нет, но видеть предупреждения системы при обновлении компонентов ядра — не очень то приятно…

Есть и другой путь.

Менеджер загрузки UEFI (тот самый куда нужно прописать загрузчик ОС) умеет кроме загрузчиков/ядер Linux загружать еще и драйверы. Так что можно загрузить драйвер той файловой системы, где у вас лежит /boot и прямо оттуда загружать ядро средствами UEFI. Драйвер, само собой, нужно положить в раздел ESP. Примерно этим и занимаются загрузчики типа GRUB. Но изюминка как раз в том что все часто используемые функции GRUB уже есть в UEFI. Точнее в его менеджере загрузки. А если быть еще зануднее, то у менеджера загрузки UEFI есть даже больше возможностей в некоторых вопросах.

Вроде бы красивое решение, но есть одно «НО» (вернее было, но об этом позже). Дело в том, что система драйверов UEFI устроена довольно незатейливо. Там нет такого понятия как монтирование файловой системы или связывание драйвера с конкретным устройством. Там есть системный вызов с условным именем Map (англ.) который берет по очереди каждый драйвер и пытается связать его со всеми, худо-бедно подходящими устройствами. И если драйвер устройство смог подцепить, то создается маппинг — связующая запись. Именно так в общей куче со всеми остальными и должен инициализи́роваться вновь загруженный драйвер. И вот всего-то и нужно — в загрузочной записи драйвера поставить один бит (LOAD_OPTION_FORCE_RECONNECT) в 1 и UEFI после его загрузки сделает этот самый глобальный ремап.

Только вот сделать это не так то просто. Стандартная утилита efibootmgr (средствами которой и производится настройка менеджера разгрузки UEFI) не умеет (точнее не умела) ставить этот бит. Приходилось руками его ставить через довольно сложную и опасную процедуру.

И вот в очередной раз попробовав сделать это руками я не выдержал и оформил issue на GitHub с просьбой к разработчикам добавить эту возможность.

Прошло несколько дней, но на мою просьбу никто не обратил внимание. И я из любопытства глянул на исходники… форкнул, да и прикинул «на коленках» как эту фичу добавить… «На коленках» потому что ничего такого себе не ставил и прямо в браузере исходники редактировал.

C (язык программирования) я знаю очень поверхностно, но примерно решение накидал (преимущественно копи-пастом)… ну а потом подумалось — а хоть у меня там наверняка куча ошибок (прошлые мои попытки править чужой C-код собирались раза с 10-го) оформлю-ка я Pull Request. Ну и оформил.

А там оказался прикручен Travis CI на проверку пулл реквестов. И он мне старательно все мои ошибки выдал. Ну если известны ошибки — что бы и не поправить: опять прямо в браузере, и с четвертой попытки код собрался (достижение для меня).

И вот так, не вылезая из браузера, я оформил вполне реальный Pull Request в утилиту, которой пользуются практически во всех современных дистрибутивах Linux.

Меня самого удивил тот факт что я, толком не зная языка, и ничего у себя не настраивая (там по зависимостям не малая пачка библиотек для сборки нужна) и не разу даже компилятор не запуская, просто в браузере «накодил» вполне рабочую и полезную фичу.

Однако реквест мой висел без реакции с 19 марта 2019, и я уже начал про него забывать.

Но вот вчера этот реквест добавили в master.



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

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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Писать еще или не стоит

  • 60.8%да193
  • 43.8%не стоит139
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 63

    +21

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

      –3
      САРКАЗМ_МОДЕ=ON
      А разве на хабре принято иначе?
        +12

        А вы на редакторов равняетесь?

          +3
          Это моя первая статья и оно само как-то так получилось.
      0
      Будущее наступило давно.
      Точно сказать не могу, но наверное лет пять тому назад я уже мог спокойно оформлять коммиты в браузере.
      Но это не прижилось от слова совсем — нет окружения рабочей среды. Хотя до сих пор мелкие коммиты на скорую руку иногда делаю так же в браузере.
        0
        Именно
        Фикс сделать — возможно, исправить конфликт — весьма удобно, но писать новую функциональность — такое себе
        +1
        Да, хотелось бы побольше про кодинг прямо в браузере.
        Про TraviCI тоже — зачем оно, что оно есть, почём, и самое главное — как его организовать для себя.
          0
          TravisCI конкретно мне не зашел. Мне как-то больше понравился CircleCI.

          Оба этих *CI имеют хорошую интеграцию с GitHub. И в этой связке легко настраиваются на проверку кода на «собираемость» и на прохождение unit-тестов, а также можно настроить загрузку бинариков например на тот же GitHub залить собранные бинарики в ассеты релиза.
          Хотя конечно в плане тестов можно и не ограничиваться unit-тестами, можно практически любой уровень автоматизированного тестирования организовать.

          Собственно именно благодаря автоматической сборке навешенной как обязательная проверка для пуллреквеста и можно кодить в браузере — написали код, закомммитили в свою репу, а а в ваш пулреквест этот коммит автоматом попадет и произойдет повторная проверка сборки. Не прошло — лезите в этот *CI (прямо по ссылке из пуллреквеста) и смотрите какие были ошибки — правите код коммитите по новой.
          +2
          Есть у этого решения один неприятный момент — ESP раздел отформатирован в FAT32, на которой невозможно создать жесткие ссылки (которые система создает регулярно при обновлении initrd). И ничего особо криминального в этом нет, но видеть предупреждения системы при обновлении компонентов ядра — не очень то приятно…
          Это проблема? initrd вообще не нужен, как и ссылки куда-то там. У меня есть два ноута (разных), на обоих ESP и есть /boot и на нём лежит ровно один файл — efistub'нутое ядро. Всё работает.
          • НЛО прилетело и опубликовало эту надпись здесь
              +1
              Gentoo
              В этом всё и дело. Нам, гентушникам, не понять ^_^
            0

            Я вас и больше обрадую. Будущее прям ещё дальше скакнуло — GitHub Actions. И не нужны никакие внешние CI

              0
              GitHub Actions мне показалось пока сыроватым. Но ему от роду то всего-ничего. Уверен что оно действительно потеснит внешние решения. Но вот переносить свое CI решение с одной платформы на другую — нужны серьезные мотивы.
                0

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

                +1
                GitLab CI, если говорить про компанию
                GitHub Actions, если говорить про pet проекты
                  0
                  GitLab CI, если говорить про компанию

                  Про маленькую компанию. Он тормозит жутко, если немного побольше в него запустить.

                  GitHub Actions, если говорить про pet проекты

                  Или богатую компанию.
                    0
                    Self-hosted Gitlab тормозит одинаково при любой нагрузке, эту фичу правда сейчас дорабатывают. В моей маленькой (около сотни разработчиков, 400 реп) компании инсталляция ещё не смогла упереться ни в один из ресурсов.
                      0
                      Может тогда Jenkins? И «готовить» можно на любой вкус.
                    –2

                    В рамках отказа от оитхаба в свете их поглощения мягкими?

                      +1
                      А чем это поглощение плохо?
                        0

                        Все к чему прикасаются мягкие становится ужасным

                          +2
                          А ведь таких примеров — масса
                            –1
                            +
                            Скайп прям один из самых наглядных примеров.
                            Да и вообще мягкие имеют свой путь, как Россия — все их продукты дерьмо, Гейтс точно не русский?
                              0
                              Со скайпом вообще веселуха. У нас на работе его используют в основном для внешних связей (внутри slack). У многих стоит Linux и вот замечено уже многими у нас — Skype-for-Linux работает куда как надежнее чем на винде.

                              Так что все что кажется не так как кажется и я бы не стал все вся обобщать — это не здоровый подход по жизни, ИМХО.
                                –3
                                Просто на Linux все что угодно работает лучше чем на винде))))
                                А на Mac OS еще лучше))
                                +1

                                А правда, что скайп хоть когда-то не был дерьмом? Можно узнать когда конкретно?

                                  +2
                                  Году этак в 2006 он меня прямо поразил поддержкой множественных подключений с разных устройств и синхронизацией истории в них. По сравнению с аськой это был просто технологический прорыв, и вот примерно в то время его десктопные клиенты ещё не были дерьмом и не тормозили.
                                    0

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

                                0

                                Результаты работы MSR и их прикасания к хаскелю мне вполне нравятся.

                                  +2
                                  C# и TypeScript — хороши. GitHub после поглощения стал пока что только лучше. VS Code, не глядя на то, что работает на Electron, работает шустро. Ну и также не стоит забывать, что они также «прикасаются» и к куче других значимых вещей, принимают активное участие в разработке C++, например. Да и к Linux они прикасались, и не раз. Так что не надо =)

                                  Skype да, не лучший пример. Для текстового IM перешёл в Telegram, Skype остался только для видеозвонков. Мобильный клиент у Skype слишком тяжёлый и тормозной для постоянного использования. Да и новый десктопный клиент тоже теперь задумчивый.
                                    0
                                    Те инженеры майкрософт, с которыми работал и просто пересекался по некоторым темам, создали впечатление не очень высокого профессионализма.
                                    Это я так мягко и политкорректно. Наверняка там есть много грамотных людей, но мне они еще не попадались.
                                      0

                                      Отсюда и "особый путь" у мягких

                                0
                                Github Actions неплох, но, увы,
                                «We're working on caching packages and artifacts between workflow executions, we'll have it by mid-November.»
                                +1
                                Да, заголовок так себе. Надо было прямо там писать про EFI.

                                И статье не помешали бы подзаголовки, а то легко потеряться, если нужно вернуться назад перечитать абзац.
                                  0
                                  Благодарю за критику, учту на будущее.
                                  0
                                  Я, когда название увидел, думал, что будет что-то вроде этого: https://technix.github.io/instead-playground/
                                    0

                                    Пишите! Интересная статья, ещё бы подробнее о работе прямо в браузере :-)

                                      0

                                      IDE как онлайн сервис, за абонентку, такое будущее нас ждёт…
                                      Мне вот тоже надоело софт устанавливать и настраивать на разных рабочих местах, поэтому установил на одном компе и подключаюсь туда удаленно программы писать. Даже со смартфона, но с него неудобно — экран маленький, жду когда очки VR подешевеют

                                        +1

                                        Eclipse Che
                                        mbed.com
                                        и наверное ещё 100500 online IDE уже здесь.

                                        0
                                        Внезапно вспомнилось.
                                        Вы видели как конфиг граба строится?
                                        Вы редактируете специальный файл, который управляет шаблонизатором и строит монструозный boot.cfg.
                                        Lilo — один файл, и больше ничего.

                                        habr.com/en/company/oleg-bunin/blog/458922
                                          +1
                                          Ни Grub ни Lilo с UEFI в принципе не нужны. Возможностей диспетчера загрузки UEFI вполне достаточно для загрузки ОС без посредников.

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

                                          Так что выкидывать загрузчики на свалку еще рановато.
                                            0
                                            Я тоже баловался загрузкой ядра через UEFI. Но потом забил на это дело, потому что Grub позволяет держать на разделе несколько ядер (как минимум новое и старое, которое точно работает). На у экономия 3 секунд на загрузку Grub… Так ли часто вы компьютер перезагружаете?
                                              0
                                              Ну у меня довольно старенький ноут — на нем немного больше 3 секунд экономии. Точных замеров не делал, но прирост скорости загрузки — ощутимый.

                                              По поводу нескольких ядер — так и UEFI может загружать столько вариантов сколько вам надо. Конкретно в UEFI-Boot реализовано именно так: в пункты меню загрузчика UEFI добавляются записи для всех ядер, которые утилита находит в /boot. Более того за счет задания переменной UEFI BootOrder загрузка делается поэтапно — если со самым свежим ядром не загрузится то UEFI будет пытаться загружаться с предыдущим.
                                                0
                                                > Конкретно в UEFI-Boot реализовано именно так: в пункты меню загрузчика UEFI добавляются записи для всех ядер, которые утилита находит в /boot.

                                                К сожалению, мой ноут находит только загрузчик со стандартным именем. Хотя, может быть я не знаю, как правильно называть ядра. По крайней мере, если батарейку отключить, что найдётся только
                                                EFI/BOOT/BOOTX64.EFI.
                                                  0
                                                  Это сильно зависит от реализации UEFI для каждой конкретной модели и вендора. К сожалению старые UEFI прошивки были очень глючные.

                                                  EFI/BOOT/BOOTX64.EFI — это место расположения загрузчика, которое используется если не задано других опций загрузки в менеджере загрузки UEFI. И вам хотя бы в том повезло что отключение батарейки приводит к ожидаемым результатам.

                                                  Но вот если без эксцессов, то прописанные опции загрузки BOOTxxxx сначала перебираются в порядке заданном в BootOrder. А вот если их нет или по ним загрузка не удалась, то запускается режим recovery в котором первым делом производится попытка загрузиться из EFI/BOOT/BOOTX64.EFI.

                                                  А как прописывать разные ядра — можете посмотреть на гитхабе (смотрите ссылки в начале статьи).
                                                    0
                                                    Я об этом и говорю, чем плясать с бубном и надеяться, что твои записи не будут уничтожены случайным сбросом настроек, проще положить в EFI/BOOT/BOOTX64.EFI grub и пусть он уже рулит загрузкой. Кстати, нормально загрузить Windows 8.1 из Grub не получается. Иногда просто чего-то не находится, иногда грузится. Я не нашёл логики. Спасает, что можно Windows на отдельном винте держать и уже через меню загрузки BIOS грузить нужную систему.
                                          0
                                          Наверное, следующий шаг, это когда Travis запускает тесты прямо в браузере, чтоб не ждать 5 минут, пока он соберется на виртуалке, и быстрее разрабатывать?
                                            0
                                            CircleCI когда с виртуалок на докер образы перешли начали все проверять очень даже быстро — ни каких 5-и минутах речи нет — от силы 1, а иногда и быстрее.

                                            TravisCI (когда я его пробовал) потому и не зашел, что тормозной до жути с этими своими виртуалками.
                                            +2
                                            Один я немного фоигел от того, что в мастер важной части ОС приняли наколенную поделку, автор которой не то что не особо разбирается в языке, но еще и пропихнул код чисто через CI, который многого просто не может проверить?
                                              +2
                                              Ну наверно я не правильно сформулировал. На С у меня просто опыта мало и был он давно. Поэтом синтаксис его меня немного напрягает. И это выливается в то что после моих изменений С-код надо несколько раз прогонять через компилятор пока я там все нужные «знаки препинания» не расставлю.

                                              А так то Code Review никто не отменял — я с таким посылом PR и создавал что бы мой код проверили и поправили если надо. Примерно так авторы и поступили.

                                              Ну а вообще то это нормальная практика в Open Source принимать PR-ы от «энтузиастов».
                                                –1
                                                Нет, не один. Я только надеюсь что они релизят не из мастера все-таки, а делают еще какие-нибудь тесты там. Иначе это вообще жесть какая-то.
                                                При всем уважению к автору, его желанию помочь людям и вложить свою лепту в опенсурс.
                                                Но нельзя просто запихнуть функционал не делая никаких тестов. CI там проверяет какие-то совершенно поверхностные вещи и если вы не делали специальный тест на свой функционал (а вы не делали), то он даже вашу функцию просто пропустит. Да и скорее всего там юнит тесты какие-то, ничего серьезного не тестируется.
                                                Честно говоря мне страшно за будущее efibootmgr с такой политикой мерджей.
                                                  +2
                                                  Не совсем так.

                                                  Как работает эта фича я руками проверил на нескольких прошивках UEFI.

                                                  Спеки UEFI я изучал достаточно детально. И добавленный код полностью соответствует спецификации UEFI.

                                                  Сбоку из мастера я таки сделал и проверил — то что я делал руками и то что работало — работает будучи сделанным и утилитой. Речь то про один бит в структуре загрузочной записи менеджера загрузки UEFI.

                                                  Да и код мой авторы проверили и подправили местами.
                                                    –1
                                                    Сбоку из мастера я таки сделал и проверил — то что я делал руками и то что работало — работает будучи сделанным и утилитой
                                                    OK, из статьи это не было очевидно. Но вы уверены что проверили весь функционал, который был затронут?
                                                    Речь то про один бит в структуре загрузочной записи менеджера загрузки UEFI.
                                                    Я видел как один character в пулл реквесте ломал кучу продуктов и огорчил много людей. Нет такого "я всего лишь ...", любое нетестированное изменение может испортить продукт и работу большому количеству пользователей. Потом конечно кинутся править, но это все время, ресурсы, убытки.
                                                      +2
                                                      Да, я подергал все места, которых касались мои «шаловливые ручки»: man страницы, парсинг входных параметров, проверка совместимости входных параметров, задание значения (не активно) по умолчанию и собственно обработку изменения LOAD_OPTION_FORCE_RECONNECT, которая управляется двумя новыми опциями -f и -F.

                                                      Так что (на сколько я могу судить), ничего сломать мне не удалось.

                                                      Да и опыт добавления своего функционала в чужой код у меня есть. Конкретно в этом PR вместо того что бы пытаться совместить обработку двух опций (LOAD_OPTION_ACTIVE и LOAD_OPTION_FORCE_RECONNECT) в одой функции я таки сделал копию функции от LOAD_OPTION_ACTIVE и переправил ее на LOAD_OPTION_FORCE_RECONNECT — это тоже не самый лучший паттерн, но в плане добавления функционала такой копи-паст страхует от ненужного вмешательства в работающий код. Позже, если кто-то захочет это место привести к одной общей функции — ну вельком.
                                                –1
                                                — Del
                                                  0
                                                  Огорчает содержание всех яиц в одной корзине. Например то, что GitLab начинает разрабатывать и продвигать свою Web IDE. В результате получается такой огромный монстр: и система контроля версий, и доска задач, и Web IDE и CI и т.д. Атомарная замена любого из данных сервисов только дублированием функциональности в стороннем приложении, а не заменой и миграцией с одного сервиса на другой. EEE какой-то, давящий конкурентов на корню.

                                                  IE6 version X/Y/Z.
                                                    +1

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


                                                    P.S.
                                                    image


                                                    Здесь замешана темная магия или Владимир Владимирович?

                                                      +1
                                                      Я это заскриншотил себе на память.

                                                      Не 146% конечно, но все же…
                                                        0
                                                        Уже 51.6%
                                                          0

                                                          Так это процент от всех проголосовавших а выбрать можно оба ответа одновременно (там checkbox). Вот и получилось больше 100%.

                                                          0
                                                          C (язык программирования)
                                                          Можно проще — «Си».
                                                            0

                                                            С системой единиц можно перепутать.

                                                              0
                                                              На этом сайте не перепутать.

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

                                                          Самое читаемое