Vielleicht haben sich viele Benutzer von GNU/Linux angesichts der jüngsten Initiativen der Behörden zur Schaffung eines „sovereign“ Internets Gedanken darüber gemacht, wie sie sich im Falle einer Nichtverfügbarkeit der Repositorys beliebter GNU/Linux-Distributionen absichern können.
Wer die Repositorys von CentOS, Ubuntu, Debian herunterlädt, wer eigene Distributionen auf Basis vorhandener Distributionen erstellt, oder wer sich mit den Büchern LFS (Linux From Scratch) und BLFS (Beyond Linux From Scratch) bewaffnet, hat bereits mit der Kompilierung seiner Distributionen aus dem Quellcode begonnen, da er glaubt, dass im Rahmen des „sovereigen“ Internets definitiv Hackerangriffe, Virus-Epidemien, Datenlecks stattfinden werden und Binärdateien nach einiger Zeit einfach veraltet sein werden.
Kürzlich hatte ich die Gelegenheit, eine virtuelle Maschine vollständig aus dem Quellcode basierend auf den in dem Buch Linux From Scratch Systemd Edition v.8.3 enthaltenen Anweisungen zu kompilieren. Ich möchte die Ergebnisse mit Ihnen teilen.
Der Prozess des Aufbaus von Linux
Der Prozess des Aufbaus von Linux aus dem Quellcode kann in drei Phasen unterteilt werden:
- Auf Basis des vorhandenen Betriebssystems wird eine LFS-Bauumgebung erstellt.
- In der Bauumgebung wird ein Abbild der LFS-virtuellen Maschine erstellt.
- In der virtuellen Maschine werden zusätzliche Pakete aus dem Buch BLFS installiert, die im Buch LFS nicht enthalten sind.
Statische Skriptdateien
Bei der Arbeit mit der Build-Umgebung ist es praktisch, die Zwischenablage und SSH zu nutzen: Man kopiert die Befehle aus dem Buch und fügt sie in die Konsole der Build-Umgebung ein.
Nach dem Start der erstellten virtuellen Maschine traten ernsthafte Probleme auf. Im Gegensatz zum Terminalfenster ist es im Clientfenster der virtuellen Maschine nicht möglich, Code einzufügen. Das Eingeben von Befehlen über die Tastatur ist unpraktisch und birgt eine große Gefahr von Tippfehlern. Die Gefahr von Tippfehlern besteht darin, dass sie sich nicht sofort bemerkbar machen, sondern erst nach einiger Zeit auftreten und zu ernsthaften Problemen führen können.
Es ist bekannt, dass Befehle nicht nur über die Tastatur, sondern auch über den Standardstrom (STDIN) eingegeben werden können. Als Quelle für den Standardstrom kann man die serielle Schnittstelle sowie die Ausgabe eines Programm-Skriptes, den sogenannten Standardausdruck (STDOUT), nutzen.
Viele wissen, dass der Befehl wget den Inhalt der heruntergeladenen Datei in den Standardausdruck (STDOUT) ausgeben kann:
wget http://example.com -O -Wenn der Ausgabe von wget an einen Interpreter weitergeleitet wird, kann beliebiger Code ausgeführt werden. Der Code wird genauso ausgeführt, als wäre er auf der Tastatur eingegeben oder aus der Zwischenablage kopiert worden:
wget http://umvirt.com/linux/helloworld.sh -O - | bashSo können auf einem Webserver Dateien mit Befehlen bereitgestellt und deren Inhalte an den Interpreter gesendet werden.
Dynamische Skriptdateien
Statische Dateien sind natürlich gut, wenn man genau weiß, was ausgeführt werden soll, aber wenn es um die Installation von Paketen geht und unklar ist, ob die Abhängigkeiten installiert sind, was dann?
Hier kommt die dynamische Website ins Spiel, die auf einem LAMP-Webserver basiert (Linux-Apache-MySQL-PHP). Wenn die Website in der Lage ist, Seiten (HTML-Dateien) und Bilder dynamisch zu generieren, sollte sie auch mit normalen Textdateien problemlos zurechtkommen.
So kam es auch. Ich schrieb die Website , die Skripte für den Bash-Interpreter generiert. In der Datenbank der Website befinden sich Informationen zu Paketen, Abhängigkeiten, Patches, Erweiterungen und Build-Befehlen.
Jetzt kann zum Installieren des Pakets mc (midnight commander) der Befehl eingegeben werden:
wget --no-check-certificate https://umvirt.com/linux/packages/0.1/mc/install -O - | bashDas Website-Skript wird die Daten aus der Datenbank abrufen und den Code zur Überprüfung der Abhängigkeiten sowie den Installationsskript-Code erstellen. Der Interpreter wird die Anweisungen aus dem Skript verarbeiten.
Damit dies möglich ist, wird auf der Festplatte der virtuellen Maschine informationen über die installierten Pakete in einer Datenbank gespeichert.
Die Datenbank der installierten Pakete befindet sich im Verzeichnis /var/cache/ulfs-packages was eine Liste leerer Dateien mit Namen darstellt, die den Paketnamen entsprechen.
Wenn das Paket nicht in der Datenbank gefunden wird, erfolgt die rekursive Installation der Abhängigkeiten.
Komfort
Um die Installation von Paketen bequemer zu gestalten, habe ich das Skript chimp, eine weitere Website, geschrieben , das die Datenbank verwendet. UmVirt LFS PackagesDie Hauptaufgabe UmVirt LFS Assistant besteht darin, weitere Befehle auszuführen.
Mit chimp wird die Installation von Paketen noch einfacher:
chimp install mcDemonstration
Um sich mit der Funktionsweise der Dienste vertraut zu machen, UmVirt LFS Packages und UmVirt LFS Assistant kann man das Basis-Image herunterladen . Um Xorg mit einem einzigen Befehl zu installieren:
chimp install XIm Laufe des Skriptablaufs wird 141 Pakete automatisch installiert. Um Zeit bei der Kompilierung zu sparen, kann der Wert der Variablen MAKEFLAGS in der Datei /etc/profile von „-j1“ (ein Thread) zum Beispiel auf „-j6“ (sechs Threads) geändert werden.
Dezentralisierung und Anpassung
Zu Sicherheits-, Autonomie- und Anpassungszwecken ist der Quellcode der UmVirt LFS-Pakete und des UmVirt LFS-Assistenten öffentlich zugänglich gemacht worden. Jeder Interessierte kann ihn herunterladen, bereitstellen und die Dienste in seiner Infrastruktur anpassen.
Quelle: habr.com
