V lońském létě Langdon White, Ralph Bean a několik dalších vývojářů strávili několik dnů (a i večerů) i diskuze kolem změn v nástrojích pro vydávání distribuce a projektu, který v té době byl v úplných plenkách - Modularita. Cíl byl jednoduchý ale ambiciózní - převést do praxe v té době už několik let starý návrh na Fedora rings - vrstvy aplikací které bude možné zaměňovat a dodat jejich alternativní verze, které jsou jednoduše instalovatelné a spravovatelné na systému. Zároveň návrh počítal s profily, které umožní instalovat různé sady balíčků z daného module podle požadavků uživatele - například rozdílná instalace pro Workstation a Server. Všechny tyto požadavky už měly různá řešení, ale vždy chyběl nějaký ten krok k jednoduché integraci - ať už to jsou alternatives nebo softwarové kolekce. Modularita k problému přistupovala trochu jinak a cílem bylo zachovat co nejvíce existující rozhraní a ideálně zjednodušit práci správcům balíčků a modulů tam kde je k dispozici několik verzí dané komponenty a zároveň je potřeba podporovat více verzí OS nebo kromě RPM mít k dispozici i kontejner.

Práce na Modularitě trvala přes rok a konečně je k dispozici něco co si uživatelé mohou jednoduše vyzkoušet. K dispozici je testovací docker kontejner, který obsahuje modifikovanou verzi správce balíčků DNF, který na pozadí pracuje s moduly a ve chvíli kdy uživatel chce zaměnit určitou komponentu za stejnou s jinou verzí tak využije informace z modulu aby nainstaloval správná RPM. Nejlelší bude vyzkoušet si to!

 

Nejdříve je potřeba stáhnout kontejner s upraveným DNF

$ docker pull registry.fedoraproject.org/f26-modular/boltron
$ docker run —rm -it f26-modular/boltron

 

Jak je vidět v

$ cat /etc/os-release

je tento kontejner postavený nad obrazem Fedory 26, ale sestavený pomocí upravených nástrojů v infrastruktuře Fedory. Jak už jsem zmínil, z pohledu uživatele  bylo cílem zachovat co nejvíce existujících rozhraní. Na rozdíl od softwarových kolekcí tak není potřeba řešit namespacing a nebo volat speciální příkazy a hledat přejmenované balíčky. S modulárním přístupem prostě pracujeme s RPM tak jako jsme to dělali doteď

$ dnf list

.. má novou část ukazující moduly, které jsou k dispozici. Zobrazení modulů a informací, které modul sebou nese bude určitě ještě změněno. V současné době je k dispozici asi 25 modulů, se kterým si můžete hrát. DNF také ukazuje “stream” ze kterého je daný modul odvozený - standardně jsou všechny moduly navázané na Fedoru 26 a alternativní verze tak jak je to vidět pro nodejs mají stream odvozený od verze nebo může být i jinak pojmenovaný (latest, stable apod.). Po instalaci modulu také v sekci Install uvidíte, v jakém profilu je daný modul nainstalovaný.

Takže vyzkoušíme si nainstalovat první modul

$ dnf install httpd

Ale vždyť nikde neříkám že chci modul? Ano, to je správně! Celý koncept počítá s tím, že pokud moduly nepotřebujete a nechcete využívat tak nemusíte o nich ani vědět. Až v případě že chci využít funkcionalitu modulu zjistím že DNF na pozadí udržuje metadata navíc a dokáže s nimi pracovat. V případě httpd je modul skupina balíčků, která byla sestavena dohromady v rámci jednoho buildu, tato skupina balíčků prošla dohromady testování a buildovací systém vytvořil navíc nějaká metadata.

$ dnf list

.. nyní ukazuje, že httpd je nainstalováno s profilem default.

Teď vyzkoušíme něco jiného. Nodejs je k dispozici ve dvou verzích. Nodejs v6 a Nodejs v8 a různé aplikace nebo vývojáři mohou mít požadavky na jednu nebo druhou verzi. Takže co se stane když spustíme

$ dnf install nodejs

V tomto případě se nainstaluje nodejs z default streamu - tedy z f26 a získám nodejs ve verzi 6.x

$ node -v
v6.10.3

K dispozici je ale novější verze nodejs! Co se stane když spustím

$ dnf update nodejs

Nestane se nic. Stream mi zaručí že dostanu verzi, kterou správce nodejs označil jako hlavní. Update pak bude jen v tomto streamu a nikdy na alternativní verzi. Takže jak mohu získat jinou verzi nodejs? Jednoduše

$ dnf install nodejs-8
$ node -v
v8.0.0

A máme nodejs v8 na systému! Další update bude pokračovat v tomto streamu a budu získávat aktualizace pro verzi 8. No a pokud se rozhodnu vrátit zpět default verzi nodejs pro Fedoru 26? Opět zavolám

$ dnf install nodejs-f26

Jsem zpět na nodejs 6. Toto je jedna z hlavních vlastností modulů. Druhou neméně zajímavou jsou profily. Nejdříve ale malá odbočka k DNF. DNF umožňuje rozšíření pomocí pluginů a díky tomu existuje v DNF plugin “module”, který řeší veškerou práci s moduly. DNF v tomto testovacím kontejneru je upravené tak aby moduly používalo primárně a pokud chci instalovat pouze RPM bez modulárních metadat tak podporuje direktivu --rpm. DNF plugin pro moduly obsahuje několik dalších příkazů a probíhám na něm dál vývoj pro doplnění další funkcionality.

Jedním z příkazů modulu slouží k získání všech metada o modulu.

$ dnf module info mariadb

Jedna ze sekcí zobrazuje informace o profilech

profiles:
 client:
  rpms: [mariadb]
 default:
  rpms: [mariadb, gettext, mariadb-server]
 server:
  rpms: [mariadb-server, gettext]

Databáze mariadb má tedy 3 různé profily. Default profile, který instaluje server i klientskou aplikaci, client pro klienta a server pro server. Na svém systému nepotřebuji klient a rozhodl jsem se instalovat pouze server

$ dnf install mariadb/server

A mám server. Nyní pokud v budoucnu zavolám

$ dnf update mariadb

Bude stále probíhat aktualizace pouze server profilu a balíčků, které jsou v něm. Pokud chci profil změnit tak můžu opět zavolat dnf install na modul s novým názvem profilu. DNF pro tyto účely vytváří speciální soubor

$ cat /etc/dnf/modules.d/mariadb.module
[mariadb]
name = mariadb
stream = f26
version = 20170707130409
profiles = server
enabled = 1
locked =

který poté využívá k hlídání streamu a profilu. Soubor lze manuálně měnit a pomocí jiných nástrojů tak změnit profil nebo stream. Dalším příkazem DNF pluginu pro moduly je

$ dnf module list --installed

Nyní vidím všechny nainstalované moduly včetně jejich streamů a profilů.

Boltron je test - proof of concept neboli PoC. Ukazuje chování modulů a DNF, ale moduly určitě nejsou perfektní a funkcionalita DNF určitě není kompletní. Více informací najdete na  https://docs.pagure.org/modularity. V průběhu dalších týdnu bude probíhat sbírání zpětné vazby, na konferenci FLOCK proběhne několik workshopů a prezentací a uvidíme co se modularity týmu podaří dostat do Fedory 27!