Ще разкажа за комичен инцидент, който ми се случи, и как да стана 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) не умее (по-точно, не умееше) да поставя този бит. Приходеше се да се поставя ръчно чрез доста сложна и опасна процедура.
И отново, опитвайки се да го направя ръчно, не издържах и оформлението на с молба към разработчиците да добавят тази възможност.
Изминаха няколко дни, но никой не обърна внимание на молбата ми. И от любопитство погледнах източниците… форкнах и замислих "на коленете" как да добавя тази функция… "На коленете", защото не инсталирах нищо специално и направо в браузъра редактирах източниците.
C (програмен език) познавам много повърхностно, но накидах приблизително решение (преобладаващо копи-пейст)… и след това се замислих — а макар че вероятно имам куп грешки (прошлите ми опити за правене на чужд C-код се събираха след десетия опит), ще оформя Pull Request. И да, .
А там имаше включен Travis CI за проверка на пулл реквестите. И той ми изкара всички мои грешки. Е, ако известни са грешките — защо да не ги поправя: отново направо в браузъра и с четвъртото опит кодът се събра (постижение за мен).
И така, без да излизам от браузъра, оформлих напълно реален Pull Request в утилитата, която се използва практически във всички съвременни дистрибуции на Linux.
Изненадващо за мен, без да знам езика и без да настройвам нищо, просто в браузъра "написах" напълно работеща и полезна функция.
Обаче моята заявка остана без отговор от 19 март 2019, и вече започнах да я забравям.
Но ето, че вчера тази заявка беше добавена в master.
И така, за какво е моята история. А тя е за това, че с модерните технологии можем да пишем реален код директно в браузъра, без да разгръщаме локално никакви разработки и зависимости.
И трябва да призная, че това е вторият ми pull request в известни (поне в тесните кръгове) инструменти. При предишния път моята молба да поправя показването на някои полета в уеб интерфейса на SyncThing завърши с моя едва еднострочен код в среда, която изобщо не познавам.
Само регистрирани потребители могат да участват в анкетата. , моля.
Трябва ли да пиша още или не.
да
не трябва.
Гласували са 294 потребителя. 138 потребителя са се въздържали.
Източник: habr.com
