Die Zukunft ist schon da oder programmieren Sie direkt im Browser

Ich erzähle Ihnen von einer lustigen Situation, die mir passiert ist, und wie Sie Mitwirkender an einem berühmten Projekt werden.

Vor nicht allzu langer Zeit hatte ich eine Idee: Linux direkt über UEFI zu booten ...
Die Idee ist nicht neu und es gibt eine Reihe von Handbüchern zu diesem Thema. Sie können einen davon sehen hier

Tatsächlich führten meine langjährigen Versuche, dieses Problem zu lösen, zu einer völlig formalen Lösung Entscheidung. Die Lösung funktioniert recht gut und ich verwende sie auf einigen meiner Heimcomputer. Diese Lösung wird etwas detaillierter beschrieben. hier.

Der Kern von UEFI-Boot besteht darin, dass die ESP-Partition (EFI System Partition) mit dem /boot-Verzeichnis kombiniert wird. Diese. Alle Kernel und Bootstrap-Images (initrd) befinden sich auf derselben Partition, von der aus UEFI ausführbare Dateien und insbesondere System-Bootloader starten kann. Aber der Linux-Kernel selbst ist in vielen Distributionen bereits mit der UEFISTUB-Option assembliert, die es ermöglicht, den Kernel selbst über UEFI zu starten.

Diese Lösung hat einen unangenehmen Moment: Die ESP-Partition ist in FAT32 formatiert, auf der keine festen Links erstellt werden können (die das System regelmäßig erstellt, wenn die initrd aktualisiert wird). Und daran ist nichts besonders Kriminelles, aber Systemwarnungen beim Aktualisieren von Kernel-Komponenten zu sehen, ist nicht sehr angenehm ...

Es geht auch anders.

Der UEFI-Bootmanager (derselbe, bei dem Sie den Betriebssystem-Bootloader registrieren müssen) kann neben Bootloadern/Linux-Kerneln auch Treiber laden. Sie können also den Treiber für das Dateisystem laden, in dem Sie /boot haben, und den Kernel direkt von dort über UEFI laden. Der Treiber muss natürlich in der ESP-Partition platziert werden. Dies ist ungefähr das, was Bootloader wie GRUB tun. Der Clou ist jedoch, dass alle häufig verwendeten GRUB-Funktionen bereits in UEFI enthalten sind. Genauer gesagt in seinem Download-Manager. Und um es noch langweiliger zu machen: Der UEFI-Bootmanager bietet in manchen Belangen noch mehr Möglichkeiten.

Es scheint eine schöne Lösung zu sein, aber es gibt ein „ABER“ (oder besser gesagt, das war es, aber dazu später mehr). Tatsache ist, dass das UEFI-Treibersystem recht einfach ist. Es gibt kein Mounten eines Dateisystems oder das Zuordnen eines Treibers zu einem bestimmten Gerät. Es gibt einen Systemaufruf mit dem herkömmlichen Namen Map, der nacheinander jeden Treiber aufnimmt und versucht, ihn allen, zumindest geeigneten Geräten zuzuordnen. Und wenn der Fahrer das Gerät abholen konnte, wird eine Zuordnung erstellt – ein Verbindungsdatensatz. Genau so sollte der neu geladene Treiber in einem gemeinsamen Heap mit allen anderen initialisiert werden. Und alles, was Sie brauchen, ist, ein Bit (LOAD_OPTION_FORCE_RECONNECT) im Treiber-Boot-Datensatz auf 1 zu setzen, und UEFI führt diese globale Neuzuordnung nach dem Laden durch.

Aber das ist nicht so einfach. Das Standarddienstprogramm efibootmgr (das zum Konfigurieren des UEFI-Offload-Managers verwendet wird) weiß nicht, wie dieses Bit gesetzt werden soll (oder wusste nicht, wie). Ich musste es manuell installieren, was eine ziemlich komplizierte und gefährliche Prozedur war.

Und wieder einmal, nachdem ich versucht hatte, es mit meinen Händen zu tun, konnte ich es nicht ertragen und formalisierte es Problem auf GitHub Ich bitte die Entwickler, diese Funktion hinzuzufügen.

Mehrere Tage vergingen, aber niemand achtete auf meine Bitte. Und aus Neugier habe ich mir den Quellcode angeschaut ... Ich habe ihn geforkt und auf den Knien herausgefunden, wie ich diese Funktion hinzufügen kann ... „Auf den Knien“, weil ich so etwas nicht installiert und die Quelle bearbeitet habe Code direkt im Browser.

Ich kenne C (die Programmiersprache) sehr oberflächlich, aber ich habe eine ungefähre Lösung skizziert (hauptsächlich Kopieren und Einfügen) ... und dann dachte ich – zumindest habe ich dort wahrscheinlich viele Fehler (meine früheren Versuche, die von jemand anderem zu bearbeiten). (C-Code wurde ungefähr zum 10. Mal fertiggestellt.) Ich werde eine Pull-Anfrage ausstellen. Na und entworfen.

Und dort stellte sich heraus, dass Travis CI angeschlossen war, um Pull-Anfragen zu überprüfen. Und er hat mir gewissenhaft alle meine Fehler erzählt. Nun, wenn es bekannte Fehler gibt, besteht keine Notwendigkeit, sie zu beheben: Wieder direkt im Browser und beim vierten Versuch funktionierte der Code (ein Erfolg für mich).

Und einfach so, ohne den Browser zu verlassen, formatierte ich einen sehr realen Pull Request in ein Dienstprogramm, das in fast allen modernen Linux-Distributionen verwendet wird.

Ich war überrascht von der Tatsache, dass ich, ohne die Sprache wirklich zu kennen, ohne etwas einzurichten (Abhängigkeiten erfordern eine ganze Reihe von Bibliotheken für die Assemblierung) und ohne jemals den Compiler ausgeführt zu haben, einfach eine völlig funktionierende und nützliche Funktion in der „codiert“ habe Browser.

Allerdings wurde meine Anfrage seit dem 19. März 2019 nicht mehr beantwortet und ich hatte bereits begonnen, sie zu vergessen.

Aber gestern wurde diese Anfrage zum Master hinzugefügt.

Worum geht es also in meiner Geschichte? Und er spricht davon, dass sich im Rahmen moderner Technologien herausgestellt hat, dass echter Code bereits im Browser geschrieben werden kann, ohne dass Entwicklungstools und Abhängigkeiten lokal bereitgestellt werden müssen.

Außerdem muss ich zugeben, dass dies bereits mein zweiter Pull-Request für (zumindest in engen Kreisen) bekannte Versorgungsunternehmen ist. Beim letzten Mal führte meine Bitte, die Anzeige einiger Felder in der SyncThing-Weboberfläche zu korrigieren, zu meiner buchstäblich einzeiligen Bearbeitung in einer Umgebung, die ich überhaupt nicht kenne.

An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.

Soll ich mehr schreiben oder nicht?

  • ja

  • lohnt sich nicht

294 Benutzer haben abgestimmt. 138 Benutzer enthielten sich der Stimme.

Source: habr.com

Kommentar hinzufügen