Gelecek zaten burada veya doğrudan tarayıcıda kodlayın

Sizlere başıma gelen komik bir durumdan ve ünlü bir projeye nasıl katkıda bulunacağınızdan bahsedeceğim.

Kısa bir süre önce bir fikir üzerinde çalışıyordum: Linux'u doğrudan UEFI'den başlatmak...
Bu fikir yeni değil ve bu konuyla ilgili çok sayıda kılavuz var. Onlardan birini görebilirsin burada

Aslına bakılırsa, bu sorunu çözmek için uzun süredir devam eden girişimlerim tamamen resmileştirilmiş bir çözümle sonuçlandı. karar. Çözüm oldukça işe yarıyor ve bunu bazı ev makinelerimde kullanıyorum. Bu çözüm biraz daha ayrıntılı olarak açıklanmaktadır. burada.

UEFI-Boot'un özü, ESP (EFI Sistem Bölümü) bölümünün /boot dizini ile birleştirilmesidir. Onlar. tüm çekirdekler ve önyükleme görüntüleri (initrd), UEFI'nin yürütülebilir dosyaları başlatabileceği ve özellikle sistem önyükleme yükleyicilerini başlatabileceği aynı bölümde bulunur. Ancak birçok dağıtımda Linux çekirdeğinin kendisi, çekirdeğin UEFI'den başlatılmasına olanak tanıyan UEFISTUB seçeneğiyle zaten bir araya getirilmiştir.

Bu çözümün hoş olmayan bir anı var - ESP bölümü, üzerinde sabit bağlantılar oluşturmanın imkansız olduğu (sistemin initrd'yi güncellerken düzenli olarak oluşturduğu) FAT32'de biçimlendirilmiştir. Ve bunda özellikle suç teşkil eden bir şey yok, ancak çekirdek bileşenlerini güncellerken sistem uyarılarını görmek pek hoş değil...

Başka bir yol daha var.

UEFI önyükleme yöneticisi (işletim sistemi önyükleyicisini kaydetmeniz gerekenle aynı), önyükleyicilere/Linux çekirdeklerine ek olarak sürücüleri de yükleyebilir. Böylece, /boot'a sahip olduğunuz dosya sisteminin sürücüsünü yükleyebilir ve UEFI'yi kullanarak çekirdeği doğrudan oradan yükleyebilirsiniz. Elbette sürücünün ESP bölümüne yerleştirilmesi gerekiyor. GRUB gibi önyükleyicilerin yaptığı kabaca budur. Ancak öne çıkan nokta, sık kullanılan tüm GRUB işlevlerinin zaten UEFI'de olmasıdır. Daha doğrusu indirme yöneticisinde. Ve daha da sıkıcı olmak gerekirse, UEFI önyükleme yöneticisinin bazı konularda daha da fazla yeteneği var.

Güzel bir çözüm gibi görünüyor, ancak bir "AMA" var (ya da daha doğrusu öyleydi, ancak daha sonra buna daha fazla değineceğiz). Gerçek şu ki, UEFI sürücü sistemi oldukça basittir. Bir dosya sistemi kurmak veya bir sürücüyü belirli bir cihazla ilişkilendirmek gibi bir şey yoktur. Her sürücüyü sırayla ele alan ve onu en azından uygun cihazlarla ilişkilendirmeye çalışan, geleneksel adı Harita olan bir sistem çağrısı vardır. Ve eğer sürücü cihazı alabilseydi, o zaman bir eşleme oluşturulur - bir bağlantı kaydı. Yeni yüklenen sürücünün diğerleriyle ortak bir yığında tam olarak bu şekilde başlatılması gerekir. İhtiyacınız olan tek şey, sürücü önyükleme kaydında bir biti (LOAD_OPTION_FORCE_RECONNECT) 1'e ayarlamaktır; UEFI, onu yükledikten sonra bu genel yeniden eşlemeyi yapacaktır.

Ancak bunu yapmak o kadar kolay değil. Standart efibootmgr yardımcı programı (UEFI boşaltma yöneticisini yapılandırmak için kullanılır) bu bitin nasıl ayarlanacağını bilmiyor (veya daha doğrusu nasıl ayarlanacağını bilmiyordu). Oldukça karmaşık ve tehlikeli bir prosedürle manuel olarak kurmak zorunda kaldım.

Ve bir kez daha ellerimle yapmayı denediğimde dayanamadım ve resmileştirdim. GitHub'ta sorun geliştiricilerden bu özelliği eklemelerini istiyoruz.

Birkaç gün geçmesine rağmen kimse isteğimi dikkate almadı. Ve meraktan kaynak koduna baktım... Çatalladım ve bu özelliği nasıl ekleyeceğimi dizlerimin üzerinde buldum... "Dizlerimin üstünde" çünkü öyle bir şey yüklemedim ve kaynağı düzenledim doğrudan tarayıcıya kodlayın.

C'yi (programlama dili) çok yüzeysel olarak biliyorum, ancak yaklaşık bir çözüm taslağı hazırladım (çoğunlukla kopyala-yapıştır)... ve sonra düşündüm - en azından muhtemelen orada birçok hatam var (geçmişte başka birininkini düzenlemeye yönelik girişimlerim var) C kodu yaklaşık 10. kez tamamlandı) Çekme İsteği yayınlayacağım. Kuyu tasarlanmış.

Ve orada Travis CI'nin çekme isteklerini kontrol etmek için eklendiği ortaya çıktı. Ve bana tüm hatalarımı özenle anlattı. Bilinen hatalar varsa düzeltmeye gerek yok: yine doğrudan tarayıcıda ve dördüncü denemede kod çalıştı (benim için bir başarı).

Ve böylece, tarayıcıdan çıkmadan, neredeyse tüm modern Linux dağıtımlarında kullanılan bir yardımcı programa çok gerçek bir Çekme İsteği biçimlendirdim.

Dili gerçekten bilmeden, herhangi bir şey ayarlamadan (bağımlılıklar derleme için epeyce kitaplık gerektirir) ve derleyiciyi bile çalıştırmadan, tamamen çalışan ve kullanışlı bir özelliği basitçe "kodladığım" gerçeğine şaşırdım. tarayıcı .

Ancak 19 Mart 2019 tarihinden itibaren talebim yanıtsız kaldı ve ben bunu çoktan unutmaya başlamıştım.

Ancak dün bu istek ustaya eklendi.

Peki benim hikayem neyle ilgili? Ve modern teknolojiler çerçevesinde, herhangi bir geliştirme aracı ve bağımlılığı yerel olarak dağıtmadan, gerçek kodun zaten tarayıcıda yazılabildiğinin ortaya çıktığı gerçeğinden bahsediyor.

Dahası, itiraf etmeliyim ki, bu zaten iyi bilinen (en azından dar çevrelerde) yardımcı programlar için ikinci çekme talebim. Geçen sefer SyncThing web arayüzündeki bazı alanların görüntülenmesini düzeltme isteğim, hiç bilmediğim bir ortamda tam anlamıyla tek satırlık düzenleme yapmamla sonuçlandı.

Ankete sadece kayıtlı kullanıcılar katılabilir. Giriş yapLütfen.

Daha fazla yazmalı mıyım yoksa yazmamalı mıyım?

  • evet

  • değmez

294 kullanıcı oy kullandı. 138 kişi çekimser kaldı.

Kaynak: habr.com

Yorum ekle