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ů