Projekt vznikl jako idea managera týmu DNF/YUM Jana Zeleného. Je určen především pro zařízení, které mají slabší hardware, ale samozřejmě jej lze použít i na běžných počítačích s Fedorou. V současné době na projektu pracují studenti z FITu VUT Brno v rámci projektu Red Hat Lab-Q.
Studenti:
- Josef Řídký
- Michal Ruprich
- Šimon Matěj
Cíl:
Řekněme, že máme zařízení, které nemá dostatečné hardwarové prostředky. Při počítání závislostí na straně zařízení může dojít k zahlcení paměti, k restartu zařízení a dalším neočekávaným stavům a tím pádem se závislosti balíčku nevypočítají vůbec či špatně.
Projekt by tedy měl tuto chybu či nedostatečnost odstranit tak, aby se závislosti vyřešily na straně serveru a klient by pouze nainstaloval balíky.
Jako další možný cíl projektu je “cachování” jednotlivých závislosti a v případě,
že by závislost již byla jednou vyřešena, pak by klient pouze nainstaloval balíky se spravnými verzemi.
Projekt je také použitelný v případě, že máme farmu čítající desítky stejných strojů,
a jakmile jeden stroj vypočítá pomocí projektu závislosti, ostatní balíky již pouze instalují dané verze balíků.
Součástí projektu je také potřeba vytvořit Fedora infrastrukturu, ale to bude potřeba až v pozdějších fázích projektu.
Jak projekt vyzkoušet na lokálním počítači?
Projekt ještě není součástí Fedory a tak je nutné projekt nainstalovat z Gitového repositáře. Nicméně na přidání balíčku do Fedory se usilovně pracuje.
Nejprve je potřeba projekt naklonovat na počítač pomocí příkazu:
git clone https://github.com/rh-lab-q/server-side-dependency-solving
Tím máme projekt na nášem počítači, či zařízení s menším množstvím paměti.
Před samotným spuštěním projektu je nutné doinstalovat balíky, které budou potřebné pro kompilaci a spuštění.
Bohužel v tomto kroku ještě nemůžeme využít projekt Remote Dependency Solving.
Doinstalovaní balíků uděláme pomocí příkazu:
sudo dnf install gcc cmake libsolv librepo-devel hawkey-devel glib2-devel json-glib json-glib-devel check-devel
Nyní si projekt zkompilujeme a nainstalujeme
Kompilace projektu
Prvně přejdeme do adresáře build v adresáři, kde jsem si naklonovali projekt a spusťme příkaz příkaz cmake:
$ cd build $ cmake ../
Příkazem se nám ověří, jestli máme nainstalovány všechny potřebné balíky pro projekt.
Nyní zkompilujeme projekt pomocí příkazu make:
$ make
Příkaz make vytvoří dva binární soubory s názvem rds-client a rds-server.
Jak nainstalovat/smazat balíček pomocí RDS?
Jak otestovat projekt na lokálním počítačí přes localhost?
Nejprve si připravme dva terminály. Jeden terminál bude použit pro rds-server
a druhý pro rds-clienta.
Jelikož potřebujeme spustit rds-server a rds-client s právy roota, spustíme jej přes příkaz sudo:
sudo ./rds-server
a
sudo ./rds-client
Nyní zkusme zda-li fungují příkazy jako --install a --delete a podívejme se co uvidíme na obou terminálech.
Instalace balíčku emacs
Předtím než nainstalujeme emacs zkontrolujeme, zda-li již není nainstalován na systému příkazem rpm -q emacs.
$ rpm -q emacs package emacs is not installed
Nyní spustíme vlastní instalaci.
Na prvním terminalu máme spuštěn rds-server, kde uvidíme jak probíhá komunikace s klientem
$ sudo ./rds-server [2/2/16 14:26:06 SSDS]: Server started. [MESSAGE]: Connection accepted from ip address 127.0.0.1 [MESSAGE]: DEPENDENCY SOLVING. pkg v query: emacs [MESSAGE]: Dependencies for emacs are ok. pred insert { "code" : 11, "data" : { "install" : [ { "pkg_name" : "emacs-common", "pkg_loc" : "Packages/e/emacs-common-24.5-6.fc23.x86_64.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=fedora-23&arch=x86_64" }, { "pkg_name" : "emacs", "pkg_loc" : "Packages/e/emacs-24.5-6.fc23.x86_64.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=fedora-23&arch=x86_64" } ], "upgrade" : [ ], "erase" : [ ], "obsolete" : [ ] } }
Na druhém terminálu spustíme rds-client --install emacs.
$ sudo ./rds-client --install emacs [2/2/16 14:30:27 SSDS]: Client startup. [MESSAGE]: Client startup. Required package count 1. [MESSAGE]: Trying to connect to server...(1 of 3) [MESSAGE]: Connection to server is established. [MESSAGE]: Sending initial message to server. [MESSAGE]: Message sent. [MESSAGE]: Installation of packages was selected. [MESSAGE]: Sending message with repo info to server. [MESSAGE]: Waiting for answer from server. Number of packages to install: 2 update: 0 erase: 0 maybe erase: 0 [MESSAGE]: Result from server: Packages for install emacs-common emacs [QUESTION]: Is it ok? [y/n/d]: y [MESSAGE]: Downloading preparation for package: emacs-common [MESSAGE]: Downloading preparation for package: emacs [MESSAGE]: Downloading packages. emacs 100% - Downloaded. emacs-common 100% - Downloaded. [MESSAGE]: All packages were downloaded successfully. [MESSAGE]: Installing packages. Preparing... ################################# [100%] Updating / installing... 1:emacs-common-1:24.5-6.fc23 ################################# [ 50%] 2:emacs-1:24.5-6.fc23 ################################# [100%]
Zkontrolujeme, jestli se balíček skutečně nainstaloval pomocí rpm -q.
$ rpm -q emacs emacs-24.5-6.fc23.x86_64 $
Vymazání balíčku emacs
Opět spustíme příkaz rds-server s právy roota, kde budeme sledovat komunikaci mezi klientem a serverem.
$ sudo ./rds-server [2/2/16 14:26:06 SSDS]: Server started. [MESSAGE]: Connection accepted from ip address 127.0.0.1 [MESSAGE]: DEPENDENCY SOLVING. pkg v query: emacs [MESSAGE]: Dependencies for emacs are ok. pred insert { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ ], "erase" : [ { "pkg_name" : "emacs", "pkg_loc" : null, "base_url" : null, "metalink" : "@System" } ], "obsolete" : [ ] } }
Vymazání balíčku provedeme pomocí příkazu rds-client --erase emacs.
$ sudo ./rds-client --erase emacs [3/2/16 21:11:55 SSDS]: Client startup. [MESSAGE]: Client startup. Required package count 1. [MESSAGE]: Trying to connect to server...(1 of 3) [MESSAGE]: Connection to server is established. [MESSAGE]: Erase of packages was selected. [MESSAGE]: Sending message with repo info to server. [MESSAGE]: Waiting for answer from server. from server: { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ ], "erase" : [ { "pkg_name" : "emacs", "pkg_loc" : null, "base_url" : null, "metalink" : "@System" } ], "obsolete" : [ ] } } Number of packages to install: 0 update: 0 erase: 1 maybe erase: 0 [MESSAGE]: Result from server: Packages for erase emacs [QUESTION]: Is it ok? [y/n]: y [MESSAGE]: Downloading packages. [MESSAGE]: All packages were downloaded successfully. [MESSAGE]: Erasing packages. Preparing... ################################# [100%] Cleaning up / removing... 1:emacs-1:24.5-6.fc23 ################################# [100%] [3/2/16 21:12:04 SSDS]: End of client.
Nyní ověříme, zda-li je balíček skutečně odinstalován.
$ rpm -q emacs package emacs is not installed $
Jak updatovat systém pomocí RDS?
Update systému
Opět spustíme příkaz rds-server s právy roota, kde budeme sledovat komunikaci mezi klientem a serverem.
$ sudo ./rds-server [9/2/16 09:44:21 SSDS]: Server started. [MESSAGE]: Connection accepted from ip address 127.0.0.1 [MESSAGE]: DEPENDENCY SOLVING. Downloading repo: updates - 100% [MESSAGE]: Metadata for updates - download successfull (Destination dir: /tmp/ssds/updates). Downloading repo: fedora - 100% [MESSAGE]: Metadata for fedora - download successfull (Destination dir: /tmp/ssds/fedora). Downloading repo: adobe-linux-i386 - 100% ... SNIP ... Downloading repo: mhlavink-developerdashboard - 100% [MESSAGE]: Metadata for mhlavink-developerdashboard - download successfull (Destination dir: /tmp/ssds/mhlavink-developerdashboard). Downloading repo: rhpkg - 100% [MESSAGE]: Metadata for rhpkg - download successfull (Destination dir: /tmp/ssds/rhpkg). Downloading repo: fedora-steam - 100% [MESSAGE]: Metadata for fedora-steam - download successfull (Destination dir: /tmp/ssds/fedora-steam). Downloading repo: helber-atom - 100% [MESSAGE]: Metadata for helber-atom - download successfull (Destination dir: /tmp/ssds/helber-atom). Downloading repo: google-chrome - 100% [MESSAGE]: Metadata for google-chrome - download successfull (Destination dir: /tmp/ssds/google-chrome). { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ { "pkg_name" : "tzdata-java", "pkg_loc" : "t/tzdata-java-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "tzdata", "pkg_loc" : "t/tzdata-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "selinux-policy-targeted", "pkg_loc" : "s/selinux-policy-targeted-3.13.1-158.4.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "selinux-policy", "pkg_loc" : "s/selinux-policy-3.13.1-158.4.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, ... SNIP ... { "pkg_name" : "abi-dumper", "pkg_loc" : "a/abi-dumper-0.99.14-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" } ], "erase" : [ ], "obsolete" : [ ] } }
Update systému pomocí rds-client --update
$ sudo ./rds-client --update [9/2/16 09:44:36 SSDS]: Client startup. [MESSAGE]: Client startup. Required package count 0. [MESSAGE]: Trying to connect to server...(1 of 3) [MESSAGE]: Connection to server is established. [MESSAGE]: Update all packages was initiated. [MESSAGE]: Sending message with repo info to server. [MESSAGE]: Waiting for answer from server. from server: { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ { "pkg_name" : "tzdata-java", "pkg_loc" : "t/tzdata-java-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "tzdata", "pkg_loc" : "t/tzdata-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "selinux-policy-targeted", "pkg_loc" : "s/selinux-policy-targeted-3.13.1-158.4.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "selinux-policy", "pkg_loc" : "s/selinux-policy-3.13.1-158.4.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, ... SNIP ... { "pkg_name" : "abi-dumper", "pkg_loc" : "a/abi-dumper-0.99.14-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" } ], "erase" : [ ], "obsolete" : [ ] } } Number of packages to install: 0 update: 31 erase: 0 maybe erase: 0 [MESSAGE]: Result from server: Packages for update tzdata-java tzdata selinux-policy-targeted selinux-policy ... SNIP ... abi-dumper [QUESTION]: Is it ok? [y/n/d]: y [MESSAGE]: Downloading preparation for package: tzdata-java [MESSAGE]: Downloading preparation for package: tzdata [MESSAGE]: Downloading preparation for package: selinux-policy-targeted [MESSAGE]: Downloading preparation for package: selinux-policy ... SNIP ... [MESSAGE]: Downloading preparation for package: abi-dumper [MESSAGE]: Downloading packages. [MESSAGE]: Packages are installed [9/2/16 09:47:23 SSDS]: End of client. $
Zbylé příkazy, které podporuje dnf příkaz budou v projektu doimplementovány v nejbližší době.
Co dál?
Jakmile bude projekt podporovat "důležité příkazy" DNF, projekt samozřejmě nekončí.
- Stejné použití příkazů jako DNF
- Zabezpečení komunikace mezi serverem a klientem.
- Spuštění příkazu rds-server jako daemona.
- Vytvoření balíčku a přidání do Fedora repositářů
- Cachování jednotlivých požadavků na straně serveru, tak abychom neřešily závislosti vícekrát.
- Zapojení do fedora-infrastructure
- RDS projekt může být použit při tvorbě composů či Docker image souborů