Ich werde ĂŒber den Ansatz zur Organisation lokaler, isolierter Entwicklungsumgebungen auf meiner Arbeitsstation sprechen. Der Ansatz wurde unter dem Einfluss der folgenden Faktoren entwickelt:
- fĂŒr verschiedene Sprachen werden unterschiedliche IDEs und Toolchains benötigt;
- in verschiedenen Projekten können unterschiedliche Versionen von Toolchains und Bibliotheken verwendet werden.
Der Ansatz besteht darin, die Entwicklung innerhalb von lokal auf dem Laptop oder der Arbeitsstation gestarteten LXD-Containern durchzufĂŒhren, wobei die grafische Ausgabe an den Host umgeleitet wird.
Konfiguration am Beispiel Ubuntu 20.04.
Ăberlegungen zu Optionen und GrĂŒnden sind am Ende des Artikels aufgefĂŒhrt.
1. Installation von LXD
Im Ubuntu 20.04 LXD ist nicht mehr als deb-Paket installiert, sondern nur ĂŒber snap:
$ snap install lxdNach der Installation muss die Initialisierung durchgefĂŒhrt werden:
$ lxd initDer einzige Parameter, den ich Ă€ndere, ist storage backend â ich benutze dir als die einfachste. Da ich keine Snapshots und Kopien verwende, erschrecken mich die Warnungen in nicht:
Um diesen Backend zu betrachten, sollte es als letzte Option betrachtet werden.
Es unterstĂŒtzt alle wichtigsten LXD-Features, ist aber schrecklich langsam und ineffizient, da es keine
sofortigen Kopien oder Snapshots erstellen kann und daher bei jedem Zugriff den gesamten Speicher der Instanz kopieren muss.
2. Konfiguration des LXD-Profils
sind Gruppen von Parametern, die auf mehrere Container angewendet werden. FĂŒr meine BedĂŒrfnisse reicht mir das standardmĂ€Ăig erstellte Profil default mit folgenden Ănderungen:
$ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0â damit Anwendungen in Containern mit dem Host-X11-Server interagieren können;$ lxc profile set default environment.DISPLAY :0â damit die UmgebungsvariableDISPLAYin den Containern korrekt gesetzt wird;$ lxc profile set default raw.idmap "beide 1000 1000"â fĂŒr eine richtige .
3. Erstellen und Einrichten des Containers
Einen Container auf Basis des Images images:ubuntu/20.04:
$ lxc launch images:ubuntu/20.04 dev1Ich bevorzuge die Images aus dem Repository, weil sie weniger vorinstallierte Software enthalten. Aus diesem Grund habe ich ein PrĂ€fix zum Image-Namen hinzugefĂŒgt. Das Erstellen eines Containers aus einem Ubuntu-Repository-Image kann wie folgt erfolgen: images: $ lxc launch ubuntu/20.04 dev1 Zugriff auf die Root-Shell des Containers:.
$ lxc exec dev1 -- bash
Ich werde Firefox und VS Code installieren (aus dem RepositorygemÀà Anleitung. ):
$ apt update
$ apt install curl gpg firefox
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list
$ apt update
$ apt install codeIch werde den Container zur Veranschaulichung aktivieren
AusschaltenBonus! Es ist ziemlich einfach, die GPU in den Container weiterzuleiten, damit die darin ausgefĂŒhrten Anwendungen die Grafikkarte nutzen können. Dazu muss man:
- ein GerĂ€t hinzufĂŒgen
$ lxc config device add dev1 mygpu gpu; - die Treiber der Grafikkarte im Container installieren â dieselben, die auf dem Host installiert sind.
4. Verwendung des Containers
Falls der Container noch nicht gestartet ist, muss er gestartet werden:
lxc start dev1VS Code unter einem unprivilegierten Benutzer ausfĂŒhren ubuntu:
lxc exec dev1 -- sudo --login --user ubuntu codeFirefox starten:
lxc exec dev1 -- sudo --login --user ubuntu firefoxDie Fenster der Anwendungen werden auf dem Host angezeigt, wĂ€hrend sie im Container ausgefĂŒhrt werden â Ă€hnlich wie bei der Grafikweiterleitung ĂŒber ssh.
Ich schalte die laufenden Container nicht manuell aus, da ich darin keinen besonderen Sinn sehe â ich beschrĂ€nke mich auf das SchlieĂen der Fenster der laufenden Anwendungen.
5. Fazit
Ich ziehe es vor, das Host-Betriebssystem nicht fĂŒr die Entwicklung zu verwenden, da dies die Installation von Entwicklungstools, Debug-Versionen von Bibliotheken, die spezifische Konfiguration von Systemkomponenten und andere Manipulationen erfordern wĂŒrde. All dies kann zu unerwartetem Verhalten anderer, nicht entwicklungsbezogener Software und sogar des gesamten Betriebssystems fĂŒhren. Zum Beispiel können Ănderungen in der OpenSSL-Konfiguration dazu fĂŒhren, dass das Betriebssystem nicht mehr korrekt startet.
Ich habe verschiedene Mittel zur Isolierung von Entwicklungsumgebungen ausprobiert:
- Virtuelle Maschinen (KVM, VirtualBox usw.) â die naheliegendste Option, verbraucht jedoch deutlich mehr Ressourcen, obwohl es fĂŒr die Entwicklung unter Windows (wenn der Host Linux ist) keine anderen Optionen gibt;
- Cloud-Entwicklungstools, die auf einem lokalen Rechner gestartet werden (Cloud9 in einem Container oder einer virtuellen Maschine, Eclipse Che usw.) â sie sind nicht fĂŒr diesen Betriebsmodus entwickelt, erfordern zusĂ€tzliche Konfiguration und Wartung. Am besten nutzt man sie wie vorgesehen â in der Cloud;
- Docker-Container sind, meiner Meinung nach, nicht ideal, um schnell Prototypen mit Software zu entwickeln, die noch nicht in separaten Containern verpackt ist.
Der gewĂ€hlte Ansatz spricht mich aufgrund seiner Einfachheit und der geringen EinstiegshĂŒrde an. In den Containern können projektspezifische AnsĂ€tze angewendet werden: Entweder man installiert und konfiguriert alles manuell oder man nutzt Automatisierungstools (Puppet, Ansible usw.), um sogar das Rollout durchzufĂŒhren. Ich verwende auch LXD-Container, um spezifische Software auszufĂŒhren, die entweder viele AbhĂ€ngigkeiten benötigt oder eine andere Version des Betriebssystems erfordert â in diesem Fall kann man einen Container mit der benötigten Version des Betriebssystems erstellen, zum Beispiel $ lxc launch images:ubuntu/16.04 dev16.
Es ist wichtig, sich daran zu erinnern, dass Containerisierung im Hinblick auf Isolation eine gröĂere AngriffsoberflĂ€che hat als Virtualisierung â der Host und der Container teilen sich denselben Kernel, und eine Schwachstelle darin kann es schadhafter Software ermöglichen, aus dem Container auszubrechen. FĂŒr Experimente mit fragwĂŒrdiger Software sind geeignetere Isolationsmechanismen die bessere Wahl.
NĂŒtzliche Links
- Umfassender Artikel auf Habré.
- , wichtig ist es, LXD nicht mit LXC zu verwechseln â das sind verschiedene, aber miteinander verbundene Dinge.
- â in diesem Blog gibt es viele nĂŒtzliche anwendungsbezogene Informationen zu LXD.
- â Microsoft stellt regelmĂ€Ăig neue Builds bereit und vertreibt diese mit einer speziellen Lizenz.
Quelle: habr.com
