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.

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: AppDirs. 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ć

Master student informatike na Institutu za matematiku i informatiku Prirodno-matematičkog fakulteta u Kragujevcu i profesor programiranja u Prvoj kragujevačkoj gimnaziji.

Dragutin Ostojić

Master student informatike na Institutu za matematiku i informatiku Prirodno-matematičkog fakulteta u Kragujevcu i profesor programiranja u Prvoj kragujevačkoj gimnaziji.