Povím vám o kuriózní situaci, která se mi stala, a o tom, jak se stát přispěvatelem do známého projektu.
Nedávno jsem pracoval na jednom nápadu: spouštění Linuxu přímo z UEFI…
Nápad není nový a existuje několik návodů na toto téma. Jeden z nich si můžete prohlédnout
Moje dlouholeté pokusy vyřešit tuto otázku se vyvinuly v poměrně podrobný . Řešení je plně funkční a používám ho na některých svých domácích strojích. O něco podrobněji je toto řešení popsáno .
Podstata UEFI-Boot spočívá v tom, že ESP (EFI System Partition) je sloučen s adresářem /boot. Tedy, všechny jádra a obrazy počátečního zavádění (initrd) jsou umístěny na tomtéž oddílu, ze kterého může UEFI spouštět spustitelné soubory a konkrétně spouštět zaváděče systému. Ale samotné jádro Linuxu se již v mnoha distribucích sestavuje s možností UEFISTUB, která umožňuje jádru spustit se z UEFI.
Toto řešení má jeden nepříjemný moment — oddíl ESP je formátován ve FAT32, na kterém nelze vytvářet tvrdé odkazy (které systém pravidelně vytváří při aktualizaci initrd). A na tom není nic zvlášť kriminálního, ale vidět varování systému při aktualizaci komponent jádra — není moc příjemné…
Existuje i jiná cesta.
Správce zavádění UEFI (to je ten, do kterého je třeba zapsat zaváděč OS) umí kromě zaváděčů/jader Linuxu také načítat ovladače. Takže můžete načíst ovladač té souborové soustavy, kde máte /boot, a přímo odtud načítat jádro pomocí UEFI. Ovladač je samozřejmě nutné umístit do oddílu ESP. Přesně tím se zabývají zaváděče typu GRUB. Ale specialitou je, že všechny často používané funkce GRUB již existují v UEFI. Přesněji řečeno v jeho správcovském rozhraní. A pokud bychom chtěli být ještě školometský, správa zavádění UEFI má v některých ohledech dokonce více možností.
Zdálo by se, že je to pěkné řešení, ale je tu jedno „ALE“ (lépe řečeno, bylo, ale o tom později). Jde o to, že systém ovladačů UEFI je poměrně jednoduchý. Neexistuje zde koncept, jako je připojení souborového systému nebo přiřazení ovladače k určitému zařízení. Existuje systémový volání s podmíněným názvem Map, které vezme postupně každý ovladač a pokusí se jej spojit se všemi vhodnými zařízeními. A pokud se ovladači podaří se zařízení připojit, vytvoří se mapování — spojovací záznam. Právě tak by měl být znovu načtený ovladač inicializován mezi ostatními. A je potřeba udělat jen to — v záznamu ovladače nastavit jeden bit (LOAD_OPTION_FORCE_RECONNECT) na 1 a UEFI po jeho načtení provede toto globální pře-mapování.
Jenže udělat to není tak jednoduché. Standardní nástroj efibootmgr (který se používá pro konfiguraci UEFI boot manageru) to neumí (přesněji to neuměl) tento bit nastavit. Bylo potřeba to dodělat ručně prostřednictvím docela složité a riskantní procedury.
A tak při dalším pokusu udělat to ručně jsem to nevydržel a vytvořil jsem s žádostí k vývojářům, aby tuto možnost přidali.
Uplynulo pár dní, ale nikdo si mé žádosti nevšiml. A ze zvědavosti jsem se podíval na zdrojové kódy… fork jsem a pak jsem si vymyslel, jak tuto funkci přidat… „Na koleně“, protože jsem si nic takového nenainstaloval a přímo v prohlížeči jsem editoval zdrojové kódy.
C (programovací jazyk) znám velmi povrchně, ale přibližné řešení jsem nakreslil (převážně kopírováním a vkládáním)… no a potom jsem si pomyslel — ať už tam mám jistě spoustu chyb (moje předchozí pokusy upravit cizí C-kód se skládaly asi z 10 pokusů), tak jsem vytvořil Pull Request. A nakonec jsem .
A tam se ukázalo, že je připojen Travis CI na kontrolu pull requestů. A ten mi pečlivě vypsal všechny moje chyby. No, když jsou chyby známé — proč je neopravit: opět přímo v prohlížeči, a na čtvrtý pokus se kód sestavil (úspěch pro mě).
A takto, aniž bych opustil prohlížeč, jsem vytvořil zcela reálný Pull Request do nástroje, který používá prakticky ve všech moderních distribucích Linuxu.
I was surprised that I, not really knowing the language, without configuring anything on my own (there's quite a hefty stack of libraries needed for assembly), and without even running the compiler once, simply 'coded' a completely functional and useful feature in the browser.
However, my request remained unanswered since March 19, 2019, and I had already started to forget about it.
But just yesterday, this request was added to master.
So what is my story about? It's about how, with modern technologies, it has turned out that real code can already be written in the browser without setting up any local developer tools and dependencies.
Moreover, I must admit, this is already my second pull request to well-known (at least in narrow circles) utilities. Last time, my request to fix the display of some fields in the web interface of SyncThing resulted in a literally one-line fix in an environment I didn't know at all.
Pouze registrovaní uživatelé se mohou účastnit ankety. , prosím.
Should I write more or not?
ano
No.
294 users voted. 138 users abstained.
Zdroj: habr.com
