Voi povesti despre abordarea organizării mediilor de dezvoltare izolate local pe stația mea de lucru. Abordarea a fost dezvoltată sub influența următorilor factori:
- pentru diferite limbaje sunt necesare diferite IDE-uri și toolchain-uri;
- în diferite proiecte pot fi folosite versiuni diferite ale toolchain-urilor și bibliotecilor.
Abordarea constă în a dezvolta în interiorul containerelor LXD lansate local pe laptop sau stație de lucru cu redirecționarea ieșirii grafice către gazdă.
Configurare cu exemplul Ubuntu 20.04.
Reflecțiile asupra opțiunilor și motivelor sunt prezentate la finalul articolului.
1. Instalarea LXD
În Ubuntu 20.04 LXD nu mai este disponibil pentru instalare ca pachet deb, ci doar prin snap:
$ snap install lxdDupă instalare, trebuie efectuată inițializarea:
$ lxd initSingurul parametru pe care îl schimb este storage backend — eu folosesc dir ca cea mai simplă opțiune. Deoarece nu folosesc instantanee și copii, avertismentele din mă pot speria:
În mod similar, backend-ul de director trebuie considerat ca o opțiune de ultimă instanță.
Acesta suportă toate funcțiile principale LXD, dar este foarte lent și ineficient, deoarece nu poate efectua
copii instantanee sau instantanee, așa că trebuie să copieze întreaga stocare a instanței de fiecare dată.
2. Configurarea profilului LXD
— sunt seturi de parametrii aplicate mai multor containere. Pentru nevoile mele, un singur profil creat implicit este suficient, default cu următoarele modificări:
$ lxc profile device add default X0 disk source=\/tmp\/.X11-unix\/X0 path=\/tmp\/.X11-unix\/X0— pentru ca aplicațiile din containere să poată interacționa cu serverul X11 gazdă;$ lxc profile set default environment.DISPLAY :0— pentru ca variabila de mediuDISPLAYdin containere să fie setată corect;$ lxc profile set default raw.idmap "both 1000 1000"— pentru un .
3. Crearea și configurarea containerului
Crearea unui container bazat pe imaginea images:ubuntu\/20.04:
$ lxc launch images:ubuntu\/20.04 dev1Prefer imaginile din depozit , deoarece au mai puțin software preinstalat. Din acest motiv, am adăugat prefixul images: la numele imaginii. Crearea unui container bazat pe o imagine din depozitul Ubuntu se poate face astfel: $ lxc launch ubuntu\/20.04 dev1.
Acces la shell-ul root al containerului:
$ lxc exec dev1 -- bashVoi instala Firefox și VS Code (din depozit ):
$ 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 codeVoi activa containerul pentru claritate
poweroffBonus! Este destul de simplu să redirecționezi GPU-ul într-un container astfel încât aplicațiile care rulează în acesta să poată utiliza placa grafică. Pentru aceasta trebuie:
- să adaugi dispozitivul
$ lxc config device add dev1 mygpu gpu; - să instalezi driverele plăcii grafice în container - aceleași care sunt instalate pe gazdă.
4. Utilizarea containerului
În cazul în care containerul nu este încă pornit, trebuie să-l pornești:
lxc start dev1Rularea VS Code sub un utilizator neprivilegiat ubuntu:
lxc exec dev1 -- sudo --login --user ubuntu codeRularea Firefox:
lxc exec dev1 -- sudo --login --user ubuntu firefoxFeronțele aplicațiilor vor fi afișate pe gazdă, dar vor fi executate în interiorul containerului - similar cu redirecționarea graficii prin ssh.
Nu opresc manual containerele care rulează, deoarece nu văd niciun scop în asta - mă limitez la închiderea feronțelor aplicațiilor active.
5. Concluzie
Prefer să nu folosesc sistemul de operare gazdă pentru dezvoltare, deoarece ar necesita instalarea uneltelor de dezvoltare, versiunilor de debug ale bibliotecilor, configurarea componentelor sistemului într-un mod specific și alte manipulări. Toate acestea pot duce la comportamente neașteptate ale altor software-uri care nu sunt legate de dezvoltare, sau chiar ale întregului sistem de operare. De exemplu, modificările în configurația OpenSSL pot face ca sistemul de operare să nu mai pornească corect.
Am încercat diferite instrumente pentru izolația mediilor de dezvoltare:
- mașini virtuale (KVM, VirtualBox etc.) - cea mai evidentă opțiune, dar consumă semnificativ mai multe resurse, deși pentru dezvoltarea pe Windows (dacă gazda este Linux) nu sunt alte opțiuni;
- instrumente de dezvoltare în cloud care rulează pe mașina locală (Cloud9 într-un container sau mașină virtuală, Eclipse Che etc.) - acestea nu sunt concepute pentru acest mod de lucru, necesită configurări și întreținere suplimentare, cel mai bine este să le folosești conform utilizării lor - în cloud;
- Containerele Docker sunt, din nou, destinate altui scop; din perspectiva mea, nu sunt foarte convenabile pentru prototiparea rapidă folosind software care nu este încă ambalat în containere separate.
Abordarea aleasă îmi place pentru că este simplă și are un prag de intrare scăzut. În containere, poți aplica metode specifice proiectului: să instalezi și să configurezi totul manual sau să utilizezi automatizarea (Puppet, Ansible etc.), chiar și pentru desfășurarea Folosesc containere LXD și pentru a rula software specific care necesită instalarea unui număr mare de dependențe sau o altă versiune de sistem de operare; în acest caz, poți crea un container cu versiunea dorită a sistemului de operare, de exemplu $ lxc launch images:ubuntu/16.04 dev16.
Este important să reții că, în ceea ce privește izolația, containerizarea are o suprafață de atac mai mare comparativ cu virtualizarea — gazda și containerul împărtășesc același nucleu, iar o vulnerabilitate în acesta poate permite software-ului malițios să evadeze din container. Pentru experimente cu software discutabil, este mai bine să folosești mecanisme de izolare mai potrivite.
Linkuri utile
- Un articol relevant pe Habr.
- , este important să nu confunzi LXD cu LXC — acestea sunt lucruri diferite, dar interconectate.
- — în acest blog există o mulțime de informații utile aplicate despre LXD.
- — Microsoft compilează periodic noi versiuni și le distribuie cu o licență specială.
Sursa: habr.com
