Бъдещето е тук или кодираме направо в браузъра

Ще разкажа за комичен инцидент, който ми се случи, и как да стана contributor в известен проект.

Неотдавна се занимавах с една идея: зареждане на 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-код се събираха след десетия опит), ще оформя Pull Request. И да, оформил съм го.

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

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

Изненадващо за мен, без да знам езика и без да настройвам нищо, просто в браузъра "написах" напълно работеща и полезна функция.

Обаче моята заявка остана без отговор от 19 март 2019, и вече започнах да я забравям.

Но ето, че вчера тази заявка беше добавена в master.

И така, за какво е моята история. А тя е за това, че с модерните технологии можем да пишем реален код директно в браузъра, без да разгръщаме локално никакви разработки и зависимости.

И трябва да призная, че това е вторият ми pull request в известни (поне в тесните кръгове) инструменти. При предишния път моята молба да поправя показването на някои полета в уеб интерфейса на SyncThing завърши с моя едва еднострочен код в среда, която изобщо не познавам.

Само регистрирани потребители могат да участват в анкетата. Влезте, моля.

Трябва ли да пиша още или не.

  • да

  • не трябва.

Гласували са 294 потребителя. 138 потребителя са се въздържали.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster