Misschien zijn veel gebruikers van GNU/Linux, gezien de recente initiatieven van de autoriteiten voor het creëren van een 'soeverein' internet, zich gaan afvragen hoe ze zich kunnen beschermen voor het geval de repositories van populaire GNU/Linux-distributies niet beschikbaar zijn.
Sommige mensen downloaden de repositories van CentOS, Ubuntu en Debian, anderen bouwen hun eigen distributies op basis van bestaande distributies, en weer anderen, gewapend met boeken zoals LFS (Linux From Scratch) en BLFS (Beyond Linux From Scratch), zijn al begonnen met het compileren van hun eigen distributies uit de broncode omdat ze geloven dat er in een 'soeverein' internet onvermijdelijk hackersaanvallen, virusepidemieën en datalekken zullen plaatsvinden, en dat binaire bestanden na verloop van tijd verouderen.
Onlangs heb ik eindelijk de tijd gevonden om een virtuele machine volledig te compileren uit de broncode op basis van de instructies in het boek Linux From Scratch Systemd Edition v.8.3. Ik sta te popelen om de resultaten met jullie te delen.
Het bouwproces van Linux
Het bouwproces van Linux uit de broncode kan in drie fasen worden verdeeld:
- Op basis van het bestaande besturingssysteem wordt een LFS-bouwomgeving samengesteld.
- In de bouwomgeving wordt een afbeelding van de LFS-virtuele machine samengesteld.
- Op de virtuele machine worden extra pakketten geïnstalleerd uit het boek BLFS die niet in het boek LFS staan.
Statische scripts
Tijdens het werken met de bouwomgeving is het handig om gebruik te maken van het klembord en SSH: je kunt opdrachten uit het boek kopiëren en in de console van de bouwomgeving plakken.
Na het opstarten van de gemaakte virtuele machine deden zich ernstige problemen voor. In tegenstelling tot een terminalvenster is het onmogelijk om code in het venster van de virtuele machine in te voegen. Het is onhandig om opdrachten met het toetsenbord in te voeren en er is een groot risico op typefouten. Het gevaar van typefouten is dat ze zich niet onmiddellijk manifesteren, maar na enige tijd, wat kan leiden tot ernstige problemen.
Het is bekend dat opdrachten niet alleen via het toetsenbord kunnen worden ingevoerd, maar ook via de standaardinput (STDIN). De bron van de standaardinput kan een seriële poort zijn, evenals de uitvoer van een programma of script, de zogenaamde standaarduitvoer (STDOUT).
Veel mensen weten dat het commando wget de inhoud van een gedownload bestand naar de standaarduitvoer (STDOUT) kan sturen:
wget http://example.com -O -Als de uitvoer van het wget-commando naar de interpreter wordt geleid, kan willekeurige code worden uitgevoerd. De code wordt uitgevoerd alsof deze op het toetsenbord is getypt of uit het klembord is gekopieerd:
wget http://umvirt.com/linux/helloworld.sh -O - | bashZo kunnen bestanden met commando's op een webserver worden geplaatst en hun inhoud naar de interpreter worden gestuurd.
Dynamische scriptbestanden
Statische bestanden zijn natuurlijk goed als je precies weet wat er moet worden uitgevoerd, maar wat als je een pakket installeert en het onduidelijk is of de afhankelijkheden zijn geïnstalleerd of niet?
Hier komt de dynamische site die is opgebouwd op basis van LAMP-webservers (Linux-Apache-MySQL-PHP). Als de site in staat is om HTML-pagina's en afbeeldingen dynamisch te genereren, dan zou deze ook met gewone tekstbestanden moeten kunnen omgaan.
En zo is het gebeurd. Ik heb de site geschreven die scripts genereert voor de Bash-interpreter. De database van de site bevat informatie over pakketten, afhankelijkheden, patches, aanvullingen en build-commando's.
Nu kan de installatie van het pakket mc (midnight commander) worden uitgevoerd met het volgende commando:
wget --no-check-certificate https://umvirt.com/linux/packages/0.1/mc/install -O - | bashHet script van de site haalt automatisch gegevens uit de database en genereert de controlecode voor afhankelijkheden en de installatiescriptcode. De interpreter verwerkt de instructies uit het script.
Om dit mogelijk te maken, worden de gegevens van de geïnstalleerde pakketten op de virtuele machine opgeslagen in een database.
De database van geïnstalleerde pakketten bevindt zich in de map /var/cache/ulfs-packages en bestaat uit een lijst van lege bestanden met namen die overeenkomen met de namen van de pakketten.
Als een pakket niet in de database wordt gevonden, vindt er een recursieve installatie van afhankelijkheden plaats.
Gemak
Om het installeren van pakketten handiger te maken, heb ik het script chimp geschreven, een andere site , dat gebruikmaakt van de database UmVirt LFS Packages. De belangrijkste taak UmVirt LFS Assistant is het uitvoeren van andere commando's.
Met chimp wordt het installeren van pakketten nog eenvoudiger:
chimp install mcDemonstratie
Om meer te leren over hoe de services werken, UmVirt LFS Packages en UmVirt LFS Assistant kun je het basisafbeelding downloaden . Voer de installatie van Xorg uit met één commando:
chimp install XTijdens de uitvoering van het script worden 141 pakketten automatisch geïnstalleerd. Om tijd te besparen op compilatie kun je in het bestand /etc/profile de waarde van de variabele MAKEFLAGS wijzigen van «-j1» (één thread), bijvoorbeeld naar «-j6» (zes threads).
Decentralisatie en maatwerk
Ter verbetering van de veiligheid, autonomie en maatwerk is de broncode van de diensten UmVirt LFS Packages en UmVirt LFS Assistant openbaar gemaakt. Iedereen kan deze downloaden, implementeren en de diensten aanpassen binnen hun eigen infrastructuur.
Bron: habr.com
