Univerzalni paket menadžeri – Deo II
U prethodnom delu Univerzalni paket menadžeri – Deo I dali smo osnovne osobine univerzalnih paket menadžera na Linuksu. Sada prelazimo na praktičan rad koji uključuje i kreiranje jednostavih paketa za svaki od tri tipa. Dalje opisana uputstva testirana su na operativnom sistemu Ubuntu 18.04 LTS.
Sadržaj
Snap
Koncept
Snappy
Snappy je sistem za razmenu softvera i paketa koji je prvobitno dizajnirao Canonical za operativni sistem Ubuntu. Paketi, nazvani snaps i alat za njihovo korišćenje snapd, rade na nizu distribucija Linuksa i omogućavaju distro-agnostičnu instalaciju upstream softvera. Sistem je dizajniran za rad na telefonu, cloud-u, IoT-u i desktop računarima. Prva verzija je objavljenja 2014. godine.
Snapcraft
Snapcraft je alat koji služi programerima da pakuju svoje programe u snap format.
Snap
Snap format datoteke je pojedinačni kompresovani sistem datoteka koji se dinamički instalira od strane operativnog sistema domaćina, zajedno sa metapodacima, kako bi se postavio odgovarajući oblik sigurnog sandbox-a ili kontejnera za tu aplikaciju. Ekstenzija datoteke je .snap.
snapd
snapd je upravljačko okruženje koje se bavi instaliranjem i ažuriranjem snap-ova koristeći transakcioni sistem, kao i sakupljanjem smeća i brisanjem starih verzija.
snap-confine
snap-confine je okruženje za izvršenje aplikacija i usluga isporučenih u snap paketima.
Snapd pojednostavljuje razvoj uređaja i njihovog softvera, jer s izuzetkom ograničenog skupa funkcija OS-a, kontrolišete sve komponente u vašoj aplikaciji. Jednostavno dodate sve što je potrebno za snap paket, zatim omogućite dostupnost pomoću Snap Store-a, ili ako ste kreator uređaja, kreirate sopstvenu prodavnicu.
OS snaps
OS snap je rootfs koji sadrži samo dovoljnu količinu stanja da pokreće i upravlja snap-ovima na read only fajl sistemu. Uopšteno, tu su i osnovne funkcije kao što su mrežne usluge, libc, sistemd i sl.
Kada prvi put instalirate snap i OS snap, (core) se instalira i koristi kao platforma za kasnije instalirane snap aplikacije. Na taj način, možete biti sigurni da snap uvek radi na istom jezgru, bez obzira na Linux distribuciju.
Upotreba
- Instalacija snapd:
sudo apt install snapd
- Logovanje na centralizovani repo:
sudo snap login me@myself.com
- Pretraga:
snap find hello
- Instalacija:
snap install hello
Kreiranje paketa
- Instalacija alata snapcraft:
sudo apt install snapcraft
- Kreiranje templejta:
snapcraft init
Na lokaciji iz koje je komanda pokrenuta kreira se folder snap, kao rezultat prethodne komande, a u njemu snapcraft.yaml fajl.
$ cat snap/snapcraft.yaml name: my-snap-name # you probably want to 'snapcraft register ' version: '0.1' # just for humans, typically '1.2+git' or '1.3.2' summary: Single-line elevator pitch for your amazing snap # 79 char long summary description: | This is my-snap's description. You have a paragraph or two to tell the most important story about your snap. Keep it under 100 words though, we live in tweetspace and your description wants to look good in the Snap Store. grade: devel # must be 'stable' to release into candidate/stable channels confinement: devmode # use 'strict' once you have the right plugs and slots parts: my-part: # See 'snapcraft plugins' plugin: nil
Popunjen templejt bi npr. izgledao ovako:
name: hello version: "2.10" summary: GNU Hello, the "hello world" snap description: GNU Hello prints a friendly greeting. grade: stable confinement: strict
grade i confinement, koji informišu sistem, ako je snap podrazumevano stabilno izdanje (grade: stable ili devel) i ako treba izvršiti striktne sigurnosne politike (confinement:strict ili devmode).
Zatim moramo deklarisati aplikacije i komande isporučene u datom trenutku. U ovom slučaju imamo jednu aplikaciju (hello) sa jednim komandom (hello).
apps: hello: command: hello
Sada moramo reći snapcraft-u gde da pronađe hello izvorni kod i kako da ga obradi. Ovo se radi ključnom rečju parts, i navode se gradivni blokovi koji čine snap.
U ovom slučaju, to je jedan deo, izvučen iz udaljenog tar.gz izvora, a potom izgrađen koristeći autotools plugin (koji će pokrenuti uobičajne autotools korake: configure, make, make install).
parts: gnu-hello: plugin: autotools source: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
Konačni fajl, dakle, izgleda ovako:
name: hello version: "2.10" summary: GNU Hello, the "hello world" snap description: GNU Hello prints a friendly greeting. grade: stable confinement: strict apps: hello: command: hello parts: gnu-hello: plugin: autotools source: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
Pokretanjem komande:
snapcraft
u direktorijumu snap, pokreće se build.snap paketa.
Kada se build završi, između ostalog, tu će se naći i fajl hello_2.10_amd64.snap čije je ime generisano na osnovu podataka iz .yaml fajla. Snap (i ovaj koji smo upravo kreirali ) možemo lokalno instalirati:
sudo snap install hello_2.10_*.snap --dangerous
–dangerous koristimo kada instaliramo paket koji nije zvanično registrovan.
Možemo ga pokrenuti komandom:
hello
Informacije o svakom snap-u možemo dobiti komandom:
snap info hello
Objavljivanje snap-a
Prvo je potrebno registvoati se na https://snapcraft.io/ i ulogovati:
snapcraft login
Zatim i na snap-u:
snap login you@yourdomain.com
Registrovanje imena svog snap-a:
snapcraft register drone-autopilot
Ukoliko je slobodno:
Registering drone-autopilot. Congratulations! You're now the publisher for 'drone-autopilot'.
Da bismo postavili novu verziju doboljno je da iz odgovarajuceg snap direktorijuma pokrenemo komandu:
snapcraft push drone-autopilot_stableV2_amd64.snap
Svakim push-om broj revizije našeg paketa se povecava za 1. Objavljivanje snapa za javno preuzimanje od strane korisnika se postiže komandom:
snapcraft release drone-autopilot 1 stable
gde je 1 broj revizije, a stable kanal na kome se ona objavljuje.
The 'stable' channel is now open. Channel Version Revision --------- --------- ---------- stable stableV2 1 candidate - - beta - - edge - -
Komandom
snap find drone
među ponudjenim snap-ovima pronaćićemo i naš. Sada prelazimo na kreiranje i distribuirnje flatpak paketa.
Flatpak
Flatpak (ranije xdg-app) je alat za razvoj softvera, upravljanje paketima i virtuelizaciju aplikacija za Linuks desktop računare. Omogućava sandbox okruženje u kojem korisnici mogu da koriste aplikacije u izolaciji od ostatka sistema. Aplikacije koje koriste Flatpak zahtevaju dozvolu korisnika za kontrolu hardverskih uređaja ili pristup korisničkim datotekama.
Ideju korišćenja aplikacionih kontejnera u GNOME-u prvi put je predložio Lennart Poettering, koji je objavio članak o tome 2014. godine. Razvijen kao deo projekta freedesktop.org (ranije poznat pod nazivom X Desktop Group ili XDG), originalno se zove xdg-app.
Koncept
Flatpak se može razumeti kroz mali broj ključnih koncepata. Korisno je upoznavanje sa njima pre nego što saznate kako da koristite Flatpak iz komandne linije ili da ga koristite za izgradnju aplikacija.
Runtimes
Runtimes obezbeđuju osnovne zavisnosti koje aplikacije koriste. Svaka aplikacija mora biti izgrađena na osnovu njih, a oni moraju biti instalirani na host sistemu kako bi aplikacija mogla da radi. Flatpak može automatski instalirati runtimes koje zahteva aplikacija. Istovremeno se može instalirati više različitih runtime-ova, uključujući različite verzije istih.
Runtime-ovi su agnostični u odnosu na distribucije i ne zavise od specifičnih verzija distribucija. To znači da obezbeđuju stabilnu bazu za distribuciju aplikacija i omogućavaju da aplikacije nastavljaju da rade bez obzira na ažuriranja operativnog sistema.
Skup biblioteka
Ako aplikacija zahteva bilo koje zavisnosti koje nisu u njenom runtime-u, one mogu biti uvezane kao deo aplikacije. Ovo daje fleksibilnost programerima u vezi sa zavisnostima koje koriste, uključujući i korišćenje:
- biblioteka koje nisu dostupne u distribuciji ili runtime-u,
- različite verzije biblioteka od onih koje su u distribuciji ili runtime-u,
- izmenjene verzije biblioteka.
Sandbox
Sa Flatpak-om, svaka aplikacija je izgrađena i pokrenuta u izolovanom okruženju, što se zove sandbox. Svaki sandbox sadrži aplikaciju i njen runtime. Podrazumevano, aplikacija može pristupiti samo sadržaju svog sandbox-a. Pristup je još moguć eksplicitno odobrenim korisničkim datotekama, mrežama, grafičkom soketu, podsistemima na magistrali i uređajima. Pristup drugim resursima, kao što su npr. drugi procesi, sa namerom nije moguć.
Po potrebi, neki resursi koji se nalaze u sandbox-u moraju biti dostupni spolja, da ih iskoristi sistem domaćin. Oni su poznati kao exports jer su to datoteke koje se izvoze iz sandbox-a i uključuju stvari kao što su .desktop fajl i ikona aplikacije.
Portali
Portali su mehanizam pomoću kojeg aplikacije mogu da interaguju sa okruženjem domaćina iz sandbox-a. Daju mogućnost interakcije sa podacima, datotekama i uslugama bez potrebe za dodavanjem pristupnih prava sandbox-u.
Primeri mogućnosti koje se mogu koristiti putem portala uključuju otvaranje datoteka kroz dijalog za odabir datoteke ili štampanje. Interfejsi alatki mogu da implementiraju transparentnu podršku za portale, tako da pristup resursima izvan sandbox-a funkcioniše bezbedno i iz „kutije“.
Repozitorijumi
Flatpak aplikacije i runtime-ovi se obično čuvaju i objavljuju koristeći repozitorijume, koji se ponašaju veoma slično kao Git repozitorijumi. Flatpak repozitorijum može sadržati jedan objekat ili više objekata, a svaki objekt je verziran, što omogućava upgrade i downgrade.
Svaki sistem koji koristi Flatpak može biti konfigurisan da pristupi bilo kom broju udaljenih repozitorijuma. Jednom kada je sistem konfigurisan da pristupi remote, sadržaj daljinskog repozitorijuma može biti pregledan i pretraživan i može se koristiti kao izvor aplikacija i runtime-ova.
Kada se izvrši ažuriranje, nove verzije instaliranih aplikacija i rutina se preuzimaju sa odgovarajućih servera. Kao i kod Git-a, preuzima se samo razlika između verzija, što čini proces veoma efikasnim.
Upotreba
Instalacija:
sudo apt install flatpak
Izlistavanje repozitorijuma:
flatpak remotes
Dodavanje repozitorijuma:
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
–if-not-exists sprečava ispis greške ako je željeni repo već dodat.
Uklanjanje repozitorijuma:
flatpak remote-delete flathub
Pretraga po svim dodatim repozitorijumima:
flatpak search gimp
Instaliranje aplikacije:
flatpak install flathub org.gimp.GIMP
Instaliranje sa lokala ili sa repo-a koji nije dodat:
flatpak install https://flathub.org/repo/appstream/org.gimp.GIMP.flatpakref
Update sa svih repo-a:
flatpak update
Pokretanje aplikacije:
flatpak run org.gimp.GIMP
Izlistavanje instaliranih aplikacija i runtimes-a:
flatpak list
Izlistavanje samo instaliranih aplikacija:
flatpak list --app
Brisanje aplikacije ili runtime-a:
flatpak uninstall org.gimp.GIMP
Flatpak-builder
Flatpak-builder je alat za kreiranje flatpak paketa.
sudo apt install flatpak-builder
Svaka aplikacija mora imati svoj runtime, koji prethodno moramo instalirati:
flatpak install flathub org.freedesktop.Platform//1.6 org.freedesktop.Sdk//1.6
Napisaćemo skriptu hello.sh
# !/bin/sh echo "Hello world, from a sandbox"
Biće nam potrebna i specifikacija u vidu org.flatpak.Hello.json sa sldećim sadržajem:
{ "app-id": "org.flatpak.Hello", "runtime": "org.freedesktop.Platform", "runtime-version": "1.6", "sdk": "org.freedesktop.Sdk", "command": "hello.sh", "modules": [ { "name": "hello", "buildsystem": "simple", "build-commands": [ "install -D hello.sh /app/bin/hello.sh" ], "sources": [ { "type": "file", "path": "hello.sh" } ] } ] }
Build:
flatpak-builder build-dir org.flatpak.Hello.json
Spremna aplikacija će se naći u folderu app, na putanji build-dir
Pokretanje:
flatpak-builder --run build-dir org.flatpak.Hello.json hello.sh
Dodavanje aplikacije u repo
flatpak-builder --repo=repo --force-clean build-dir org.flatpak.Hello.json
gde je repo lokalni folder
–force-clean briše prethodno napravljeni buil-dir
Instalacija:
flatpak --user remote-add --no-gpg-verify tutorial-repo repo flatpak --user install tutorial-repo org.flatpak.Hello
–user vodi evidenciju o tome da su repo i aplikacija dodati od strane tekućeg korisnika
–no-gpg-verify zaobilazi proveru GPG kljuca, što je prihvatljivo u slučaju testiranja na lokalu
Pokretanje:
flatpak run org.flatpak.Hello
AppImage
AppImage je format za distribuciju prenosivog softvera na Linux-u bez potrebe za root dozvoljima za instalaciju aplikacije. Takođe, pokušava da uvede distribuciju distro-agnostičnog binarnog softvera za programere aplikacija, koje koristi upstream pakovanje. Objavljen prvi put još 2004. godine pod imenom klik, bio je kontinuirano razvijan, a zatim je preimenovan 2011. u PortableLinuxApps, a kasnije 2013. u AppImage.
Koncept
AppImageKit
AppImageKit je referentna implementacija AppImage specifikacije. Podeljena je na nekoliko komponenti, koje su opisane u ovom odeljku.
Runtime
Runtime pruža izvršno zaglavlje svakog AppImage-a. Kada se izvršava AppImage aplikacija, runtime unutar AppImage-a se pokreće, montira ugrađenu datoteku fajl sistema na read only privremenu lokaciju, i pokreće aplikaciju unutar nje. Nakon izlaska iz aplikacije, runtime razmontira squashfs i čisti privremene resurse (privremeni direktorijum za montažu).
appimagetool
appimagetool je najlakši način za kreiranje AppImage-a iz postojećih direktorijuma na sistemu, takozvana: ref: AppDir
s. On kreira AppImage tako što ugrađuje runtime i kreira i dodaje fajlsistem.
appimagetool implementira sve opcione funkcije, kao na primer informacije o ažuriranju, potpisivanje i neke dodatne opcije kako bi se uverio da su informacije u AppImage-u važeće.
AppRun
Svaki AppImage AppDir mora sadržati datoteku pod nazivom AppRun, koja označava ulaznu tačku. Kada pokreće AppImage, runtime izvršava datoteku AppRun unutar AppDir-a.
AppRun ne mora obavezno da bude regularni fajl. Ako je aplikacija prenosiva, ona može biti samo simbolička veza sa glavnom binarnom datotekom. Alati poput linuxdeploy mogu pretvoriti aplikacije u prenosive i stoga kreiraju takav symlink.
U nekim slučajevima, međutim, kada se postojeća aplikacija ne sme promeniti (npr. kada licenca zabranjuje bilo koju modifikaciju) ili alat kao što je linuxdeploy ne može da se koristiti, može se koristiti AppRun.c. AppRun.c pokušava da kreira programe za učitavanje uvezanih deljenih biblioteka, umesto sistemskih, manipulacijom environment varijabli. Pored toga, pokušava da spreči upozorenja sa kojima se mogu sresti korisnici, koja dolaze iz činjenice da je AppDir montiran samo za čitanje.
Korišćenje AppRun-a nije garancija da će aplikacija biti pokrenuta, a korisnik mora da obezbedi sve resurse koji bi aplikaciji mogli biti potrebni ručno (ili pomoću spoljnih alata) pre kreiranja AppImage-a sa appimagetool-om. AppRun nasilno menja trenutni radni direktorijum, i zato aplikacije ne mogu da otkriju gde je AppImage originalno pozvan. Ovo može biti posebno neprijatno za CLI alate, ali takođe može biti problem za GUI aplikacije koje očekuju putanje kao parametre.
Helpers
AppImageKit dolazi sa nekoliko pomoćnih alata koji se mogu koristiti za validaciju nekih AppImage funkcija.
validate
validate može potvrditi PGP potpis unutar AppImages.
digest-md5
Izračunava MD5 digest koji se koristi u svrhu integracije za dati AppImage. Digest zavisi od putanje, a ne od sadržaja.
AppImageUpdate
Omogućava ažuriranje AppImage-a na decentralizovan način koristeći informacije ugrađene u sam AppImage.
Upotreba
Preuzećemo AppImage koji sadrži appimagetool:
wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
Zatim ćemo mu dati izvršna prava:
chmod +x appimagetool-x86_64.AppImage
Kreiranje
Da bismo kreirali naš AppImage preuzećemo pripremljen git projekat:
git clone https://github.com/boolean-world/appimage-resources
U njemu se nalaze fajl AppRun koji pokreće našu helloworld.sh skriptu, koja ispisuje „Hello World!“ , helloworld.desktop fajl koji setuje ime aplikacije u hello-world-appimage i ikonu hello-world-icon.png.
Pozicioniramo se:
cd appimage-resources
Pokrecemo appimagetool:
/path/to/appimagetool-x86_64.AppImage hello-world-appimage/
Kreiran je AppImage pod nazivom hello-world-appimage-x86_64.AppImage.
Zaključak
Na najosnovnijim primerima je pokazano kako funkcionišu alati za upotrebu univerzalnih paket menadžera za Linuks. Pakovanje realnih projekata je nešto komplikovanije i prevazilazi okvire ovog bloga, ali osnovni koncept je isti. Svi prikazani alati su još uvek u razvoju i u poslednje vreme stiču sve veću popularnost. Glavni cilj je isti, a postoji i puno sličnosti, ali i puno razlika među predstavljenim rešenjima. Sva tri koncepta danas su podržana na većini distribucija.
Reference
Autor: Dragutin Ostojić
Sarednik u nastavi na Prirodno-matematičkom fakulteti u Kragujevcu i nastavnik u Prvoj kragujevackoj gimnaziji.